我有一个很长的字符串“ 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/