Direct3D 中的 COM 对象

2024-01-02

正如 Microsoft 文档中提到的,有两种创建 COM 对象的方法:

  1. 实现该对象的模块可能提供专门设计用于创建该对象的实例的函数。
  2. 或者,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(使用前将#替换为@)

Direct3D 中的 COM 对象 的相关文章

  • 使用 StretchDIBits 使用 Delphi 6 处理条形码图像 - 输出中缺少条形线

    我的应用程序是在 Delphi 6 中开发的 由于后台处理和大量数据 它消耗大约 60MB 120MB 物理内存 这是一个资源密集型应用程序 该应用程序的功能之一是在进行某些处理后创建条形码图像 如果用户继续生成条形码 那么至少十分之一的条
  • 从安全角度来看,在 Windows 中使用管道是否被认为是危险的?

    从安全角度来看 在 Windows 中使用管道是否被认为是危险的 管道在 Windows 中并不是一个特殊的安全风险 如果您担心安全性 请确保将管道上的安全描述符设置为适当的 DACL 如果您的使用要求管道开放供任何人连接 那么您必须将传入
  • 如何在Windows上用C语言实现定时器

    如何在 C 中创建一个计时器 时间到期后 我应该能够调用回调函数 平台是windows 有人可以指导我吗 问候 米敦 看一眼SetTimer http msdn microsoft com en us library ms644906 28
  • C# - 挂钩现有 COM 对象

    假设我们有一个现有进程 或应用程序 它从 ocx 文件 例如 MyCOMLibrary ocx 调用 COM 对象 有没有办法编写一个 C 库来精确复制 ocx 文件 这样原始应用程序就可以调用您的 C 代码而不是原始 COM 对象 当然
  • Python 仪器驱动程序

    我是一名实验物理学家 并且是Python http en wikipedia org wiki Python 28programming language 29 我发现它非常适合数据分析和脚本编写 实际上我还用它来连接实验室仪器 网络分析仪
  • 基于非零的多维数组

    我正在使用以下命令从电子表格中提取单元格Interopt ExcelAPI 当我打电话时 object rangeValues object range get Value XlRangeValueDataType xlRangeValue
  • 我可以在 C# 进程中使用 SetErrorMode 吗?

    我正在准备写一个在线法官核心 一个可以编译用户代码并运行程序来检查答案的程序 如uva online Judge 我在捕获提交程序的异常时遇到问题 如下所示 int main while scanf d d n m printf d n n
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 如何在 Windows 上查找当前系统缓存大小?

    到处搜索 但未能找到 API 调用来检索 Windows 上 文件 系统缓存的当前大小 全局内存状态Ex https stackoverflow com a 2017659 450917 检索总计 免费 已用和交换统计数据 获取系统文件缓存
  • 监控进程的网络使用情况?

    C 或 C C Win32 中有没有一种方法可以监视某个进程的网络使用情况 显然没有您构建的应用程序 我想只监视 1 个进程大约一个小时左右 然后返回仅该进程 例如 Limewire 使用的字节 是否可以 我知道 Windows 上的 ne
  • Win32 自定义绘制树视图控件

    我正在尝试使用 NM CUSTOMDRAW 消息自定义树视图控件 我只是想用灰色绘制所有其他可见的项目 这是绘制的代码 INT CResourceOutliner On WM NOTIFY HWND hDlg WPARAM wParam L
  • 如何让 Win32 使用 Windows XP 样式字体

    我正在使用纯 C 和 WinAPI 编写 Win32 应用程序 不允许使用 MFC 或 C 为了让控件使用适当的样式进行绘制 我使用了清单 如相应的 MSDN 文章中所述 一切都很好 当我更改系统样式时 我的应用程序也会更改样式 但使用的字
  • 以编程方式更改任务栏图标(Win32,C++)[重复]

    这个问题在这里已经有答案了 我有一个 C win32 程序 我想在运行时编辑任务栏图标以显示有关该程序的警报等 但是我对 win32 api 不太有经验 而且我找不到任何东西在线的 我发现的最接近的是http www windows tec
  • 设置窗口像素的正确(且无闪烁)方法?

    我正在努力找出在 WM PAINT 期间将纯 RGBA 值数组转储到 Win32 窗口的客户区的正确方法 我有以下代码 但它看起来已经很复杂 我什至还没有完成 case WM ERASEBKGND return 1 case WM PAIN
  • 如何检查 NTAccount 对象代表组还是用户?

    使用返回的访问规则时 GetAccessRules True True GetType System Security Principal NTAccount 如何判断每个规则中引用的 NTAccount 对象是用户帐户还是组 Update
  • 如何使用 Win32 API 与 com 端口 (RS232) 通信

    我正在尝试使用 win32 API 与 com 端口对话 我找到了这个http www robbayer com files serial win pdf http www robbayer com files serial win pdf
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 通过win32检测多个登录用户

    使用标准 win32 api 检测多个用户登录的最佳方法是什么 我对我们的软件产品进行了升级 当多个用户登录时 该产品无法运行 我知道这是应该避免的事情 因为它很烦人 但该产品非常复杂 您必须相信我 当我说确实没有其他解决方案时 谢谢 为了
  • Windows Aero - 以编程方式禁用视觉效果

    有谁知道是否有一个 API 可以通过编程方式禁用 启用特定的 Windows 视觉效果 例如 启用透明玻璃 或 启用 Aero Peek 我指的效果是在以下位置配置的效果 系统 高级系统首选项 高级 选项卡 性能设置 自定义 我正在为 Wi
  • 如何使用边缘和内部镶嵌因子完成三角形面片镶嵌?

    I am just learning tessellation and i came across with below example for triangle patch tessellation but i am not sure h

随机推荐

  • SQL 中缺少右括号错误是什么原因造成的?

    我已经尝试运行以下 SQL 命令几个小时了 我不断收到错误消息 ORA 00907 缺少右括号错误 我知道这意味着某处存在语法错误 但我已经检查了代码很多次 但仍然无法弄清楚 任何帮助将不胜感激 CREATE TABLE Employees
  • PTRACE_SINGLESTEP是如何实现的?

    据我所知 我可能是错的 没有办法只执行onex86 64 系统上的指令 也许您可以执行后跟 ud2 操作码的指令来触发信号 但是您必须担心指令会修改控制流并转到其他地方 然而 如果我理解正确的话 ptrace 系统调用有一个 SINGLES
  • 我可以使用哪些工具来分析 Internet Explorer 的网络捕获日志?

    我正在使用 Internet Explorer 9 中内置的 F12 开发人员工具来捕获站点上的网络流量 此信息可以保存到 XML 默认 或 CSV 文件 XML 文件似乎包含更多信息 但我很难找到任何可以读取这些信息的应用程序 使用 In
  • SQLITE3 VACUUM,“数据库或磁盘已满”

    我正在尝试运行VACUUM在我的数据库上运行命令 但我似乎空间不足 gt sqlite3 mydatabase db VACUUM Error database or disk is full 数据库大约有 36 GB 我运行它的驱动器看起
  • 如何使用 PHP 获取上一年

    我如何使用 PHP 获得上一年的值 有没有预定义的函数 try echo date Y strtotime 1 year
  • python-ldap 和 Microsoft Active Directory:连接和删除用户

    python ldap newb在这里 我正在尝试使用以下示例代码来执行此操作 import ldap first you must bind so we re doing a simple bind first try l ldap op
  • 向下滚动时显示导航栏

    我有一个带有隐藏导航栏的简单代码 但我想要的是在向下滚动时显示它 我怎样才能做到这一点 struct ContentView View var body some View NavigationView ScrollView showsIn
  • Dagger2 不生成 Daggercomponent 类

    Dagger2 没有在 android studio 中生成任何组件类 我知道这是一个已知问题 而我已经在 android studio 中尝试了几乎所有实现方法 并尝试了各种教程 但每次我在这里遇到问题时 它都无法构建 dagger组件班
  • 在 Eclipse 上创建 Android 模块化应用程序

    我目前正在将一个用于在 J2ME 上构建应用程序的框架移植到 Android 该框架由多个编译为库 jar 的项目组成 每个单独的 JAR 都可以包含图形数据 资源 J4ME 屏幕等 每个项目通常都有一个明确定义的入口点 模块 当有人想要使
  • __doPostBack() 导致回发但不调用 aspx 页面中的按钮单击事件

    我正在使用一个有按钮的 aspx 页面
  • Firebase Facebook 身份验证:电子邮件验证始终为假

    正如标题所说 无论我如何尝试登录Facebook emailVerified字段始终为 false 这是设计使然吗 我现在已经阅读了整个 firebase 文档 似乎找不到任何与此相关的信息 只是为了确定 我尝试过 4 种不同的verifi
  • 如何在C库中使用opendir和readdir忽略隐藏文件

    这是一些简单的代码 DIR pd opendir xxxx struct dirent cur while cur readdir pd puts cur gt d name 我得到的有点混乱 包括点 点对点 和以以下结尾的文件名 我想做与
  • 在保持区域的同时旋转位图(矩形)

    如何在保持原始位图面积的同时将位图旋转给定的度数 即 我旋转宽度 100 高度 200 的位图 我的最终结果将是更大的图像 但旋转的部分仍将具有 100 200 的面积 图形转换功能非常适合此目的 创建所需大小的新位图 基于该位图创建图形对
  • 使用访问控制源指定多个子域

    我试图允许访问我网站上的每个子域 以便允许跨子域 AJAX 调用 有没有办法指定网站的所有子域 例如 example com或者 当我列出多个域时 为什么以下内容不起作用 header Access Control Allow Origin
  • Django:外键查询

    我正在学习 Django 并试图掌握跨桥接表查询外键的窍门 抱歉 如果这是重复的 我无法通过搜索找到答案 我的模型定义如下 class Place models Model id models IntegerField primary ke
  • MongoDB:将 $sample 与 C# 驱动程序一起使用

    我尝试使用 MongoDB C 驱动程序 2 4 4 表达以下查询 db media aggregate sample size 1 这是我到目前为止所拥有的 BsonDocument sample new BsonDocument sam
  • Jboss7.1把war应用部署在哪里

    我已在独立 jboss7 1 实例中部署了 jboss as helloworld errai 应用程序 稍后将其删除 在 standalone deployments 文件夹中 但每次我重新启动服务器时 它都会重新部署该应用程序 jbos
  • 向您的机器人发送此消息时出错:HTTP 状态代码 NotFound

    我尝试在天蓝色中部署机器人 最初 我在 azure 中创建了一个 Web 应用程序机器人 然后从 azure 下载代码 之后 我在 git 存储库中添加了所有生产文件 例如 bot env web config 文件 之后我将我的 git
  • 如何通过专门化在具有单独声明和定义的模板化类方法上使用 std::enable_if

    我试图使用专门化在头文件和实现之间拆分模板化类 但我希望一种方法仅出现在某些专门化中 头文件 template
  • Direct3D 中的 COM 对象

    正如 Microsoft 文档中提到的 有两种创建 COM 对象的方法 实现该对象的模块可能提供专门设计用于创建该对象的实例的函数 或者 COM 提供了一个通用创建函数 名为CoCreateInstance 在 direct3D 中 您可以