名稱解釋
ATL 類 CComBSTR 提供對 BSTR數據類型的包裝。
標準BSTR是一個有長度前綴和null結束符的OLECHAR數組。BSTR的前4位元組是一個表示字元串長度的前綴。BSTR長度域的值是字元串的位元組數,並且不包括0結束符。
附註
CComBSTR 類提供了一大批帶 ANSI 或 Unicode 字元串作為參數的成員函式 (構造函式、 賦值運算符和比較運算符)。這些函式的 ANSI 版本比 Unicode版本 效率較低,因為臨時 Unicode 字元串通常內部創建。為了提高效率,儘可能使用 Unicode 版本。
注意事項
轉換問題
雖然一些 CComBSTR 方法自動將 ANSI 字元串參數轉換為 Unicode,但這些方法總是返回 Unicode 格式的字元串。若要將輸出字元串轉換回 ANSI,請使用 ATL 轉換類。有關 ATL 轉換類的更多信息,請參見 ATL 和 MFC 字元串轉換宏。
範圍問題
與任何功能完善的類一樣, CComBSTR 在超出範圍時將釋放其資源。如果函式返回指向 CComBSTR 字元串的指針,這會引起問題,因為指針將引用已經釋放的記憶體。在這種情況下,請使用 Copy 方法,如下所示。
顯式釋放 CComBSTR 對象
在對象超出範圍之前,可以顯式釋放包含在 CComBSTR 對象中的字元串。如果字元串被釋放,則 CComBSTR 對象無效。
在循環中使用 CComBSTR 對象
在 CComBSTR 類分配緩衝區來執行某些運算時,如 += 運算符或 Append 方法,建議不要在緊密型循環內執行字元串操作。在這種情況下, CStringT 可提供更好的性能。
記憶體泄漏問題
將已初始化的 CComBSTR 的地址作為 [out] 參數傳遞到函式會導致記憶體泄漏。
在下面的示例中,在函式 OutString 替換為了保存字元串 "Initialized" 而分配的字元串時,該字元串被泄漏。
CComBSTR bstrLeak(L"Initialized");
HRESULT hr = OutString(&bstrLeak);
若要避免泄漏,請在作為 [out] 參數傳遞地址之前,對現有的 CComBSTR 對象調用 Empty 方法。
請注意,如果函式的參數是 [in, out],則同樣的代碼將不會導致泄漏。