正如 Microsoft 文档中提到的,有两种创建 COM 对象的方法:
- 实现该对象的模块可能提供专门设计用于创建该对象的实例的函数。
- 或者,COM 提供了一个通用创建函数,名为
CoCreateInstance
.
在 direct3D 中,您可以使用第一种方法来创建对象,就像您使用的那样D3D11CreateDevice()
但是你如何通过第二种方法做到这一点。也许你需要CLSID_D3D11CreateDevice
我没有找到。是否有任何库可以包含,或者也许不可能通过第二种方式创建。
另外,我真的很想知道是否有办法查看 COM 对象以及它们实现的接口。
DirectX API 不是“真正的 COM”。这些 API 源自IUnknown
用于引用计数和用于版本控制的多态接口,但它们不遵循 COM 对象的所有其他规则。生命周期规则也针对“子”对象进行了修改,DirectX API 仅支持COINIT_MULTITHREADED
.
这是一种非正式地称为“COM lite”或“nano-COM”的设计模式。
- 对象是使用 Win32“平面”工厂函数创建的
- 对象一般只支持
IUnknown
、主界面以及主界面的派生版本
- 接口上的方法可以返回
void
or HRESULT
- 并非所有方法都需要是线程安全的
- 它们不支持 COM 聚合
- 接口指针作为参数不支持客户端提供的实现
Direct2D/DirectWrite 和 Windows 成像组件 (WIC) 支持CoCreateInstance
最初的 XAudio2 for Windows 版本 2.7 和旧版 XACT 也是如此。否则,“DirectX”组件不支持基于注册表或基于清单的创建。
此模式提供了稳定的“应用程序二进制接口 (ABI)”,并很好地映射到纯虚拟类的 C++ 单继承。它提供了一种简单的方法来扩展新版本以添加方法以及生命周期管理的引用计数。生成的 API 通常与IID_PPV_ARGS
宏以及 COM 智能指针,例如微软::WRL::ComPtr https://learn.microsoft.com/en-us/cpp/cppcx/wrl/comptr-class, winrt::com_ptr https://learn.microsoft.com/en-us/uwp/cpp-ref-for-winrt/com-ptr,或者旧的 ATLCComPtr https://learn.microsoft.com/en-us/cpp/atl/reference/ccomptr-class.
See Microsoft 文档:使用 COM 进行 DirectX 编程 https://learn.microsoft.com/en-us/windows/win32/prog-dx-with-com
DirectX 的最新版本(例如 DirectX 12)采用了旧版本中未使用的“强类型位掩码”。看这篇博文 https://walbourn.github.io/modern-c++-bitmask-types/.
虽然历史上 DirectX“COM lite”API 通过宏提供了 C 支持,但最新的指导是仅支持 C++ 并利用 C++11 功能,例如强类型枚举(又名:作用域枚举 https://en.cppreference.com/w/cpp/language/enum)。您会看到这反映在DXCore https://learn.microsoft.com/en-us/windows/win32/dxcore/dxcore接口。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)