4

这很可能有一个非常简单的答案,但我无法弄清楚。

我正在尝试重构一些看起来像这样的代码:

SAFEARRAY* psa;
long* count;
HRESULT hr = pSomeInterface->ListSomething(&psa, &count);
if (SUCCEEDED(hr))
{
    CComSafeArray<BSTR> sa;
    if (*count > 0)
    {
        sa.Attach(psa);
    }
}

// perform operations on sa
// allow CComSafeArray to destroy the object

return hr;

我想将代码更改为:

CComSafeArray<BSTR> sa;
long* count;
hr = pSomeInterface->ListSomething(&(sa.m_psa), &count);

if (SUCCEEDED(hr))
{
    // perform operations on sa
}

但是当我执行这个时, sa 包含垃圾。发生了什么,为什么?什么是正确的语法?

4

3 回答 3

1

我在您的代码中没有看到任何此类问题。如果您可以分享 ListSomething(..) 方法的代码,那么我们也许可以找到一些东西,但是像这样的类似代码非常适合我。

void MyMethod(SAFEARRAY** pArray)
{
    int i = (*pArray)->cbElements;
    return;
}

CComSafeArray&lt;BSTR&gt; myArray;
myArray.Add(CComBSTR(_T("Test")));
myArray.Add(CComBSTR(_T("Best")));
myArray.Add(CComBSTR(_T("Rest")));
MyMethod(&(myArray.m_psa));
于 2009-01-15T06:53:08.550 回答
1

你应该使用CComSafeArray<T>::GetSafeArrayPtr(). 但是Aamir的使用方式也&(sa.m_psa)应该有效。

于 2009-11-22T10:29:34.610 回答
-1

You're defeating the whole point of using CComSafeArray by effectively bypassing it and accessing its internal SAFEARRAY directly. CComSafeArray has an explicit LPSAFEARRAY operator defined, so you should be able to do this instead:

CComSafeArray<BSTR> sa;
long* count;
HRESULT hr = pSomeInterface->ListSomething(&sa, &count);
if (SUCCEEDED(hr))
{    
    // perform operations on sa
}
于 2009-01-15T10:16:40.463 回答