将CComSafeArray传递给需要SAFEARRAY的方法时,正确的语法是什么**

将CComSafeArray传递给需要SAFEARRAY的方法时,正确的语法是什么**,com,safearray,Com,Safearray,这很可能有一个非常简单的答案,但我想不出来 我正在尝试重构一些代码,如下所示: SAFEARRAY* psa; long* count; HRESULT hr = pSomeInterface->ListSomething(&psa, &count); if (SUCCEEDED(hr)) { CComSafeArray<BSTR> sa; if (*count > 0) { sa.Attach(psa);

这很可能有一个非常简单的答案,但我想不出来

我正在尝试重构一些代码,如下所示:

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;
SAFEARRAY*psa;
长*计数;
HRESULT hr=pSomeInterface->ListSomething(&psa,&count);
如果(成功(hr))
{
库姆萨雷;
如果(*计数>0)
{
附加(psa);
}
}
//在sa上执行操作
//允许光线破坏对象
返回人力资源;
我想将代码更改为:

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

if (SUCCEEDED(hr))
{
    // perform operations on sa
}
ccomsa;
长*计数;
hr=pSomeInterface->ListSomething(&(sa.m_psa),&count);
如果(成功(hr))
{
//在sa上执行操作
}

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

我在您的代码中没有看到任何这样的问题。如果您可以共享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));

通过有效地绕过它并直接访问其内部SAFEARRAY,您正在挫败使用CComSafeArray的全部意义。CComSafeArray定义了一个显式LPSAFEARRAY运算符,因此您应该能够执行以下操作:

CComSafeArray<BSTR> sa;
long* count;
HRESULT hr = pSomeInterface->ListSomething(&sa, &count);
if (SUCCEEDED(hr))
{    
    // perform operations on sa
}
ccomsa;
长*计数;
HRESULT hr=pSomeInterface->ListSomething(&sa,&count);
如果(成功(hr))
{    
//在sa上执行操作
}

您应该使用
CComSafeArray::
。但是,使用
&(sa.m_psa)
的方法也应该有效。

您的答案几乎正确,但是隐式转换不适用于
sa
参数上的引用运算符。