0

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

4

1 回答 1

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

于 2011-01-31T10:05:15.963 回答