我从VC ++客户端调用VB COM组件函数,
此函数需要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 :(得分:0)
我想知道“VARIANT ARRAY”在这里意味着什么。它是VARIANT类型的数组,还是参数本身是VARIANT类型,而数组可以是另一种类型?
在这两种情况下,包含SAFEARRAY的VARTYPE的变体应该被指定为按位或VT_ARRAY以及它包含的实际类型,在原始代码中它应该是:
TEMPaRRAY.vt = VT_ARRAY | VT_BSTR;
如果它确实是一个VARIANT数组,你应该创建你的SafeArray来包含VARIANT
*saData = SafeArrayCreate( VT_VARIANT, 1, &_SABound);
并使用包含BSTR的VARIANT填充它:
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的类型声明。由于您的代码正在运行,这可能只是一个错字。