2009-10-19 141 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