为什么在下面的可复制代码示例中关闭创建的窗口会导致退出代码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()
函数在其消息循环完成后缺少所需的return
语句:
MSG msg{};
while (GetMessageW(&msg, nullptr, 0, 0) > 0) {
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
return 0; // or msg.wParam // <-- ADD THIS!
}
wWinMain()
的返回值用于设置调用进程在优雅退出时的退出码(即,如果ExitProcess()
/TerminateProcess()
事先没有被调用,并且没有抛出未捕获的异常)。根据GetExitCodeProcess()
文档:
该函数立即返回。如果进程没有终止并且函数成功,返回的状态是
STILL_ACTIVE
(STATUS_PENDING
(minwinbase.h
)的宏)。如果进程已经终止并且函数成功,则返回以下值之一的状态:
ExitProcess()
或TerminateProcess()
函数指定的退出值。- 进程
main()
或WinMain()
函数的返回值。- 未处理的异常导致进程终止。
只有main()
(由C/c++标准定义,因此有特殊的处理)允许省略return
语句,在这种情况下,它的返回值将隐式地为0。任何其他非void
返回类型的函数都需要一个显式的return
,否则它的返回值将是indeterminate