有一个EXE的COM组件,它的接口继承于IDispatch,现在想在其中一个接口函数中传入一个字符串,但是该字符串可能包含有多个结束符'\0',例如
“test\0test\0test\0\0test”。
如果当作BSTR来传送的话,现在的处理是这样的:
在客户端:
BSTR l_bstrTemp = SysAllocStringLen("test\0test\0\0test", 长度);在COM组件里面使用_com_util::ConvertBSTRToString(BSTR)转换和OLE2A转换,但是好象传入COM组件里面的BSTR参数是对的,转换后却成了乱码。或者哪位能够通过其他方法传入有结束符的一串二进制字符流进入COM组件(继承于IDispatch的,自动化的不支持传入byte)。并且传入传出能够转换回来。
“test\0test\0test\0\0test”。
如果当作BSTR来传送的话,现在的处理是这样的:
在客户端:
BSTR l_bstrTemp = SysAllocStringLen("test\0test\0\0test", 长度);在COM组件里面使用_com_util::ConvertBSTRToString(BSTR)转换和OLE2A转换,但是好象传入COM组件里面的BSTR参数是对的,转换后却成了乱码。或者哪位能够通过其他方法传入有结束符的一串二进制字符流进入COM组件(继承于IDispatch的,自动化的不支持传入byte)。并且传入传出能够转换回来。
IDL语言定义为
HRESULT hrVariant([in]VARIANT p_varData),想将"test\0test\0\0\0\0\0test\0test"传入到EXE中去。
在客户端的代码为:
byte l_byte[] = "test\0test\0\0\0\0\0test\0test";
VARIANT var;
VariantInit(&var);
//set up safearray
SAFEARRAY *psa;
// create a safe array to store the stream data
psa = SafeArrayCreateVector( VT_UI1, 0, sizeof(l_byte) );
// pointer to byte array
unsigned char *pData = NULL;
// get a pointer to the safe array. Locks the array.
SafeArrayAccessData( psa, (void**)&pData );
// copy the memory file into the safearray
memcpy( pData, l_byte, sizeof(l_byte));
var.vt = VT_ARRAY;
var.parray = psa;
// unlock access to safearray
SafeArrayUnaccessData(psa);
g_pILog->hrLogVariant(var);// 调用COM接口函数
SafeArrayDestroyData(psa);
COM的EXE端处理:
// 传入内容必须为一维的SAFEARRAY,并且长度非0
if( (1 != SafeArrayGetDim(p_varData.parray)) || (0 == p_varData.parray->rgsabound[0].cElements) )
{
return -1;
}
// pointer to byte array
BYTE *l_pLogData = new BYTE[p_varData.parray->rgsabound[0].cElements];
if (NULL == l_pLogData)
{
return 1;
}
memset(l_pLogData, 0x00, p_varData.parray->rgsabound[0].cElements);
memcpy(l_pLogData, p_varData.parray->pvData, p_varData.parray->rgsabound[0].cElements);
然后使用l_pLogData即可,最后释放掉。
上面的代码可以在自动化接口中传输二进制数据。