【问题标题】:How to compare two BSTRs or CComBSTRs?如何比较两个 BSTR 或 CComBSTR?
【发布时间】:2010-11-28 15:21:59
【问题描述】:

比较两个 CComBSTR 的正确方法是什么?我尝试使用

 bool operator ==(
     const CComBSTR& bstrSrc 
 ) const throw( );

但是,即使两个 ComBSTR 相同,它也总是返回 false。它无法正常工作。

我必须先将CComBSTRs 转换为ANSI 字符串,然后再使用strcmp 吗?

谢谢!

-bc

【问题讨论】:

    标签: c++ com atl


    【解决方案1】:

    您可能应该使用VarBstrCmp

    编辑:这实际上是 CComBSTR::operator== 所做的,因此如果没有进一步的上下文,您的代码可能不正确。

    【讨论】:

    • VarBstrCmp 也不起作用。它返回 HRESULT 0x00000002 系统找不到指定的文件。我的代码是这样的: CComBSTR m_bstrUrl; ...... HRESULT hr = ::VarBstrCmp( (BSTR)m_bstrUrl, pvURL->bstrVal, ::GetThreadLocale(), 0 );
    • m_bstrUrl 的类型是什么?为什么必须将其转换为 BSTR?
    • 阅读 MSDN 关于返回结果的说明。数据类型是 HRESULT,但含义不是 HRESULT 含义。
    • 谢谢大家!问题解决了。问题是源字符串附加了两个奇怪的字节。它对阅读是不可见的,但相比之下就在那里。修剪掉额外的两个字节。一切都很好。
    • @bionicoder:那些额外的字节是Unicode BOM markers,还是BSTR length prefix
    【解决方案2】:

    BSTR(因此也是 CComBSTR)通常是 Unicode 字符串。您可以使用 wcscmp()(或 wcsicmp() 进行不区分大小写的比较)。

    请注意,封装的 BSTR 可以为 null,这是空字符串的合法表示,应将其视为特殊情况,否则您的程序可能会遇到未定义的行为(很可能只是崩溃)。

    【讨论】:

      【解决方案3】:

      要正确比较可能包含嵌入空字符的 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;
          }
      }
      

      【讨论】:

        【解决方案4】:
        BSTRsAreEqual(BSTR bstr1, BSTR bstr2, VARIANT_BOOL* boolptrEqual)
        {
           CString s1, s2;
           s1 = bstr1;
           s2 = bstr2; 
           if (s1 == s2) { 
              *boolptrEqual = true;   
           } else { 
              *boolptrEqual = false;    
           }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-04
          • 1970-01-01
          • 2011-10-12
          • 2018-02-28
          • 2011-09-16
          • 2016-02-02
          • 2021-09-21
          • 2012-01-25
          相关资源
          最近更新 更多