CComBSTR内存分配

时间:2009-10-19 15:28:49

标签: c++ string com out-of-memory

我有一个带有很长字符串的“const char * str”。 我需要将它从cpp客户端传递到期望BSTR类型的.Net COM方法。 目前我使用:

CComBSTR bstr = str;

这有以下问题:

  • 有时此行因内存不足消息而失败
  • 当我将bstr传递给COM类时,它需要大量内存(远远超过字符串大小),因此内存不足会失败

问题:

  • 我明智地转换到CComBSTR吗?例如有没有办法使用堆或其他东西
  • 使用BSTR会更好吗?

还欢迎任何其他建议......

3 个答案:

答案 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相关的内存。