将CComSafeArray传递给期望SAFEARRAY的方法时的正确语法是什么**

时间:2009-01-15 01:05:37

标签: com safearray

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

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

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包含垃圾。发生了什么,为什么?什么是正确的语法?

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分:1)

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

答案 2 :(得分:-1)

通过有效地绕过CComSafeArray并直接访问其内部SAFEARRAY,你正在打败它。 CComSafeArray定义了一个明确的LPSAFEARRAY运算符,所以你应该能够这样做:

CComSafeArray<BSTR> sa;
long* count;
HRESULT hr = pSomeInterface->ListSomething(&sa, &count);
if (SUCCEEDED(hr))
{    
    // perform operations on sa
}