在没有强制转换的情况下使用带有wcscmp功能的CComBSTR是否安全?

时间:2012-07-19 12:04:14

标签: c++ com

我有以下问题 请考虑遵循C ++代码段

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

问题是:在没有强制转换的情况下在wcscmp函数中使用CComBSTR是否安全?

据我所知,MSDN没有针对CComBSTR的显式强制转换运算符(对于_bstr_t存在) 提前致谢

3 个答案:

答案 0 :(得分:6)

技术上不行,BSTR可以存储L"str2\0foo"。这将使wcscmp()决定匹配,您还必须比较字符串长度以避免此失败模式。

CComBSTR会覆盖operator ==()做出正确的事情,也可以使用它:

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

答案 1 :(得分:4)

依靠从CComBSTRconst WCHAR*的自动投放是安全的,唯一的例外是NULLBSTR的有效值,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)可能无法执行您想要的操作。