Windows程序运行原理

Windows程序运行原理
从Console程序 到 Windows程序
Console程序到Windows程序

概念:Windows API 函数

Windows应用程序接口(Application Programming Interface),是Windows操作系统家族的系统编程接口。
API是抽象的,仅定义系统功能的接口,与编程语言无关,与功能实现也无关。
Windows 的数次升级,其基本API的向上兼容性非常好。

实例:用Windows API编程

用Windows API建立一个应用程序。
实现:鼠标点击程序窗口,弹出消息框。

概念1:Windows基本数据类型

关于LRESULT:在wtypes.h 定义所有Windows的类型,其中有:
typedef    long        LONG;   
typedef    LONG    LRESULT;    

为什么?
Windows 希望兼容所有的计算机语言,如我们可以用C++、Basic,java来写Windows程序。
但是各种语言中对数据类型的定义存在差异。
因此Windows自己定义了一套数据类型,往往用大写字母来表示。
各种计算机语言通过重定义数据类型,实现与Windows的匹配。

Windows基本数据类型表
Windows基本数据类型表
Windows基本数据类型表

概念2:Windows句柄----一个很难理解的概念

概念:句柄是Windows的独有的一种数据类型,是一个32位整数。它是Windows用来记录、控制所分配资源的一个控制点。
句柄是整个windows编程的基础,用于标志应用程序中的所有不同的对象。如窗口、按钮、图标、滚动条、光标、文件等。
句柄很类似C++中的指针,都是用来“指向”对象的,但是有很大区别。

为什么要用句柄?用指针不是更简单吗?
1.客观原因: 许多语言没有“指针”。。。微软汗。。。
2.主观原因: Windows是一个以虚拟内存为基础的操作系统,内存管理器经常在内存中来回移动对象,来满足各种应用程序的内存需要。对象被移动意味着地址是动态改变的,于是指针这玩意不太好用了。。。
于是,微软的码农们想到:单独开辟一个地方,存放一种“指针的指针”,对程序来说,一个对象只有一个固定的句柄;而对Windows来说,只需要在移动对象的时候自动修改一下句柄指向的地址,就OK万事大吉了。

Windows句柄
程序中的对象对应一个唯一的句柄,
句柄存放在系统的句柄区域,
系统自动更改句柄指向的动态内存地址,
但对象的句柄总是不变的。

为了区分不同的对象类型,Windows定义了许多种不同的句柄,如常用的如下:

概念3:窗口类、WinMain

Windows为什么叫windows?
程序的主界面往往是一个包含各种功能的“窗口”
这种窗口,实际上是一个窗口类的对象。
窗口类:WNDCLASS
指定窗口的类型、属性、外形等特征
Windows程序有一个唯一的WinMain主函数。
WinMain函数中进行的操作:
定义窗口类对象
向系统注册窗口类对象
显示窗口

概念4:事件和消息----重要概念

“售货员”的工作:顾客不买东西时,售货员不产生任何动作。当顾客购物、询价时,售货员才回应。
Windows程序类似“售货员”
当程序启动、创建窗口后,程序进入“等待”状态,直到接受到某种“刺激”——如键盘点击、鼠标移动和点击、收到网络信息等——程序脱离等待状态,处理该“刺激”。

上述的种种“刺激”,称为“事件”
一个事件的要素:时间、地点、类型、内容。
为了描述事件要素,Windows定义了一个数据结构,称为“消息”(Message)。

Windows预先定义了大多数事件的消息,并为每种消息定义了消息标识码,如:

WM_LBUTTONDOWN      鼠标左键按下消息
WM_RBUTTONDBLCLK            鼠标右键双击消息

为了保证程序能始终等待响应用户的消息,程序会建立一个“死”循环,来不断等待处理消息。
死循环!怎么退出?
不要着急,“关闭程序”也是一个用户消息,当点击关闭时,会响应该消息,关闭程序。
程序不断检测是否有事件发生,如果有,则进入消息循环,分析这个事件的消息,并找到程序中对应的消息处理程序段, 执行处理程序,然后返回消息循环。

消息处理程序,专门用来响应各种消息。一般来说,用户需要自己编写消息处理函数代码,实现对消息的响应。

概念5:窗口过程函数

窗口函数是负责处理各种窗口消息的函数
完整的Windows程序,必须包含两个独立的函数:
WinMain 主函数 :负责初始化主界面的各种元素、进行必要的设置、完成某些固定要做的功能,并启动消息循环,等待系统的消息响应。
WinProc 窗口函数 :负责实现消息循环,在消息循环中实现各项程序功能。
关于窗口过程函数的具体执行过程,涉及到系统的回调函数、系统消息队列、系统消息解析、分发、响应等更深的内容。
我们在这里,不再做要求,仅需要大家知道Windows程序执行的基本原理。


Windows程序执行流程

再看Windows API编程

使用API的优点:直接操作系统,理论上讲,任何Windows程序,都可以用API组合实现。
缺点:非常繁琐,非常难懂,非常多(1000+)

码农前辈们的做法:对API进行再封装:
封装成类库,形成统一的框架:MFC
封装成各种语言开发包:VC、VB、Delphi、C++Builder

什么是MFC?
MFC = Microsoft  Foundation  Classes 微软基础类库

MFC是一个程序零件超市,其中已经定义好了所有零件的功能,和零件之间的关系;我们选择自己喜欢的零件,兜出一个新的应用程序。
——侯捷《深入浅出MFC》

MFC帮助我们把大量的API函数,利用面向对象原理,合理封装起来,具有清晰的逻辑性和层次性,大大降低程序开发难度。

MFC与Windows API的关系


MFC设计了许多许多类,每个类都可以看作是对某些Windows API的封装,通过引用MFC的类,可以方便的实现对Windows API的调用。

MFC编程的核心思想——继承

MFC提供了一组类库,但怎样才能使用这些类库灵活编程呢?——从MFC中继承,对派生类编程。

PPT

Windows编程原理部分结束!
从现在开始,我们开始挑战MFC!

Related Articles

Quote Of The Day