请问为什么在WM_QUERYENDSESSION或者WM_ENDSESSION中发出WM_QUIT,消息循环无法终止?
沙老师 2006-09-19 11:18:28 请问为什么在WM_QUERYENDSESSION或者WM_ENDSESSION中发出WM_QUIT,消息循环无法终止?
#include <windows.h>
#include "EvntLog.h"
#include "Program.h"
// 类名
TCHAR szClassName[] = TEXT("ClassName");
// 标题
TCHAR szWindowName[] = TEXT("WindowName");
CEvntLog *pEvntLog;
CProgram *pProgram;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
HWND hWnd;
WNDCLASS wc;
pEvntLog = new CEvntLog;
pProgram = new CProgram(pEvntLog);
// 注册窗口类
wc.style = CS_VREDRAW | CS_HREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = szClassName;
RegisterClass(&wc);
// 创建窗口
hWnd = CreateWindow(szClassName, szWindowName, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// 消息循环
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
pEvntLog->WriteEvnt("Quitting...");
delete pProgram;
delete pEvntLog;
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
pEvntLog->WriteEvnt("WM_DESTROY");
PostQuitMessage(0);
break;
case WM_QUERYENDSESSION:
if (lParam & ENDSESSION_LOGOFF) {
pEvntLog->WriteEvnt("LOGOFF");
}
else {
pEvntLog->WriteEvnt("SHUTDOWN");
}
// delete pProgram;
// delete pEvntLog;
DestroyWindow(hWnd);
return TRUE;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
程序在WinMain开头new了两个对象,本来指望在WinMain结尾,也就是消息循环结束后delete掉。但是这个delete过程在我正常关闭窗口时是可以执行的,注销(或关机)时候却无法正常执行。
注销(或关机)时候,程序先处理了WM_QUERYENDSESSION消息,执行了DestroyWindow,然后也正常处理了WM_DESTROY消息,这在程序的日志上可以看到,按理说PostQuitMessage后消息循环就应该终止了,然后程序正常delete对象,正常终止,但是事实上却没有delete。百思不得其解...