c++ - 为什么每次成功的 QueryInterface() 调用之后都是 Release() 调用?

标签 c++ com object interface queryinterface

为什么 QueryInterface() 调用总是跟在 Release() 调用之后?例如,我在 MSDN 上看到了如下示例代码:

HRESULT hr = S_OK;
CDecoder *pObj = new CDecoder(&hr);

if (SUCCEEDED(hr))
{
    *ppv = NULL;
    hr = pObj->QueryInterface(riid, ppv);
}
pObj->Release();
return hr;

有人可以在这里解释 Release() 调用背后的意图吗?

最佳答案

虽然这很常见,但并不总是像这样直接跟随。

COM 对象是引用计数的。当您最初创建该对象时,您会得到一个指向 IUnknown 的指针。然后,您可以使用 QueryInterface 获得其他一些接口(interface)。由于您(通常)不再关心 IUnknown 接口(interface),您可以释放它。当您释放您获得的另一个接口(interface)时,引用计数将为 0,因此该对象可以被销毁。但是,如果您不释放 IUnknown,引用计数将保持非零,因此无法销毁该对象。

不会立即释放IUnknown 的最明显的情况是当/如果您需要获得多个其他接口(interface)。在这种情况下,您将获得 IUnknown,然后是第二个和第三个接口(interface),然后释放 IUnknown。至少在某些情况下,您可能在创建对象后不知道第三个(或后续的)接口(interface),因此您可能需要在任意时间之前保留对 IUnknown 的访问权限释放它。

关于c++ - 为什么每次成功的 QueryInterface() 调用之后都是 Release() 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5047689/

相关文章:

c++ - 我如何摆脱此错误main.cpp :43:19: error: no viable overloaded '=' novowels[100] = remove(name[100]);

c++ - Eigen::map 真的有 "view"语义吗

c++ - 类继承、复制构造函数和设置/获取函数

具有动态接口(interface)的 C# COM 对象

java - 将数据从一种类型对象注入(inject)到另一种类型对象

c++ - 从 C++ 中的方法访问指向对象的私有(private)指针数组

python - 如何在python中运行c代码

python - 从 Microsoft VBA 宏中写入标准输出

c# - 从托管 .NET 代码调用 native 回调(使用 COM 加载托管代码时)

jQuery add() 函数和 jQuery 对象的上下文