从ATL Internals一书中,我知道 BSTR 与 OLECHAR* 不同,BSTR 有 CComBSTR 和 CString。
根据 MSDN Allocating and Releating Memory for a BSTR,我知道调用者/被调用者的内存管理责任。
从 MSDN 取这条线,
HRESULT CMyWebBrowser::put_StatusText(BSTR bstr)
我仍然不知道如何bstr
在我的实现中正确处理。因为我还有一个关于 BSTR 的基本问题——我们应该将bstr
其视为一个值(如 int)还是作为一个引用(如 int*),至少在 COM 接口边界上。
我想在我的实现中尽快将 BSTR 转换为 CString/CComBSTR。对于转换,值或引用语义将完全不同。我已经深入研究了 CComBSTR.Attach、CComBSTR.AssignBSTR 等。但代码无法解决我的疑问。
MSDN CComBSTR.Attach 有一些代码片段,我觉得这是错误的,因为它不遵守为 BSTR 分配和释放内存。ATL Internals 说 SetSysString 将“释放传入的原始 BSTR”,如果我使用它,它将违反 BSTR 参数约定,就像 CComBSTR.Attach 一样。
总而言之,我想在实现中使用CString来处理原始BSTR,但不知道正确的方法......我在我的项目中写了一些只是工作代码,但我总是感到紧张,因为我不知道是否我是对的。
让我谈谈编码语言
HRESULT CMyWebBrowser::put_StatusText(BSTR bstr)
{
// What I do NOT know
CString str1; // 1. copy bstr (with embeded NUL)
CString str2; // 2. ref bstr
// What I know
CComBSTR cbstr1;
cbstr1.AssignBSTR(bstr); // 3. copy bstr
CComBSTR cbstr2;
cbstr2.Attach(bstr); // 4. ref bstr, do not copy
// What I do NOT know
// Should we copy or ref bstr ???
}