首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VC >

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

2013-06-19 
关于在C#中调用MFC编写Activex控件中传入字符串数组的问题最近工作需要,要使用C#调用MFC编写的Activex控件

关于在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被版主删除

热点排行