CComBSTR :: Detach и m_str отличаются

Я преобразовал старую библиотеку 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 "Отсоединяет m_str от объекта CComBSTR и устанавливает для m_str значение NULL". Итак, оба выхода должны быть равны, но это не так. Что мне не хватает?

Примечание. Работая в основном с C#, я не знаком со всеми строковыми типами C / C++.

РЕДАКТИРОВАТЬ: Андерс и Джозеф абсолютно правы, мне нужно разыменовать 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);
   }

Почему это работает?

1 ответ

Решение

*LastErrorString как в...

std::wcout << "LastErrorString =" << *LastErrorString << std::endl; // разыменование LastErrorString

Другие вопросы по тегам