【发布时间】: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