最近工作需要,要使用C#调用MFC编写的Activex控件。在封装控件时部分接口需要传递BSTR数组,在网上找到一些资料可以将接口参数设置为VARIANT*的形式并封装SAFEARRAY来传递BSTR。这种方式经过尝试可以作为OUT参数来使用,但是做为输入参数则在Activex接口中将得到的VARIANT中的VT参数是不正确的(乱数)。以下代码是一个out BSTR的ARRAY测试可用。希望大侠能指导我完成IN BSTR的ARRAY的使用
VARIANT_BOOL CIDPActivexSDKCtrl::M_IDPClipGetExports(VARIANT &hClip, VARIANT* pvExport)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加调度处理程序代码
CStringArray arExport;
BOOL bRet = FALSE;
bRet = IDPClipGetExports((HANDLE)hClip.ullVal, arExport);
if (!bRet)
return VARIANT_FALSE;
SAFEARRAY *psa = CStringArray2SafeArray(arExport);
pvExport->vt = VT_ARRAY | VT_BSTR;
pvExport->parray = psa;
return VARIANT_TRUE;
}
SAFEARRAY* CIDPActivexSDKCtrl::CStringArray2SafeArray(const CStringArray& arExport)
{
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound;
rgsabound.cElements = (ULONG)arExport.GetCount();
rgsabound.lLbound = 0;
psa = SafeArrayCreate(VT_BSTR, 1, &rgsabound);//设置为一位BSTR数组
BSTR* bstrArray;
::SafeArrayAccessData(psa, (void**)&bstrArray);//将数据引出进行操作,并加锁
for (INT_PTR i = 0 ; i < arExport.GetCount(); ++i)
{
bstrArray[i] = arExport[i].AllocSysString();
}
::SafeArrayUnaccessData(psa);
// //逐个释放
// for (INT_PTR i = 0 ; i < arExport.GetCount(); ++i)
// {
// SysFreeString(bstrArray[i]);
// }
return psa;
}
------解决方案--------------------