我有一个带有很长字符串的“const char * str”。 我需要将它从cpp客户端传递到期望BSTR类型的.Net COM方法。 目前我使用:
CComBSTR bstr = str;
这有以下问题:
问题:
还欢迎任何其他建议......
答案 0 :(得分:3)
如果方法期望BSTR
传递BSTR
是唯一正确的方法。
要将char*
转换为BSTR
,您可以使用MultiByteToWideChar()
Win32 API函数进行转换,使用SysAllocStringLen()
进行内存分配。您无法解决这个问题 - 您需要SysAllocStringLen()
进行内存分配,否则如果COM服务器调用SysStringLen()
,COM服务器将失败。
当您使用CComBSTR
并为其分配char*
时,运行相同的序列 - ATL可用作标题,您可以阅读它以查看其工作原理。事实上,CComBSTR
确实完成了最小的必要行动。
当您将BSTR
传递给COM服务器CComBSTR::operator BSTR() const
时,只会返回指向已包装BSTR
的指针 - BSTR
正文未被复制。接下来发生的任何事情都取决于COM服务器或正在使用的互操作 - 他们自己决定是要复制BSTR
正文还是直接阅读它。
解决内存中断的唯一选择是更改COM接口,使其接受某些阅读器并通过该阅读器以块的形式请求数据。
答案 1 :(得分:1)
它是一个进程内COM服务器你有它的代码还是第三方?因为你可以将实际的char *指针传递给COM服务器而不支付allocate + copy + free的价格。您将需要添加一个仅适用于C ++客户端的新方法/属性。
除了传递BSTR,您可以将char *包装在Stream
接口中,.NET服务器应该得到Stream
而不是字符串。
在C ++端实现一个支持IStream
COM接口的COM类,这个类是一个包装char *的只读流,你可以把这个类作为UCOMIStream
接口传递给。 NET服务器。
在.NET端使用UCOMIStream
方法读取字符串,注意不要一次读取整个流。
答案 2 :(得分:0)
CComBSTR是BSTR的包装器,而BSTR又是带有特殊终止的Unicode字符串。
因此,您希望它大约是相应char *表单大小的两倍(对于主要使用单字节字符的字符集)。
一般来说,使用CComBSTR是个好主意,因为析构函数会为你释放与BSTR相关的内存。