0

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

CComBSTR bstr = str;

这有以下问题:

  • 有时这条线会因内存不足消息而失败
  • 当我将 bstr 传递给 COM 类时,它会占用大量内存(远远超过字符串大小),因此它可能会因内存不足而失败

问题:

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

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

4

3 回答 3

3

如果一个方法期望BSTR通过 aBSTR是唯一正确的方法。

要转换char*BSTR您使用MultiByteToWideChar()Win32 API 函数进行转换和SysAllocStringLen()内存分配。你无法解决这个问题——你需要SysAllocStringLen()分配内存,否则如果 COM 服务器调用SysStringLen().

当您使用CComBSTR并为其分配 achar*时,将运行相同的序列 - ATL 可用作标题,您可以享受阅读它以了解它是如何工作的。所以实际上CComBSTR确实是最小的必要操作集。

当您将 a 传递BSTR给一个 COM 服务器CComBSTR::operator BSTR() const时,它只返回一个指向包装的指针BSTR-BSTR不会复制正文。接下来发生的任何事情都取决于 COM 服务器或正在使用的互操作 - 他们自己决定是要复制BSTR正文还是直接读取它。

解决内存中断的唯一办法是更改 COM 接口,使其接受一些读取器并通过该读取器请求数据块。

于 2009-10-20T05:17:14.920 回答
1

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


您可以将 char* 包装在Stream接口中,而不是传递 BSTR,.NET 服务器应该得到 aStream而不是字符串。

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

于 2009-10-19T15:37:07.447 回答
0

CComBSTR 是围绕 BSTR 的包装器,而 BSTR 又是带有特殊终止符的 Unicode 字符串。

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

一般来说,使用 CComBSTR 是一个好主意,因为析构函数会为您释放与 BSTR 关联的内存。

于 2009-10-19T15:35:41.757 回答