【问题标题】:How to pass variant array to VB Com component from VC++如何从 VC++ 将变量数组传递给 VB Com 组件
【发布时间】:2011-11-17 19:48:13
【问题描述】:

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

【问题讨论】:

    标签: visual-c++ vb6 variant


    【解决方案1】:

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

    【讨论】:

    • 是的 VARIANT ARRAY 是一个 VARIANT 类型的数组,我也错过了 TEMPARRAY 的类型,我现在编辑了。
    猜你喜欢
    • 2012-05-15
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 2017-05-30
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多