c++ - 在 QueryInterface() 实现中调用 AddRef() 的正确方法

标签 c++ windows com

我发现了一些 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;
}

感兴趣的行是标有 //### 注释的行。

IUnknown static_cast 指针上调用 AddRef() 真的有必要吗?或者它只是无用的样板代码?
换句话说,一个简单的 AddRef() 调用(即 this->AddRef())就可以了吗?如果不是,为什么?

最佳答案

当然,您通常只有一个 AddRef() 实现,因此如何调用它并不重要。请注意代码使用 ppv 的方式是可能的灵感来源,它是无类型的 (void**),因此需要进行强制转换。也许撕下会让你以不同的方式做这件事。

关于c++ - 在 QueryInterface() 实现中调用 AddRef() 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27760342/

相关文章:

c++ - 获取成员函数内部成员函数的地址

c++ - 错误 : using typedef-name after class

c# - OraOLEDB.Oracle 提供程序未在本地计算机上注册

c# - 为什么可以创建 COM 接口(interface)的新实例?

c++ - 在使用不同的 visual studio 编译器版本编译的进程中加载​​ COM

c++ - 如何将 char* 转换为 wchar_t*?

c++ - OpenSSL:HTTPS 代理

php - 将一个文件夹中的所有文件和文件夹移动到另一个?

windows - 如何设置 Visual Studio Code problemMatcher 以匹配 C++ 错误?

c# - 从 C# 访问 COM 对象的最佳方式