这样做的正确方法是什么:
_bstr_t description;
errorInfo->GetDescription( &description.GetBSTR() );
Run Code Online (Sandbox Code Playgroud)
要么:
_bstr_t description;
errorInfo->GetDescription( description.GetAddress() );
Run Code Online (Sandbox Code Playgroud)
在哪里IError:GetDescription定义为:
HRESULT GetDescription (BSTR *pbstrDescription);
Run Code Online (Sandbox Code Playgroud)
我知道我可以轻松地做到这一点:
BSTR description= SysAllocString (L"Whateva"));
errorInfo->GetDescription (&description);
SysFreeString (description);
Run Code Online (Sandbox Code Playgroud)
谢谢
BSTR是引用计数,我严重怀疑如果你使用GetAddress()将会正常工作.可悲的是,源代码无法进行仔细检查.我总是这样做:
BSTR temp = 0;
HRESULT hr = p->GetDescription(&temp);
if (SUCCEEDED(hr)) {
_bstr_t wrap(temp, FALSE);
// etc..
}
Run Code Online (Sandbox Code Playgroud)
要跟进@Hans的回答 - 构建它的适当方法_bstr_t取决于GetDescription你BSTR是否拥有自己拥有的,或者引用你不需要释放的记忆.
这里的目标是最小化副本数量,但也避免SysFreeString对返回的数据进行任何手动调用.我会修改代码,如图所示澄清:
BSTR temp = 0;
HRESULT hr = p->GetDescription(&temp);
if (SUCCEEDED(hr)) {
_bstr_t wrap(temp, false); // do not copy returned BSTR, which
// will be freed when wrap goes out of scope.
// Use true if you want a copy.
// etc..
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4624 次 |
| 最近记录: |