我有以下问题考虑以下 C++ 代码片段
CComBSTR bs1=L"str1";
if (wcscmp(bs1,L"str2"))
{
....
}
问题是:在 wcscmp 函数中使用 CComBSTR 而不进行强制转换是否安全?
正如我从 MSDN 知道的那样,CComBSTR 没有显式转换运算符(而 _bstr_t 存在)提前谢谢
从技术上讲不是,一个BSTR罐头店L"str2\0foo"。这将wcscmp()决定匹配,您还必须比较字符串长度以避免这种故障模式。
CComBSTR覆盖做正确事情的 operator==() ,不妨使用它:
CComBSTR bs1=L"str1";
if (bs1 == L"str2"))
{
// etc..
}
依靠自动转换 from CComBSTRto是安全const WCHAR*的,唯一的例外NULL是 的有效值BSTR,并且NULL参数不是wcscmp 导致运行时调用无效参数处理程序的有效参数。
只要您确定您的BSTR原始/包装值是非 NULL 的,您就可以安全地进行转换。
正如其他人指出的那样,请注意作为终止符WCHAR*字符串的嵌入零字符,但是由于存在显式字符串长度(在值前缀中),它可能是 BSTR 有效负载的一部分。
仅供参考,这CComBSTR是operator ==在内部使用VarBstrCmpAPI 进行比较。
是的,除了以长度为前缀之外,BSTR 还以空结尾,并且存在从 CComBSTR 到 BSTR 的转换(通过m_str成员)。
因此,您可以使用wcscmp(bs1, L"str2")或wcscmp(bs1.m_str, L"str2"),它们是等效的。
但是,BSTR 可能会嵌入空字符,请注意。如果字符串仅等于第一个空字符,则使用wcscmp(bstr1, bstr2)可能无法满足您的要求。