如何用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())) } }
关键修改说明:
- 将输出参数定义为
mut Option<ID3D11Device>和mut Option<ID3D11DeviceContext>,确保有可写的内存空间接收返回的接口。 - 调用
D3D11On12CreateDevice时,通过Some(&mut ...)传递输出参数的地址,让函数能正确写入返回值。 - 调整返回值类型为元组,直接返回有效的D3D11设备和上下文实例,符合Rust的使用习惯。
内容的提问来源于stack exchange,提问作者Shunyata Kharg
相关产品推荐
相关产品推荐

