我对Rust 还比较陌生,我正在努力让以下几点发挥作用:

 let hwnd : *mut HWND = window.hwnd().cast();
 let swapchain = unsafe { factory.CreateSwapChainForHwnd(&device, *hwnd, &desc, std::ptr::null(), &output)? } ;

其中window.hwnd()返回*mut c_void,我需要将其转换为windows::Windows::Win32::Foundation::HWND,但这个例子在访问冲突时崩溃.我认为这是因为我定义了一个指向HWND的指针,而HWND本身应该是void ptr.HWND可以从isize创建,比如HWND(isize),但我不确定它是否应该得到空指针的地址或其他什么?非常感谢您的帮助.

推荐答案

你是对的,你需要将指针转换为isize,所以尽管这与recent developments关于指针来源的说法相冲突,但我相信构建HWND的正确方法如下:

let hwnd = HWND(window.hwnd() as isize);

isizeusize被定义为指针宽度,因此将原始指针转换为其中一种类型是零成本的,基本上只是擦除类型信息.

注意,这是因为HWND只是一个newtype结构,其单个字段是pub isize,所以HWND(val)语法只是将该结构初始化为val.要访问该字段,只需执行my_hwnd.0,然后通过my_hwnd.0 as *mut T转换为指针.

Rust相关问答推荐

使用 Option<&T> 获得 Option::unwrap_or_else 行为的干净方法

`T : 'static` 是什么意思?

函数强制的元组结构:所述函数的生命周期参数是什么?

在 Rust 中,如果 main 函数返回 Err 会发生什么?

为什么这个borrow 被认为是“以后使用”,即使它显然不是?

何时取消引用

我应该如何描述泛型类型的生命周期关系?

Rust 泛型,“`T` 的生命周期 可能不够长”

如何在 rust 中写入一个格式化的字符串,直到缓冲区大小?

使用 rust cargo 在工作区根目录中运行测试

&str 和 &String 有什么区别

键入一个闭包,该闭包返回一个匿名类型,该类型borrow 它的一个输入,而不使用堆分配或trait对象

如何使用更高阶的异步函数来过滤 Vec?

u8::from_be_bytes 和 u8::from_le_bytes 之间是否存在有意义的区别?

切片的安全 memset 相当于什么?

如何在 Rust 中最好地使用 *fake* 关键字样式函数参数?

为什么嵌套的关联类型路径被认为是不明确的?

如何在trait中定义异步方法?

为什么在包含闭包的选项中“one type is more general than the other”?

将 Rc 作为函数参数传递时出错