【发布时间】:2015-01-05 10:23:00
【问题描述】:
我发现QueryInterface() 的一些实现模式如下:
// Inside some COM object implementation ... virtual HRESULT __stdcall QueryInterface(REFIID riid, void **ppv) { *ppv = /* Find interface ... */ if (*ppv == nullptr) return E_NOINTERFACE; static_cast<IUnknown *>(*ppv)->AddRef(); // ### return S_OK; }
感兴趣的行是用// ### 注释标记的行。
真的有必要在IUnknownstatic_cast-指针上调用AddRef()吗?还是只是无用的样板代码?
换句话说,一个简单的AddRef() 调用(即this->AddRef())就可以了吗?如果不是,为什么?
【问题讨论】:
-
如果 interface->AddRef 映射到 this->AddRef 那么我想你可以只使用
this,但总是这样吗? -
@500-InternalServerError: 假设上面的代码是一些 COM 对象实现的一部分,比如
class CSomeComponent : public IInterface1, public IInterface2 { ... };。一个简单的AddRef();调用而不是static_cast<IUnknown*>(*ppv)->AddRef();调用会有什么问题? -
顺便说一句:在this MSDN article - 遵循前面提到的 AddRef 调用模式 - 它读取 "[...] AddRef 再次通过生成的接口指针调用以支持一些罕见但允许的类组合场景”。我想知道这些场景是什么以及 AddRef() “调用样式”的技术原因是什么......