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