我有以下問題 考慮下面的C++代碼片段使用wcscmp函數使用CComBSTR而不投射是否安全?
CComBSTR bs1=L"str1";
if (wcscmp(bs1,L"str2"))
{
....
}
的問題是:它是安全的wcscmp功能使用的CComBSTR而無需進行轉換?
當我從MSDN知道有沒有明確的轉換運營商的CComBSTR(存在_bstr_t同時) 預先感謝
我有以下問題 考慮下面的C++代碼片段使用wcscmp函數使用CComBSTR而不投射是否安全?
CComBSTR bs1=L"str1";
if (wcscmp(bs1,L"str2"))
{
....
}
的問題是:它是安全的wcscmp功能使用的CComBSTR而無需進行轉換?
當我從MSDN知道有沒有明確的轉換運營商的CComBSTR(存在_bstr_t同時) 預先感謝
是,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)
可能無法達到您想要的效果。
技術上不行,BSTR
可以存儲L"str2\0foo"
。這將使wcscmp()
決定匹配,你將不得不比較字符串長度,以避免這種失敗模式。
CComBSTR
重寫==操作符(),還不如用它:
CComBSTR bs1=L"str1";
if (bs1 == L"str2"))
{
// etc..
}
它是安全的依靠來自CComBSTR
自動鑄造const WCHAR*
,唯一的例外是NULL
是有效的BSTR
和NULL
參數的值爲不是運行時爲wcscmp
causing invalid parameter handler to be called的有效參數。
只要您確定您的BSTR
值raw/wrapped是非NULL,您就可以安全地投射。
正如其他人指出的那樣,由於存在明確的字符串長度(在值前綴中),因此要小心嵌入的零字符(它們是終止符WCHAR*
字符串),但可能是BSTR有效負載的一部分。
僅供參考,CComBSTR
的operator ==
在內部使用VarBstrCmp
API進行比較。
+1。這兩種危險是嵌入'L'\ 0''字符和'BSTR(NULL)'「空」字符串。 – MSalters 2012-07-19 16:45:40
難道技術上不是這樣嗎?它不安全,因爲BSTR可以嵌入空字符? – 2012-07-19 12:36:41
@ 0A0D:如果你知道你沒有將空字符嵌入到BSTR中(這在某些情況下是合理的),這是安全的。否則,它是不正確的(但無論如何,這取決於你如何定義「安全」)。正如漢斯所說,更好的是簡單地使用'CComBSTR :: operator =='。 – 2012-07-19 12:38:28