我对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 struct ,其单个字段是pub isize,所以HWND(val)语法只是将该 struct 初始化为val.要访问该字段,只需执行my_hwnd.0,然后通过my_hwnd.0 as *mut T转换为指针.

Rust相关问答推荐

使用元组执行条件分支的正确方法

如何对字符串引用的引用向量进行排序,而不是对最外层的引用进行排序?

如何在原始字符串中转义";#和#";

在Rust中显式装箱受生存期限制的转换闭包

有没有办法避免在While循环中多次borrow `*分支`

为什么这是&q;,而让&q;循环是无限循环?

如何在递归数据 struct 中移动所有权时变异引用?

在0..1之间将U64转换为F64

为什么Deref类特征不构成?

正在将带有盒的异步特征迁移到新的异步_fn_in_特征功能

为什么不';t(&;mut-iter).take(n)取得iter的所有权?

如何使用tracing-subscriberRust crate 构建多编写者、全局过滤订阅者

可选包装枚举的反序列化

在 Rust 中查找向量中 dyn struct 的索引

实现AsyncWrite到hyper Sender时发生生命周期错误

borrow 匹配手臂内部的可变

Rust HRTB 是相同的,但编译器说一种类型比另一种更通用

在 Rust 中枚举字符串的最佳方式? (字符()与 as_bytes())

如何制作具有关联类型的特征的类型擦除版本?

如果参数为 Send,则返回 Future Send