为什么更改窗口类名会影响Win32程序的退出代码?



为什么在下面的可复制代码示例中关闭创建的窗口会导致退出代码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

相关内容

  • 没有找到相关文章

最新更新