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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:08:13