Каков правильный синтаксис при передаче CComSafeArray методу, ожидающему SAFEARRAY ** - PullRequest
4 голосов
/ 15 января 2009

Скорее всего, это очень простой ответ, но я не могу понять это.

Я пытаюсь реорганизовать некоторый код, который выглядит следующим образом:

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 ]

1 голос
/ 22 ноября 2009

Вы должны использовать CComSafeArray<T>::GetSafeArrayPtr(). Однако Aamir способ использования &(sa.m_psa) тоже должен работать.

1 голос
/ 15 января 2009

Я не вижу такой проблемы в вашем коде. Если вы сможете поделиться кодом метода 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));
0 голосов
/ 15 января 2009

Вы побеждаете весь смысл использования CComSafeArray, эффективно обходя его и получая прямой доступ к его внутреннему SAFEARRAY. В CComSafeArray определен явный оператор LPSAFEARRAY, поэтому вы должны иметь возможность сделать это вместо этого:

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