2009-01-15 5 views
4

Cela a très probablement une réponse très simple, mais je ne peux pas le comprendre.Quelle est la syntaxe correcte lors du passage de CComSafeArray à une méthode qui attend SAFEARRAY **

Je suis en train de revoir la conception du code qui ressemble à ceci:

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; 

Je voudrais changer le code à quelque chose comme:

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

if (SUCCEEDED(hr)) 
{ 
    // perform operations on sa 
} 

Mais quand j'exécute ce, sa contient des ordures. Qu'est-ce qui se passe et pourquoi? Quelle est la syntaxe correcte?

Répondre

1

Je ne vois pas un tel problème dans votre code. Si vous pouvez partager le code de la méthode ListSomething (..), alors nous pourrions peut-être trouver quelque chose mais un code similaire à celui-ci fonctionne parfaitement avec moi.

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

Vous êtes défaisant le point entier d'utiliser CComSafeArray en contournant efficacement et d'accéder à son SAFEARRAY interne directement. CComSafeArray a un opérateur LPSAFEARRAY explicite défini, vous devriez donc être en mesure de le faire à la place:

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

Votre réponse est presque correcte, mais la conversion implicite ne fonctionne pas avec l'opérateur de référence sur l'argument 'sa'. –

1

Vous devez utiliser CComSafeArray<T>::GetSafeArrayPtr(). Cependant, la façon dont Aamir utilise &(sa.m_psa) devrait également fonctionner.

Questions connexes