我是COM新手。究竟什麼是替代的優勢:爲什麼使用CComBSTR而不是傳遞WCHAR *?
L"String"
與
CComBSTR(L"String")
我可以看到一個變更在所有字符串都以這種方式取代了我的.NET應用程序的COM部分。想知道這是什麼需要。
我是COM新手。究竟什麼是替代的優勢:爲什麼使用CComBSTR而不是傳遞WCHAR *?
L"String"
與
CComBSTR(L"String")
我可以看到一個變更在所有字符串都以這種方式取代了我的.NET應用程序的COM部分。想知道這是什麼需要。
您可以將L「Something」傳遞給聲明爲期望BSTR的COM方法,但您絕不應該這樣做。
約定是使用SysAllocString()系列函數之一分配一個BSTR,任何接收BSTR的人都可以(也應該)在需要查找字符串長度時調用SysStringLen()。 SysStringLen()依賴於分配了SysAllocString()系列函數的BSTR(因爲它使用額外的數據分配並由這些函數初始化),並且如果違反該要求,程序將運行爲未定義的行爲。
使用SysAllocString()直接需要調用SysFreeString()來釋放字符串(否則內存泄漏),因此會導致大量代碼並可能導致錯誤。更好的方法是使用包裝類(如CComBSTR或_bstr_t)來管理BSTR - 它們將在必要時調用SysAllocString()/ SysFreeString()(當然,除非您濫用它們)。
BSTR
與WCHAR[]
不一樣。 BSTR
值以它們的長度爲前綴,以及以null結尾。
如果您正在處理使用C或C++編寫的進程內對象,那麼您通常會忽略這一點,因爲C/C++代碼可能會假設您的BSTR是一個以空字符結尾的寬字符串。
另一方面,如果您正在處理進程外/跨機器對象,則代理/存根編組代碼將假定您確實通過了BSTR,並且期望找到一個長度字段(它需要知道要編組多少數據)。這將會出現可怕的錯誤。
總之:如果某些東西需要BSTR,請調用SysAllocString(或CComBSTR或CString :: AllocSysString)。