首页 > 解决方案 > 通过调用 IUnknown::Release() 释放 COM 接口集合

问题描述

在我的应用程序中,我需要将 COM 接口的发布推迟到以后。因此,我将接口指针存储在其中std::vector<IUnknown*> COMInterfaces,然后循环遍历所有指针并Release()像这样调用:

for(IUnknown* item : COMInterfaces) item->Release();

但是,在以下链接中,在第 4.1.3 节中,我读到:

在 COM 中,只有接口被引用计数,而不是对象本身。在客户端获得对特定接口的引用后,它必须在该接口上调用 release 方法,而不是引用同一对象的不同接口。

所以,现在我有点困惑是否可以多态地发布接口。我找不到任何明确说明这是否可以的文档。

编辑:下面的评论确认这有效,我将像这样使用它。但是,欢迎任何指向官方文档的指针以及关于为什么有时我会看到以下代码的任何解释(这也是SafeRelease()微软定义的方式)

template<class T>
void Release(T*& comInterface) {
    if(comInterface) {
      comInterface->Release();
      comInterface = nullptr;
    }
}

代替

void Release(IUnknown*& comInterface) {
    if(comInterface) {
      comInterface->Release();
      comInterface = nullptr;
    }
}

标签: c++comcom-interface

解决方案


推荐阅读