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