2012-07-19 81 views
3

我有以下問題 考慮下面的C++代碼片段使用wcscmp函數使用CComBSTR而不投射是否安全?

CComBSTR bs1=L"str1"; 
if (wcscmp(bs1,L"str2")) 
{ 
.... 
} 

的問題是:它是安全的wcscmp功能使用的CComBSTR而無需進行轉換?

當我從MSDN知道有沒有明確的轉換運營商的CComBSTR(存在_bstr_t同時) 預先感謝

回答

1

是,BSTRs是空終止除了被長前綴,並there is a conversion from CComBSTR to BSTR(通過m_str成員)。

您可以使用wcscmp(bs1, L"str2")wcscmp(bs1.m_str, L"str2")等效。

但是,BSTR可能會嵌入空字符,請注意。如果字符串只與第一個空字符相同,則使用wcscmp(bstr1, bstr2)可能無法達到您想要的效果。

+0

難道技術上不是這樣嗎?它不安全,因爲BSTR可以嵌入空字符? – 2012-07-19 12:36:41

+0

@ 0A0D:如果你知道你沒有將空字符嵌入到BSTR中(這在某些情況下是合理的),這是安全的。否則,它是不正確的(但無論如何,這取決於你如何定義「安全」)。正如漢斯所說,更好的是簡單地使用'CComBSTR :: operator =='。 – 2012-07-19 12:38:28

6

技術上不行,BSTR可以存儲L"str2\0foo"。這將使wcscmp()決定匹配,你將不得不比較字符串長度,以避免這種失敗模式。

該做正確的事

CComBSTR重寫==操作符(),還不如用它:

CComBSTR bs1=L"str1"; 
if (bs1 == L"str2")) 
{ 
    // etc.. 
} 
4

它是安全的依靠來自CComBSTR自動鑄造const WCHAR*,唯一的例外是NULL是有效的BSTRNULL參數的值爲不是運行時爲wcscmpcausing invalid parameter handler to be called的有效參數。

只要您確定您的BSTR值raw/wrapped是非NULL,您就可以安全地投射。

正如其他人指出的那樣,由於存在明確的字符串長度(在值前綴中),因此要小心嵌入的零字符(它們是終止符WCHAR*字符串),但可能是BSTR有效負載的一部分。

僅供參考,CComBSTRoperator ==在內部使用VarBstrCmp API進行比較。

+0

+1。這兩種危險是嵌入'L'\ 0''字符和'BSTR(NULL)'「空」字符串。 – MSalters 2012-07-19 16:45:40

相關問題