2009-10-19 81 views
0

我有一个很长的字符串“const char * str”。 我需要将它从一个cpp客户端传递给一个.net COM方法,该方法需要BSTR类型。 目前我使用:CComBSTR内存分配

CComBSTR bstr = str; 

这有以下问题:

  • 有时这条线失败,内存不足的消息
  • 当我通过BSTR到COM类需要花费大量的内存(比字符串大小得多),所以它可能会失败,内存不足

问题:

  • 我明智地转换为CComBSTR吗?例如有没有办法使用堆或东西
  • 是否更好地使用BSTR来代替?

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

回答

3

如果一种方法预计BSTR通过BSTR是唯一正确的方法。

要将char*转换为BSTR,请使用MultiByteToWideChar() Win32 API函数进行转换,使用SysAllocStringLen()进行内存分配。你无法解决这个问题 - 你需要SysAllocStringLen()来分配内存,否则如果COM服务器调用SysStringLen()将会失败。

当您使用CComBSTR并将char*分配给它时,将运行相同的序列 - ATL可用作标题,您可以阅读它以查看它是如何工作的。所以实际上CComBSTR只是做了一小部分必要的操作。

当你传递一个BSTR COM服务器CComBSTR::operator BSTR() const被称为,仅仅返回一个指向包裹BSTR - 在BSTR体不被复制。接下来发生的任何事情都取决于COM服务器或正在使用的互操作性 - 他们自己决定是否要复制BSTR正文或直接阅读它。

解决内存中断的唯一办法是更改COM接口,以便它接受某个阅读器并通过该阅读器以块的形式请求数据。

0

一个的CComBSTR是围绕这又是数Unicode字符串具有特殊终止BSTR的包装。

因此,您希望它大约是相应char *形式(主要使用单字节字符的字符集)的两倍大小。

使用CComBSTR通常是一个好主意,因为析构函数会释放与BSTR相关的内存。

+0

问题是更多的值传递给COM对象,是否有更多的隐式重复到BSTR在那里做? – 2009-10-19 15:43:49

1

它是一个进程内COM服务器你有它的代码或它是第三方?因为您可以将实际的char *指针传递给COM服务器,并且不支付allocate + copy + free的价格。您将需要添加一个新的方法/属性,该方法/属性仅可用于C++客户端。


不是传递BSTR你可以用你的char *在Stream接口,在.NET服务器应该得到Stream而不是字符串。

在C++端实现一个支持IStream COM接口的COM类,该类是包装char *的只读流,您可以将此类作为UCOMIStream接口传递给.NET服务器。
在.NET端使用UCOMIStream方法来读取字符串,注意不要一次读取整个流。

+0

我该怎么做?签名显示我需要通过BSTR。 – 2009-10-19 15:43:00

+0

我修改了我的答案,清楚了我的想法。 – 2009-10-19 15:51:16

+0

服务器是在.Net和客户端cpp – 2009-10-19 15:52:19