2011-01-29 102 views
0

我打電話從VC++客戶VB COM組件功能傳遞給VB COM組件,如何變體陣列從VC++

此功能期待VARIANT陣列,

HRESULT setLabels(/ [IN,OUT]/VARIANT *標記)

我試圖傳遞變量數組通過以下方式,

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); 
} 

在該兩種方式如所期望的VB分量不起作用。由於我沒有VB組件的來源,我不知道里面發生了什麼,當我從VB客戶端訪問它的工作正常時,相同的組件。

如何將變量數組從VC++傳遞給VB組件?

回答

0

我想知道「VARIANT ARRAY」是什麼意思。它是VARIANT類型的數組,還是參數本身是VARIANT類型的,而數組可以是另一種類型?

在這兩種情況下,含有SAFEARRAY的VARTYPE所述變體應被指定爲按位或VT_ARRAY和它包含的實際類型的,在原始代碼中應該是:

TEMPaRRAY.vt = VT_ARRAY | VT_BSTR; 

如果它是的確VARIANT數組,你應該創建您的安全數組包含VARIANT

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

,用含VARIANT 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); 

另外我看到你錯過了TEMPaRRAY的類型聲明。由於你的代碼工作,這可能只是一個錯字。

+0

是的VARIANT ARRAY是VARIANT類型的數組,也是我錯過了TEMPARRAY的類型,現在我編輯了。 – 2011-11-17 11:49:43