Direct3D中的COM对象

问题描述

如Microsoft文档中所述,有两种创建COM对象的方法:

  1. 实现该对象的模块可能会提供专门设计用于创建该对象实例的功能。
  2. 或者,COM提供了一个名为CoCreateInstance的通用创建函数。

在direct3D中,您可以像使用D3D11CreateDevice()一样使用第一种方法来创建对象 但是您可以通过第二种方法来执行此操作。也许您需要我没有找到的CLSID_D3D11CreateDevice。是否要包含任何库,或者可能无法通过第二种方法创建。 我也很想知道是否有一种方法可以查看COM对象及其实现的接口。

解决方法

DirectX API不是“真正的COM”。这些API来自{​​{1}}用于引用计数,而多态接口用于版本控制,但是它们不遵循COM对象的所有其他规则。生存期规则也针对“子”对象进行了修改,并且DirectX API仅支持IUnknown

这是一种非正式地称为“ COM lite”或“ nano-COM”的设计模式。

  • 对象是使用Win32“扁平”工厂函数创建的
  • 对象通常仅支持COINIT_MULTITHREADED,主界面和主界面的派生版本
  • 接口上的方法可以返回IUnknownvoid
  • 并非所有方法都必须是线程安全的
  • 它们不支持COM聚合
  • 接口指针作为参数不支持客户端提供的实现

Direct2D / DirectWrite和Windows Imaging Component(WIC)支持HRESULT,与Windows 2.7之前的原始XAudio2和旧版XACT一样。否则,“ DirectX”组件不支持基于注册表或基于清单的创建。

此模式提供了稳定的“应用程序二进制接口(ABI)”,并且可以很好地映射到纯虚拟类的C ++单继承。它提供了一种简便的方法来扩展新版本以添加方法,并进行引用计数以进行生命周期管理。生成的API通常与CoCreateInstance宏以及Microsoft::WRL::ComPtrwinrt::com_ptr或更旧的ATL CComPtr之类的COM智能指针兼容。

请参见Microsoft Docs: Programming DirectX with COM

DirectX的最新版本(例如DirectX 12)采用了“强类型的位掩码”,而旧版本中未使用。参见this blog post

从历史上看,DirectX“ COM lite” API通过宏提供了C支持,但是最新的指导是仅支持C ++并利用C ++ 11功能(例如强类型枚举(又名scoped enumerations)) 。您会在DXCore界面中看到这一点。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...