You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用windows-rs调用D3D11On12CreateDevice获取有效ID3D11Device?

解决windows-rs中D3D11On12CreateDevice无法返回有效ID3D11Device的问题

你的代码存在两个核心问题,导致无法获取有效的ID3D11Device:

  • 输出参数传递错误:ppdevice和ppimmediatecontext是输出参数,需要传入指向可写内存的指针,原代码直接传None,函数没有可写入的内存空间来返回接口。
  • 类型定义错误:无需嵌套Option<*mut Option<...>>这类复杂类型,windows-rs的COM接口本身是智能指针,直接用Option<ID3D11Device>即可处理空值情况。

以下是修正后的可运行代码:

use windows::Win32::Graphics::{Direct3D11, Direct3D12};

fn create_d11_device(pdevice: &Direct3D12::ID3D12Device) -> windows::Result<(Direct3D11::ID3D11Device, Direct3D11::ID3D11DeviceContext)> {
    unsafe {
        // 初始化输出参数为None,准备接收返回的COM接口
        let mut d11_device: Option<Direct3D11::ID3D11Device> = None;
        let mut d11_context: Option<Direct3D11::ID3D11DeviceContext> = None;

        // 调用D3D11On12CreateDevice,传入输出参数的可变引用地址
        Direct3D11::D3D11On12CreateDevice(
            pdevice,
            Direct3D11::D3D11_CREATE_DEVICE_BGRA_SUPPORT.0,
            None,
            None,
            0,
            Some(&mut d11_device),
            Some(&mut d11_context),
            None,
        )?;

        // 调用成功后,输出参数必然被赋值,直接unwrap取出即可
        Ok((d11_device.unwrap(), d11_context.unwrap()))
    }
}

关键修改说明:

  1. 将输出参数定义为mut Option<ID3D11Device>和mut Option<ID3D11DeviceContext>,确保有可写的内存空间接收返回的接口。
  2. 调用D3D11On12CreateDevice时,通过Some(&mut ...)传递输出参数的地址,让函数能正确写入返回值。
  3. 调整返回值类型为元组,直接返回有效的D3D11设备和上下文实例,符合Rust的使用习惯。

内容的提问来源于stack exchange,提问作者Shunyata Kharg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 10:26:07