Unity Rust原生插件调用ID3D11Texture2D方法出现段错误求助
问题解决:Rust调用ID3D11Texture2D::GetType时触发段错误
问题原因
你直接将*mut IUnknown(windows-rs的包装类型)强制转换为*mut ID3D11Texture2D是错误的。Unity传递的是原始的COM接口指针,而windows-rs中的IUnknown是封装后的智能指针类型,内存布局和原始COM指针完全不同。直接强制转换会导致访问错误的内存地址,触发段错误。
正确实现方式
需要先将原始指针转换为windows-rs的ComPtr<IUnknown>,再通过COM接口查询(QueryInterface)获取ID3D11Texture2D实例,之后再调用方法。修改后的Rust代码如下:
use windows::core::{ComPtr, IUnknown}; use windows::Win32::Graphics::Direct3D11::*; #[no_mangle] pub extern "C" fn modify_texture(texptr: *mut std::ffi::c_void) { // 将原始指针转换为ComPtr<IUnknown> let unknown = unsafe { ComPtr::<IUnknown>::from_raw(texptr) }; // 查询ID3D11Texture2D接口 let texture: Result<ComPtr<ID3D11Texture2D>> = unknown.cast(); if let Ok(texture) = texture { // 安全调用GetType方法 let dimension = unsafe { texture.GetType() }; // 后续处理逻辑 } else { // 处理接口查询失败的情况 } }
关键说明
ComPtr是windows-rs提供的COM智能指针,负责管理COM对象的引用计数,正确处理原始指针到封装类型的转换。from_raw方法用于将原始COM指针转换为ComPtr,必须确保指针是有效的COM接口指针。cast方法内部调用QueryInterface,安全地将IUnknown转换为目标COM接口,避免直接强制转换的内存错误。- Unity端的代码不需要修改,因为
GetNativeTexturePtr()返回的就是原始的COM接口指针(IUnknown*),对应Rust中的*mut c_void。
额外注意事项
- 确保windows-rs 0.56.0版本的COM类型处理逻辑正确,该版本的
ComPtr已经成熟,可以安全处理这类场景。 - 所有涉及原始指针的操作必须标记
unsafe,但通过ComPtr的方法调用可以保证大部分操作的安全性。
内容的提问来源于stack exchange,提问作者sabro
相关产品推荐
相关产品推荐

