【发布时间】:2021-02-21 08:25:00
【问题描述】:
如 Microsoft 文档中所述,有两种创建 COM 对象的方法:
- 实现该对象的模块可能会提供一个专门用于创建该对象实例的函数。
- 另外,COM 提供了一个名为
CoCreateInstance的通用创建函数。
在 direct3D 中,您可以使用第一种方法创建对象,就像使用 D3D11CreateDevice()
但是你如何通过第二种方法做到这一点。也许你需要我没有找到的CLSID_D3D11CreateDevice。是否有任何库要包含或者可能无法通过第二种方法创建。
我也很想知道是否有办法查看 COM 对象以及它们实现了哪些接口。
【问题讨论】:
-
不可能使用 2) 创建 DirectX 对象。通常,您提供一种方法或另一种方法,而不是两者都提供。官方实现的接口在文档中。尽管有一些机制可以发现一些元数据,但 DirectX 并没有实现它。它有时被称为“轻量级”COM:您有带有 vtable/IUnknown 派生的对象,仅此而已。
-
程序员会停止认为这与 COM 有任何关系,这对他们自己有利。 DirectX 使用更通用的interface-based programming model,它避免了与 COM 相关的所有 DLL Hell 问题。 C++ 中常见的 PIMPL 模式非常相似。您必须使用专用的工厂函数,并将其链接到您的程序中,不能让 COM 管道为您找到依赖项。后果是一样的,你只有一个指针,什么都看不到。