我对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)
,但我不确定是否应该得到void指针的地址或什么?如有任何帮助,不胜感激。
您是对的,您需要将指针转换为isize
,因此,尽管这与最近关于指针来源的发展相冲突,但我认为构建HWND
的正确方法如下:
let hwnd = HWND(window.hwnd() as isize);
isize
和usize
被定义为指针宽度,因此将原始指针转换为其中一种类型的成本为零,实际上只是删除类型信息。
注意,这是有效的,因为HWND
只是一个newtype结构体,它的单个字段是pub isize
,所以HWND(val)
语法只是初始化该结构体的字段设置为val
。要访问该字段,只需执行my_hwnd.0
,并通过my_hwnd.0 as *mut T
转换为指针。