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


关于在C#中调用MFC编写Activex控件中传入字符串数组的问题
最近工作需要,要使用C#调用MFC编写的Activex控件。在封装控件时部分接口需要传递BSTR数组,在网上找到一些资料可以将接口参数设置为VARIANT*的形式并封装SAFEARRAY来传递BSTR。这种方式经过尝试可以作为OUT参数来使用,但是做为输入参数则在Activex接口中将得到的VARIANT中的VT参数是不正确的(乱数)。以下代码是一个out BSTR的ARRAY测试可用。希望大侠能指导我完成IN BSTR的ARRAY的使用

VARIANTBOOL CIDPActivexSDKCtrl::MIDPClipGetExports(VARIANT &hClip, VARIANT* pvExport)

{

AFXMANAGESTATE(AfxGetStaticModuleState());


// TODO: 在此添加调度处理程序代码

CStringArray arExport;

BOOL bRet = FALSE;


bRet = IDPClipGetExports((HANDLE)hClip.ullVal, arExport);

if (!bRet)

return VARIANT_FALSE;


SAFEARRAY *psa = CStringArray2SafeArray(arExport);

pvExport->vt = VTARRAY | VTBSTR;

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;

}

C++/VC 程序开发 数组

defuse 12 years, 4 months ago

Your Answer