【问题标题】:how to send a string to a method in com interface?如何将字符串发送到 com 接口中的方法?
【发布时间】:2012-03-29 17:41:03
【问题描述】:
    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);

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

cvector3d 参考http://www.chai3d.org/doc/structc_vector3d.html

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

--edit-- 我认为我需要将sendBuf转换为_bstr_t

我转换为 _bstr_t 但 message.length 仍然显示 2 而不是 24?

我用过

_bstr_t bstrt(sendBuf);

我猜 bstr 已损坏,因为我在调试时在 bstr->m_data->m_str 中看到了 BAD PTR


----编辑---- 当我转换 “123456789012378901234”

char sendBuf[sizeof(double)*3 + 1];
memcpy(&sendBuf, "123456789012345678901234", sendBufLen -1);
_bstr_t bstrt(sendBuf);

bstrt 有“123456789012378901234”

但是当我在 sendBuf 中有奇怪的字符时,例如。 sendBuf[14] = "16 'ð' " 我的程序需要的 bstr 没有从 sendBuf 获取这些值

为什么?

【问题讨论】:

    标签: c# c++ com-interop


    【解决方案1】:

    您无法完成这项工作。您正在将二进制数据复制到字符串中。在 .NET 方面,char[] 被编组为 .NET 字符串,即 char[] 的 utf-16 编码版本,通过应用系统默认语言环境进行转换。其中更改 char 值。此外,您复制到 char[] 中的字节可能包含零,它在 C 字符串中充当字符串终止符。

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

    【讨论】:

    • 我将 c# 代码更改为接受 byte[],但我有点迷失在 cpp 中从 char* 获取字节数组的操作
    【解决方案2】:
    _bstr_t bstrt(sendBuf);
    cpi->Multicast(bstrt);
    

    【讨论】:

      【解决方案3】:

      如您的编辑所示,请查看_bstr_t

      【讨论】:

      • @user494461 值得注意的是(这可能相关也可能不相关),您的字符缓冲区不是以零结尾的。它必须是sizeof(double)*3 + 1。建议您在memcpy 调用之前将memset 缓冲区设置为0。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 1970-01-01
      相关资源
      最近更新 更多