2011-01-29 2 views
0

J'appelle la fonction de composants VB COM du client de VC,Comment passer tableau variant au composant VB Com de VC++

Cette fonction attend tableau VARIANT,

HRESULT setLabels (/ [in, out]/VARIANT * étiquettes)

I essayé passant tableau variant de la manière suivante,

1) 
void SetLabels() 
{ 
    _variant_t arrayOfStrings[] = {"1","2","3","4" }; 
    setLabels(arrayOfStrings); 
} 

2) 

void SetLabels() 
{ 
    SAFEARRAY *pArray; 
    StringArray strArray; 
    strArray.push_back(_T("1,")); 
    strArray.push_back(_T("2,")); 
    strArray.push_back(_T("3,")); 
    strArray.push_back(_T("4,")); 
    ToSafeArray(&pArray, strArray); 

    SAFEARRAY TEMPaRRAY; 
    TEMPaRRAY.vt = VT_ARRAY; 
    TEMPaRRAY.parray = pArray; 

    setLabels(arrayOfStrings); 
} 

void ToSafeArray(SAFEARRAY **saData, const StringArray& strArray) 
{ 

SAFEARRAYBOUND _SABound; 
ATLASSERT(saData); 
    _SABound.lLbound = 0; 
_SABound.cElements = strArray.size(); 
*saData = SafeArrayCreate(VT_BSTR, 1, &_SABound); 
BSTR *pData; 
SafeArrayAccessData(*saData, (void **)&pData); 

for (UINT i=0; i<strArray.size(); ++i) 
     *(pData+i) = SysAllocString(strArray[i].c_str()); 

SafeArrayUnaccessData(*saData); 
} 

dans ce dans les deux sens le composant VB ne fonctionne pas comme on le souhaite. Puisque je n'ai pas de source de composants VB je ne sais pas ce qui se passe à l'intérieur, Le même composant lorsque j'accède depuis le client VB fonctionne très bien. Comment faire passer un tableau variant à un composant VB à partir de VC++?

Répondre

0

Je me demande ce que le "VARIANT ARRAY" signifie ici. Est-ce un tableau de type VARIANT, ou le paramètre lui-même est de type VARIANT alors que le tableau peut être d'un autre type?

Dans les deux cas, la variante contenant le VARTYPE de » SAFEARRAY doit être spécifié comme une opération de bits ou de VT_ARRAY et le type réel qu'il contient, dans le code d'origine, il devrait être:

TEMPaRRAY.vt = VT_ARRAY | VT_BSTR; 

Si elle est en effet, un tableau de VARIANT, vous devez créer votre SafeArray pour contenir VARIANT

*saData = SafeArrayCreate(VT_VARIANT, 1, &_SABound); 

et le remplir avec VARIANT contenant BSTR:

 
VARIANT *pData; 
SafeArrayAccessData(*saData, (void **)&pData); 
for (UINT i=0; i<strArray.size(); ++i) { 
    VAIRANT* p = (VARIANT*) pData+i; 
    p->vt = VT_BSTR; 
    p->bstrVal = SysAllocString(strArray[i].c_str()); 
} 
SafeArrayUnaccessData(*saData); 

Aussi, j'ai vu que vous avez manqué la déclaration de type de TEMPaRRAY. Puisque votre code fonctionne, il se peut que ce soit une faute de frappe.

+0

Oui VARIANT ARRAY est un tableau de type VARIANT et aussi un type manqué pour TEMPARRAY et I editd maintenant. –

Questions connexes