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

windows-rs中SetWindowLongPtrW调用失败(错误码0):如何在window_proc访问结构体字段?

解决在Win32窗口过程中访问Rust自定义结构体的问题

核心错误分析

你当前的代码错误在于对SetWindowLongPtrW返回值的判断逻辑有误:

  • 该函数的返回值是窗口之前的用户数据指针,如果窗口从未设置过用户数据,返回0是正常情况,并非调用失败。
  • 只有当函数调用真的失败时,GetLastError()才会返回非0的错误码。你当前错误码为0,说明SetWindowLongPtrW调用其实是成功的,只是错误的判断逻辑触发了panic。

修正后的代码

正确设置用户数据指针

// 将Floppa实例转移到堆上,获取原始指针
let floppa_ptr: *mut Floppa = Box::into_raw(Box::new(self));
let prev_data = SetWindowLongPtrW(hwnd, GWLP_USERDATA, floppa_ptr as isize);

// 仅当返回值为0且GetLastError返回非0时,才判定为调用失败
if prev_data == 0 {
    let err = GetLastError();
    if err.0 != 0 {
        Err(format!("Failed to set the user data pointer: {}", err.0))?;
    }
    // 走到这里说明之前没有设置过用户数据,调用成功
}

在窗口过程中安全访问结构体

在window_proc中,你需要先获取指针,检查非空后再安全访问结构体字段,同时要记得在窗口销毁时回收内存:

unsafe extern "system" fn window_proc(hwnd: HWND, msg: UINT, wparam: WPARAM, lparam: LPARAM) -> LRESULT {
    match msg {
        WM_PAINT => {
            // 获取用户数据指针
            let floppa_ptr = GetWindowLongPtrW(hwnd, GWLP_USERDATA) as *mut Floppa;
            if !floppa_ptr.is_null() {
                // 安全解引用指针,获取可变引用
                let floppa = &mut *floppa_ptr;
                // 访问结构体字段
                println!("Floppa size: {}x{}", floppa.width, floppa.height);
                // 这里可以添加你的绘制逻辑,比如使用bitmap_handle
            }
            DefWindowProcW(hwnd, msg, wparam, lparam)
        }
        WM_DESTROY => {
            // 窗口销毁时,回收堆上的Floppa实例,避免内存泄漏
            let floppa_ptr = GetWindowLongPtrW(hwnd, GWLP_USERDATA) as *mut Floppa;
            if !floppa_ptr.is_null() {
                let _ = Box::from_raw(floppa_ptr);
            }
            PostQuitMessage(0);
            0
        }
        _ => DefWindowProcW(hwnd, msg, wparam, lparam)
    }
}

关键注意事项

  • 所有权转移:Box::into_raw(Box::new(self))会将self的所有权转移到堆上,之后不能再使用原self实例,否则会导致悬垂引用或双重释放。
  • 内存安全:在窗口过程中访问指针前必须检查是否为空,避免空指针解引用panic。
  • 内存回收:一定要在WM_DESTROY消息中把原始指针重新包装成Box,让Rust自动回收内存,防止内存泄漏。

内容的提问来源于stack exchange,提问作者Matthew Trip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 21:34:51