c++ - 当一次实现多个 COM 接口(interface)时,我如何向上转换为 IUnknown?

标签 c++ windows visual-c++ com

假设我的 COM 对象实现了两个或多个 COM 接口(interface):

class CMyClass : public IPersistFile, public IPersistStream {
};

在实现 QueryInterface() 时,我需要能够返回一个 IUnknown* 指针。由于两个基本接口(interface)都派生自 IUnknown,因此我不能隐式地向上转换——这样的向上转换是不明确的。要显式向上转换,我需要使用以下两种方式之一:

 if( iid == __uuidof( IUnknown ) ) {
     *ppv = static_cast<IPersistFile*>( this );
     static_cast<IPersistFile*>( this )->AddRef();
     return S_OK;
 }

 if( iid == __uuidof( IUnknown ) ) {
     *ppv = static_cast<IPersistStream*>( this );
     static_cast<IPersistStream*>( this )->AddRef();
     return S_OK;
 }

看起来唯一的要求是,每当对对象调用 QI() 时,它每次都会返回相同的指针,如果我选择任何强制转换并坚持使用,我就满足了该要求。

我应该选择哪个 upcast,为什么?

最佳答案

Mark Ransom 已经给出了正确的答案 - 任何答案都可以,只要它是一致的 - 但选择第一个有一个小优势。由于布局规则,第一个界面的IUnknown*会指向对象的开头。任何其他 IUnknown* 将指向对象中其他地方的后续 vtable 指针。出于调试目的,了解对象在内存中的起始位置非常有用。

关于c++ - 当一次实现多个 COM 接口(interface)时,我如何向上转换为 IUnknown?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1742329/

相关文章:

c++ - g++ 标志只检查语法?

c++ - QWinTaskbarProgress 不会显示

c++ - 将元素替换为 vector 的特定位置

c++ - 如何在 VC++ 2010 中使用 GetLastError()

c++ - 用于 Windows 的 python ncreduce

C++ lambda - 捕获成员变量

C++ 在为 "new"类型专门化模板时如何预定义构造函数参数

Windows 大页面支持 2MB 以外的吗?

c - 有没有办法在 C 中访问文件的修改日期时间?

c++ - MFC画线