CComBSTR::Detach 和 m_str 不同

CComBSTR::Detach and m_str differ

我将旧的 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 如...

std::wcout << "LastErrorString = "<< *LastErrorString << std::endl; // 解引用 LastErrorString