如何从VC ++将变量数组传递给VB Com组件

时间:2011-01-29 11:11:18

标签: visual-c++ vb6 variant

我从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组件?

1 个答案:

答案 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的类型声明。由于您的代码正在运行,这可能只是一个错字。