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

Win32程序修改窗口类名影响退出码?关闭窗口返回134原因解析

窗口关闭后退出码异常问题分析

问题重现

运行提供的代码后,关闭窗口时程序退出码为134(0x86),且修改const wchar_t CLASS_NAME[]的长度时,退出码会随之变化——每增加1个宽字符,退出码数值增加2,不符合预期的退出码0。

原始代码如下:

#include <Windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ PWSTR lpCmdLine, _In_ int nShowCmd) {
    const wchar_t CLASS_NAME[] = L"AFEWCHARACTERS";

    WNDCLASSW wc = {};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;
    RegisterClassW(&wc);

    HWND hwnd = CreateWindowExW(
        0,
        CLASS_NAME,
        L"Window",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        nullptr,
        nullptr,
        hInstance,
        nullptr
    );

    if (hwnd != nullptr) {
        ShowWindow(hwnd, nShowCmd);
    }

    MSG msg{};
    while (GetMessageW(&msg, nullptr, 0, 0) > 0) {
        TranslateMessage(&msg);
        DispatchMessageW(&msg);
    }
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}

原因分析

问题核心是**wWinMain函数没有显式返回值**:

  • 当WM_DESTROY消息触发时,PostQuitMessage(0)会将退出码0传入消息队列,随后GetMessageW返回0,退出消息循环。
  • 但wWinMain作为返回值为int类型的函数,在消息循环结束后没有执行return语句。根据C/C++规则,非void类型函数未显式返回时,会返回栈上的随机垃圾值。
  • CLASS_NAME是wWinMain内的局部栈变量,函数结束后栈帧中该变量的内容会被误当作返回值。由于wchar_t是2字节宽度的字符,每增加一个字符,栈上对应位置的数值就增加2,最终导致退出码随类名长度变化。

解决方案

在wWinMain的消息循环结束后,显式返回msg.wParam——这个值正是PostQuitMessage传入的退出码(此处为0)。修改后的wWinMain代码如下:

int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ PWSTR lpCmdLine, _In_ int nShowCmd) {
    // ... 原有代码保持不变 ...

    MSG msg{};
    while (GetMessageW(&msg, nullptr, 0, 0) > 0) {
        TranslateMessage(&msg);
        DispatchMessageW(&msg);
    }

    // 新增返回语句,返回PostQuitMessage传入的退出码
    return msg.wParam;
}

修改后,关闭窗口时程序会返回预期的退出码0,且修改CLASS_NAME长度不再影响退出码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:53:28