Windows程序的基本运行流程
对于一般的C语言程序,main是函数的进入点:
int main(int argc, char *argv[])
{
...
return 0;
}
而Windows程序的进入点是WinMain:
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
...
}
在Windows系统中,最直接的程序执行方式是在Shell中以鼠标双击某一个可执行文件图标,于是shell调用加载器把该程序加载,
然后调用C startUp code,后者再调用WinMain,开始执行程序,WinMain的四个参数由系统传递进来。
首先WinMain进行一些初始化的工作,接着进入所谓的消息循环:
while(GetMessage(&msg,...))
{
TranslateMessage(&msg); //转换键盘、鼠标消息
DispatchMessage(&msg); //分派消息
}
TranslateMessage是为了将键盘消息转化,DispatchMessage会将消息传递给窗口函数去处理。在程序的生存期,通过GetMessage
不断地从消息队列中抓取消息,如果有属于我的消息,则通过DispatchMessage将消息送到窗口函数进行处理。窗口函数(可以想象成
MFC中的消息映射(Message Map))判断消息种类,以决定由那种消息处理函数进行相应的处理。
现将一个Windows程序的一般创建和结束的基本流程表示如下:
1.程序初始化过程中调用CreateWindow,为程序新建一个窗口,作为程序的屏幕舞台。CreateWindow产生窗口之后会送出WM_CREATE直接给
窗口函数,后者于是可以在此时做些初始化操作。
2.在程序活着的过程中,不断以GetMessage从消息队列中抓取消息。如果这个消息是WM_QUIT,GetMessage返回0,从而结束while循环,进而结束
整个程序。
3.DispatchMessage 通过Windows USER模块的协助与监督,把消息分派至窗口函数,消息将在此被判别并处理。
4.程序不断进行2、3的操作(消息循环)。
5.当用户按下系统菜单中的Close命令项时,系统送出WM_CLOSE,通常程序的窗口函数不拦截该消息,于是DefWindowProc处理它。
6.DefWindowPro收到WM_CLOSE后,调用DestroyWindow把窗口清除,DestroyWindow本身又会送出WM_DESTROY.
7.程序对WM_DESTROY的标准反应是调用PostQuitMessage.
8.PostQuitMessage没有什么其它操作,就只送出WM_QUIT消息,准备让消息循环中的GetMessage取得,如步骤2,结束消息循环。
程序的结束比较复杂、繁琐。这是因为操作系统与应用程序职责不同,两者需要互相配合,并以消息通知对方。如果仅仅调用DestroyWindow把窗口
清除,而没有送出WM_DESTROY消息,就会出现程序的窗口虽然消失了,但是程序本身并没有结束,依然留在内存中的现象。
对于一般的C语言程序,main是函数的进入点:
int main(int argc, char *argv[])
{
...
return 0;
}
而Windows程序的进入点是WinMain:
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
...
}
在Windows系统中,最直接的程序执行方式是在Shell中以鼠标双击某一个可执行文件图标,于是shell调用加载器把该程序加载,
然后调用C startUp code,后者再调用WinMain,开始执行程序,WinMain的四个参数由系统传递进来。
首先WinMain进行一些初始化的工作,接着进入所谓的消息循环:
while(GetMessage(&msg,...))
{
TranslateMessage(&msg); //转换键盘、鼠标消息
DispatchMessage(&msg); //分派消息
}
TranslateMessage是为了将键盘消息转化,DispatchMessage会将消息传递给窗口函数去处理。在程序的生存期,通过GetMessage
不断地从消息队列中抓取消息,如果有属于我的消息,则通过DispatchMessage将消息送到窗口函数进行处理。窗口函数(可以想象成
MFC中的消息映射(Message Map))判断消息种类,以决定由那种消息处理函数进行相应的处理。
现将一个Windows程序的一般创建和结束的基本流程表示如下:
1.程序初始化过程中调用CreateWindow,为程序新建一个窗口,作为程序的屏幕舞台。CreateWindow产生窗口之后会送出WM_CREATE直接给
窗口函数,后者于是可以在此时做些初始化操作。
2.在程序活着的过程中,不断以GetMessage从消息队列中抓取消息。如果这个消息是WM_QUIT,GetMessage返回0,从而结束while循环,进而结束
整个程序。
3.DispatchMessage 通过Windows USER模块的协助与监督,把消息分派至窗口函数,消息将在此被判别并处理。
4.程序不断进行2、3的操作(消息循环)。
5.当用户按下系统菜单中的Close命令项时,系统送出WM_CLOSE,通常程序的窗口函数不拦截该消息,于是DefWindowProc处理它。
6.DefWindowPro收到WM_CLOSE后,调用DestroyWindow把窗口清除,DestroyWindow本身又会送出WM_DESTROY.
7.程序对WM_DESTROY的标准反应是调用PostQuitMessage.
8.PostQuitMessage没有什么其它操作,就只送出WM_QUIT消息,准备让消息循环中的GetMessage取得,如步骤2,结束消息循环。
程序的结束比较复杂、繁琐。这是因为操作系统与应用程序职责不同,两者需要互相配合,并以消息通知对方。如果仅仅调用DestroyWindow把窗口
清除,而没有送出WM_DESTROY消息,就会出现程序的窗口虽然消失了,但是程序本身并没有结束,依然留在内存中的现象。