2009-01-15 101 views
4

這很可能有一個非常簡單的答案,但我無法弄清楚。將CComSafeArray傳遞給期望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 
} 

但是,當我執行此山中含有垃圾。發生了什麼,爲什麼?什麼是正確的語法?

回答

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

通過有效地繞過它並直接訪問其內部SAFEARRAY,您正在破壞使用CComSafeArray的整個觀點。 CComSafeArray定義了一個明確的LPSAFEARRAY運營商,所以你應該能夠做到這一點,而不是:

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

你的回答幾乎是正確的,但隱式轉換不能與`sa`參數上的引用運算符一起使用。 – 2012-02-03 17:52:30

相關問題