当前位置: 代码迷 >> VC >> 关于在C#中调用MFC编写Activex控件中传入字符串数组的有关问题
  详细解决方案

关于在C#中调用MFC编写Activex控件中传入字符串数组的有关问题

热度:430   发布时间:2016-05-05 00:13:05.0
关于在C#中调用MFC编写Activex控件中传入字符串数组的问题
最近工作需要,要使用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;
}

------解决方案--------------------
该回复于2013-05-20 07:10:11被版主删除
  相关解决方案