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

CComBSTR bstr = str;


这有以下问题:


有时此行失败,并显示内存不足消息
当我将bstr传递给COM类时,它将占用大量内存(比字符串大小大得多),因此它可能会因内存不足而失败


问题:


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


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

最佳答案

如果方法期望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接口,以便它接受某些读取器并通过该读取器大块地请求数据。

关于c++ - CComBSTR内存分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1589370/

10-12 20:58