2009-11-16 20 views
1

我是COM新手。究竟什麼是替代的優勢:爲什麼使用CComBSTR而不是傳遞WCHAR *?

L"String" 

CComBSTR(L"String") 

我可以看到一個變更在所有字符串都以這種方式取代了我的.NET應用程序的COM部分。想知道這是什麼需要。

回答

0

您可以將L「Something」傳遞給聲明爲期望BSTR的COM方法,但您絕不應該這樣做。

約定是使用SysAllocString()系列函數之一分配一個BSTR,任何接收BSTR的人都可以(也應該)在需要查找字符串長度時調用SysStringLen()。 SysStringLen()依賴於分配了SysAllocString()系列函數的BSTR(因爲它使用額外的數據分配並由這些函數初始化),並且如果違反該要求,程序將運行爲未定義的行爲。

使用SysAllocString()直接需要調用SysFreeString()來釋放字符串(否則內存泄漏),因此會導致大量代碼並可能導致錯誤。更好的方法是使用包裝類(如CComBSTR或_bstr_t)來管理BSTR - 它們將在必要時調用SysAllocString()/ SysFreeString()(當然,除非您濫用它們)。

3

BSTRWCHAR[]不一樣。 BSTR值以它們的長度爲前綴,以及以null結尾。

如果您正在處理使用C或C++編寫的進程內對象,那麼您通常會忽略這一點,因爲C/C++代碼可能會假設您的BSTR是一個以空字符結尾的寬字符串。

另一方面,如果您正在處理進程外/跨機器對象,則代理/存根編組代碼將假定您確實通過了BSTR,並且期望找到一個長度字段(它需要知道要編組多少數據)。這將會出現可怕的錯誤。

總之:如果某些東西需要BSTR,請調用SysAllocString(或CComBSTR或CString :: AllocSysString)。

相關問題