【发布时间】:2010-11-28 15:21:59
【问题描述】:
比较两个 CComBSTR 的正确方法是什么?我尝试使用
bool operator ==(
const CComBSTR& bstrSrc
) const throw( );
但是,即使两个 ComBSTR 相同,它也总是返回 false。它无法正常工作。
我必须先将CComBSTRs 转换为ANSI 字符串,然后再使用strcmp 吗?
谢谢!
-bc
【问题讨论】:
比较两个 CComBSTR 的正确方法是什么?我尝试使用
bool operator ==(
const CComBSTR& bstrSrc
) const throw( );
但是,即使两个 ComBSTR 相同,它也总是返回 false。它无法正常工作。
我必须先将CComBSTRs 转换为ANSI 字符串,然后再使用strcmp 吗?
谢谢!
-bc
【问题讨论】:
您可能应该使用VarBstrCmp。
编辑:这实际上是 CComBSTR::operator== 所做的,因此如果没有进一步的上下文,您的代码可能不正确。
【讨论】:
BSTR(因此也是 CComBSTR)通常是 Unicode 字符串。您可以使用 wcscmp()(或 wcsicmp() 进行不区分大小写的比较)。
请注意,封装的 BSTR 可以为 null,这是空字符串的合法表示,应将其视为特殊情况,否则您的程序可能会遇到未定义的行为(很可能只是崩溃)。
【讨论】:
要正确比较可能包含嵌入空字符的 BSTR 值,您需要使用以下内容:
bool EqualBSTR(const BSTR String1, const BSTR String2, bool IgnoreCase = false)
{
if (String1 == nullptr || String2 == nullptr) {
return false;
}
const size_t MaxCount = std::min(static_cast<size_t>(SysStringLen(String1)), static_cast<size_t>(SysStringLen(String2)));
if (IgnoreCase) {
return _wcsnicmp(String1, String2, MaxCount) == 0;
} else {
return wcsncmp(String1, String2, MaxCount) == 0;
}
}
【讨论】:
BSTRsAreEqual(BSTR bstr1, BSTR bstr2, VARIANT_BOOL* boolptrEqual)
{
CString s1, s2;
s1 = bstr1;
s2 = bstr2;
if (s1 == s2) {
*boolptrEqual = true;
} else {
*boolptrEqual = false;
}
}
【讨论】: