我有以下问题 请考虑遵循C ++代码段
CComBSTR bs1=L"str1";
if (wcscmp(bs1,L"str2"))
{
....
}
问题是:在没有强制转换的情况下在wcscmp函数中使用CComBSTR是否安全?
据我所知,MSDN没有针对CComBSTR的显式强制转换运算符(对于_bstr_t存在) 提前致谢
答案 0 :(得分:6)
技术上不行,BSTR
可以存储L"str2\0foo"
。这将使wcscmp()
决定匹配,您还必须比较字符串长度以避免此失败模式。
CComBSTR
会覆盖operator ==()做出正确的事情,也可以使用它:
CComBSTR bs1=L"str1";
if (bs1 == L"str2"))
{
// etc..
}
答案 1 :(得分:4)
依靠从CComBSTR
到const WCHAR*
的自动投放是安全的,唯一的例外是NULL
是BSTR
的有效值,NULL
参数不是运行时wcscmp
causing invalid parameter handler to be called的有效参数。
只要你确定你的BSTR
值raw / wrapped是非NULL,你就可以安全地进行投射。
正如其他人所指出的,请注意嵌入的零字符,它们是终结符WCHAR*
字符串,但由于存在显式字符串长度(在值前缀中),因此可能是BSTR有效负载的一部分。
仅供参考,CComBSTR
operator ==
使用VarBstrCmp
API在内部进行比较。
答案 2 :(得分:1)
是的,除了长度前缀之外,BSTR还为空终止,there is a conversion from CComBSTR to BSTR(通过m_str
成员)。
因此,您可以使用等效的wcscmp(bs1, L"str2")
或wcscmp(bs1.m_str, L"str2")
。
但是,BSTR可能会嵌入空字符,请注意。如果字符串仅等于第一个空字符,则使用wcscmp(bstr1, bstr2)
可能无法执行您想要的操作。