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 コンポーネントに渡す方法は?