【问题标题】:CComBSTR::Detach and m_str differCComBSTR::Detach 和 m_str 不同
【发布时间】:2020-11-11 18:28:56
【问题描述】:

我将旧的 VC++6 库转换为 VC++17,现在我遇到了一些 BSTR 问题。看方法:

    void GetLastErrorStringInternal(BSTR *LastErrorString)
    {
       CComBSTR cbsErrMsg;

       /*cbsErrMsg gets determined here*/

      std::wcout << "cbsErrMsg = "<< cbsErrMsg.m_str << std::endl;
      *LastErrorString = cbsErrMsg.Detach();
      std::wcout << "LastErrorString = "<< LastErrorString << std::endl;
    }

这就出来了:

     cbsErrMsg = No error occured
     LastErrorString = 0278EF88

根据文档 CComBSTR::Detach “从 CComBSTR 对象中分离 m_str 并将 m_str 设置为 NULL。” 所以两个输出应该相等,但事实并非如此。我错过了什么?

注意:主要使用 C# 我对所有 C/C++ 字符串类型都不太熟悉。

编辑: Anders 和 Joseph 绝对正确,我必须取消引用 LastErrorString! 一个问题仍然存在:在原始实现中,这无需取消引用即可工作:

 void GetLastErrorString(BSTR *LastErrorString) //!< [out,retval] error description 
   {
    /*...*/
    CString cstMsg;
    GetLastErrorStringInternal(LastErrorString);
    cstMsg.Format("GetLastErrorString(). Error number: %ld, error message: %S.",m_ptwRSLastError,LastErrorString);
   }

为什么会这样?

【问题讨论】:

  • 你打印的是 LastErrorString 的地址,而不是它指向的地址。
  • 你是对的!但是为什么最初的实现有效(见编辑)?
  • 我认为这是一个错误,它也给出了未定义的行为,它看起来有效但错误

标签: c++ visual-c++ visual-c++-6


【解决方案1】:

*LastErrorString 如 ...

std::wcout

【讨论】:

    猜你喜欢
    • 2016-08-29
    • 2014-12-18
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2010-12-08
    • 1970-01-01
    • 2011-04-07
    相关资源
    最近更新 更多