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

ここで「VARIANTARRAY」とはどういう意味なのかしら。それはVARIANT型の配列ですか、それともパラメーター自体がVARIANT型であり、配列は別の型である可能性がありますか?

どちらの場合も、SAFEARRAYのVARTYPEを含むバリアントは、ビット単位またはVT_ARRAYとそれに含まれる実際の型として指定する必要があり、元のコードでは次のようになります。

TEMPaRRAY.vt = VT_ARRAY | VT_BSTR;

それが実際にVARIANTの配列である場合は、VARIANTを含むSafeArrayを作成する必要があります

*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 に答える