下面是创建 COM 对象的代码示例:
CComPtr<IBaseFilter> pFilter;
auto hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL,
CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void**>(&pFilter));
我在某处看到检查CoCreateInstance()
是否成功应该如下所示:
if (SUCCEEDED(hr) && pFilter != nullptr)
{
// code goes here
}
如果我只检查hr
怎么办?难道还不够吗?我也应该检查一下filter != nullptr
吗?
//would this be enough?
if (SUCCEEDED(hr))
{
// code goes here
}
这个问题还涉及其他COM方法,如QueryInterface()
。
从CoCreateInstance
中得到S_OK
结果,可以保证获得非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
}
}
我认为这是多余的,不需要同时检查两者。
如果失败,返回值将告诉您发生了哪个错误。这就是为什么有两种方法可以确定函数是否成功。