3

我有以下问题考虑以下 C++ 代码片段

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

问题是:在 wcscmp 函数中使用 CComBSTR 而不进行强制转换是否安全?

正如我从 MSDN 知道的那样,CComBSTR 没有显式转换运算符(而 _bstr_t 存在)提前谢谢

4

3 回答 3

6

从技术上讲不是,一个BSTR罐头店L"str2\0foo"。这将wcscmp()决定匹配,您还必须比较字符串长度以避免这种故障模式。

CComBSTR覆盖做正确事情的 operator==() ,不妨使用它:

CComBSTR bs1=L"str1";
if (bs1 == L"str2"))
{ 
    // etc..
}
于 2012-07-19T12:34:25.750 回答
4

依靠自动转换 from CComBSTRto是安全const WCHAR*的,唯一的例外NULL是 的有效值BSTR,并且NULL参数不是wcscmp 导致运行时调用无效参数处理程序的有效参数。

只要您确定您的BSTR原始/包装值是非 NULL 的,您就可以安全地进行转换。

正如其他人指出的那样,请注意作为终止符WCHAR*字符串的嵌入零字符,但是由于存在显式字符串长度(在值前缀中),它可能是 BSTR 有效负载的一部分。

仅供参考,这CComBSTRoperator ==在内部使用VarBstrCmpAPI 进行比较。

于 2012-07-19T12:58:58.780 回答
1

是的,除了以长度为前缀之外,BSTR 还以空结尾,并且存在从 CComBSTR 到 BSTR 的转换(通过m_str成员)。

因此,您可以使用wcscmp(bs1, L"str2")wcscmp(bs1.m_str, L"str2"),它们是等效的。

但是,BSTR 可能会嵌入空字符,请注意。如果字符串仅等于第一个空字符,则使用wcscmp(bstr1, bstr2)可能无法满足您的要求。

于 2012-07-19T12:10:49.257 回答