Как передать вариантный массив в компонент VB Com из VC ++ - PullRequest
0 голосов
/ 29 января 2011

Я вызываю функцию компонента 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, работает нормально.

Как передать вариантный массив в компонент VB из VC ++?

1 Ответ

0 голосов
/ 31 января 2011

Интересно, что здесь означает «VARIANT ARRAY».Это массив типа VARIANT или сам параметр имеет тип VARIANT, а массив может быть другого типа?

В обоих случаях вариант, содержащий VARTYPE SAFEARRAY, должен быть указан как побитовый илиVT_ARRAY и фактического типа, который он содержит, в исходном коде это должно быть:

TEMPaRRAY.vt = VT_ARRAY | VT_BSTR;

Если это действительно массив VARIANT, вы должны создать свой SafeArray, содержащий 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.Так как ваш код работает, это может быть только опечатка.

...