有一个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)。并且传入传出能够转换回来。

解决方案 »

  1.   

    BSTR可以阿,直接用Win32 API转化
      

  2.   

    有没有具体的代码例子,因为我发现把BSTR转换成时对于这种有\0的好象是乱码。
      

  3.   

    没有人遇到过吗?就是在自动化EXE的COM中传送byte,其中带有\0。
      

  4.   

    看样子还是要自己摆定了。总算是搞出来了,就写在这让后面的人可以参考一下。
     
    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即可,最后释放掉。
     上面的代码可以在自动化接口中传输二进制数据。