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
相关产品推荐
相关产品推荐

