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

You should use CComSafeArray<T>::GetSafeArrayPtr(). However Aamir's way of using &(sa.m_psa) should work too.

于 2009-11-22T10:29:34.610 に答える
-1

CComSafeArray を効果的にバイパスし、その内部 SAFEARRAY に直接アクセスすることで、CComSafeArray を使用することのポイント全体を無効にしています。CComSafeArray には明示的な LPSAFEARRAY 演算子が定義されているため、代わりにこれを実行できるはずです。

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