Dal*_*ber 4 c++ com atl queryinterface hresult
这是创建COM对象的代码示例:
CComPtr<IBaseFilter> pFilter;
auto hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL,
CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void**>(&pFilter));
Run Code Online (Sandbox Code Playgroud)
我已经看到某个地方检查是否CoCreateInstance()成功应该如下所示:
if (SUCCEEDED(hr) && pFilter != nullptr)
{
// code goes here
}
Run Code Online (Sandbox Code Playgroud)
如果我只检查hr怎么办?这不够吗?我也应该检查一下filter != nullptr吗?
//would this be enough?
if (SUCCEEDED(hr))
{
// code goes here
}
Run Code Online (Sandbox Code Playgroud)
这个问题还涉及其他COM方法QueryInterface().
其S_OK结果是从CoCreateInstance你肯定可以得到一个非NULL接口指针,所以你并不需要额外检查.为了使其更可靠并能够及早发现问题,您可能希望在ATLASSERT那里进行比较NULL.这不会在发布版本中生成代码,但如果出现任何问题,则会在调试中生成早期警告(尤其是您稍后编辑或复制粘贴代码并更改获取指针的逻辑).
CComPtr<IBaseFilter> pFilter;
HRESULT hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, reinterpret_cast<VOID**>(&pFilter));
if(SUCCEEDED(hr))
{
ATLASSERT(pFilter); // hr is of the interest because might explain failure
// pFilter is expected to be non-NULL in case of S_OK
const CComQIPtr<IDMOWrapperFilter> pDmoWrapperFilter = pFilter;
if(pDmoWrapperFilter)
{
// We're not really interested in QueryInterface's HRESULT since it's
// either S_OK or E_NOINTERFACE, hr will typically explain nothing special.
// More important is whether we finally obtained the pointer or not
}
}
Run Code Online (Sandbox Code Playgroud)