2011-01-29 103 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