Windows程序的基本运行流程

本文介绍了Windows程序的启动过程及基本运行流程,包括WinMain函数的作用、消息循环的工作原理,以及窗口创建和销毁的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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消息,就会出现程序的窗口虽然消失了,但是程序本身并没有结束,依然留在内存中的现象。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值