C# 如何向com接口中的方法发送字符串?

C# 如何向com接口中的方法发送字符串?,c#,c++,com-interop,C#,C++,Com Interop,其中cpi是指向com接口对象的指针。 多播是一种接受字符串参数的c#方法。 当我打印多播接收到的message.length时,它只是说2,而不是24 cvector3d参考 cpi->Multicast(sendBuf)有什么问题 --编辑--我需要将sendBuf转换为我认为 我转换为_bstr\t,但message.length仍然显示为2而不是24 我曾经 cVector3d newPosition = tool->getDeviceGlobalPos(); ch

其中cpi是指向com接口对象的指针。 多播是一种接受字符串参数的c#方法。 当我打印多播接收到的message.length时,它只是说2,而不是24

cvector3d参考

cpi->Multicast(sendBuf)有什么问题

--编辑--我需要将sendBuf转换为我认为

我转换为_bstr\t,但message.length仍然显示为2而不是24

我曾经

    cVector3d newPosition = tool->getDeviceGlobalPos();
    char sendBuf[sizeof(double)*3 + 1];
    int sendBufLen = sizeof(double)*3 + 1;

     memset( (void *)&sendBuf, '\0', sizeof(sendBuf));
    memcpy(&sendBuf, &newPosition[0], sendBufLen -1);
我猜bstr是损坏的,因为当我调试时,我在
bstr->m_data->m_str


----编辑---- 我转换成什么 “1234567890121378901234”

bstrt有“1234567890121378901234”

但是当我的程序需要的sendBuf中有奇怪的字符,比如sendBuf[14]=
“16'ð'”
时,bstr不会从sendBuf中获取这些值


为什么?

如您的编辑所示,请签出

你不能让它工作。您正在将二进制数据复制到字符串中。在.NET端,char[]被封送为.NET字符串,这是通过应用系统默认语言环境转换的char[]的utf-16编码版本。这会更改字符值。还有,复制到char[]中的字节可能包含零,它在C字符串中充当字符串终止符


您需要重写C版本,改为使用字节[]。在C端,您需要创建一个SAFEARRAY来匹配该参数。使用SafeArrayCreate()创建它。

@user494461值得注意的是(这可能相关,也可能无关),您的字符缓冲区不是以零结尾的。它需要是
sizeof(double)*3
+1。在调用
memcpy
之前,建议您
memset
将该缓冲区设置为0。我将c#code更改为接受byte[],但在cpp中如何从char获取字节数组,我有些不知所措*
_bstr_t bstrt(sendBuf);
char sendBuf[sizeof(double)*3 + 1];
memcpy(&sendBuf, "123456789012345678901234", sendBufLen -1);
_bstr_t bstrt(sendBuf);
_bstr_t bstrt(sendBuf);
cpi->Multicast(bstrt);