gpt4 book ai didi

c++ - 传递 "IUnknown * &"作为参数时,COM 对象释放函数出错

转载 作者:行者123 更新时间:2023-11-30 00:50:42 25 4
gpt4 key购买 nike

在标题中,包含以下代码。

inline void SafeRelease( IUnknown * & in_COM_Pointer )
{
if ( NULL != in_COM_Pointer )
{
in_COM_Pointer->Release();
in_COM_Pointer = NULL;
}
}

当它被如下使用时,

SafeRelease(_D3DDevice); // _D3DDevice is a "IDirect3DDevice9 *". According to documentation it is inherited from "IUnknown".

它给出了一个编译错误:

error C2664: 'SafeRelease' : cannot convert parameter 1 from 'IDirect3DDevice9 *' to 'IUnknown *&'

我知道如何使用模板或宏来编写这个函数。但我想知道为什么会这样。

  1. 为什么会报错?
  2. 如何正确书写?
  3. 如果不能使用继承来编写这个函数,我应该使用模板吗?
  4. 在使用建议的方法实现时,有什么我必须注意的吗?

最佳答案

COM 不允许转换接口(interface)指针,您必须使用QueryInterface()。这是由 C++ 编译器强制执行的。像这样:

class Base {};
class Derived : /*public*/ Base {};

inline void SafeRelease(Base* & ptr) {}

void test() {
auto p = new Derived;
SafeRelease(p); // C2664
}

您可以使用模板函数来完成:

template<typename T>
inline void SafeRelease(T * & in_COM_Pointer) {
if (NULL != in_COM_Pointer) {
in_COM_Pointer->Release();
in_COM_Pointer = NULL;
}
}

关于c++ - 传递 "IUnknown * &"作为参数时,COM 对象释放函数出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24218884/

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