gpt4 book ai didi

c++ - 处理 CoCreateInstance 返回值

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:05 28 4
gpt4 key购买 nike

这是创建 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 接口(interface)指针,所以你不需要检查它此外。为了使其更可靠并能够及早发现问题,您可能希望在那里使用 ATLASSERTNULL 进行比较。这不会在发布版本中生成代码,但如果出现任何问题(特别是您稍后编辑或复制粘贴代码并更改获取指针的逻辑),则会在调试中生成早期警告。

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
}
}

关于c++ - 处理 CoCreateInstance 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18997021/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com