将 ptr::null() 转换为 Windows 句柄

stu*_*aus 1 winapi user32 rust

我正在尝试使用 winapi crate 为我的VST 插件创建 GUI 。像这样的函数user32::SetMenu需要一些句柄,其中一些可以是NULL.

加载插件时调用以下方法:

fn open(&mut self, window: *mut c_void) {
    unsafe {
        let menu = user32::CreateMenu();
        let sub_menu = user32::CreateMenu();
        let hwnd: HWND = window as HWND;
        user32::SetMenu(hwnd, menu);
        let mut data = OsString::from("heee");
        let raw = &mut data as *mut _ as LPWSTR;
        let mut menu_item = MENUITEMINFOW {
            cbSize: 0,
            fMask: 0o0000_0020 | 0o0000_0040,
            fType: 0,
            fState: 0,
            wID: MENUITEM_ID,
            hSubMenu: sub_menu,
            hbmpChecked: ptr::null() as HBITMAP,
            hbmpUnchecked: ptr::null() as HBITMAP,
            dwItemData: 0,
            dwTypeData: raw,
            cch: 0,
            hbmpItem: ptr::null() as *mut _,
        };
        menu_item.cbSize = mem::size_of_val(&menu_item) as u32;
        user32::InsertMenuItemW(menu, MENUITEM_ID, 0, &menu_item);
    }

    self.open = true;
}
Run Code Online (Sandbox Code Playgroud)

但是,我不能通过NULL手柄:

hbmpChecked: ptr::null() as HBITMAP,
Run Code Online (Sandbox Code Playgroud)

我收到错误消息

fn open(&mut self, window: *mut c_void) {
    unsafe {
        let menu = user32::CreateMenu();
        let sub_menu = user32::CreateMenu();
        let hwnd: HWND = window as HWND;
        user32::SetMenu(hwnd, menu);
        let mut data = OsString::from("heee");
        let raw = &mut data as *mut _ as LPWSTR;
        let mut menu_item = MENUITEMINFOW {
            cbSize: 0,
            fMask: 0o0000_0020 | 0o0000_0040,
            fType: 0,
            fState: 0,
            wID: MENUITEM_ID,
            hSubMenu: sub_menu,
            hbmpChecked: ptr::null() as HBITMAP,
            hbmpUnchecked: ptr::null() as HBITMAP,
            dwItemData: 0,
            dwTypeData: raw,
            cch: 0,
            hbmpItem: ptr::null() as *mut _,
        };
        menu_item.cbSize = mem::size_of_val(&menu_item) as u32;
        user32::InsertMenuItemW(menu, MENUITEM_ID, 0, &menu_item);
    }

    self.open = true;
}
Run Code Online (Sandbox Code Playgroud)

我在 winapi/user32 的文档中找不到解决方案。

Fra*_*gné 5

以下是HBITMAPwinapi 中的定义

type HBITMAP = *mut HBITMAP__;
Run Code Online (Sandbox Code Playgroud)

这构成HBITMAP了一个可变的原始指针。ptr::null()返回一个 const 原始指针。您应该ptr::null_mut()改用,因为它返回一个可变的原始指针,因此编译器将能够推断出正确的类型。