一.几个What
什么是API?
API是英文 Application Programming Interface 的简称,意为“应用程序接口”,泛指系统为应用程序提供的一系列接口函数。Windows API是Windows操作系统与应用程序之间的标准接口,它提供了上千个API标准函数、宏和数据结构。在使用VB,VC,Dephi编写应用程序时都可以调用Windows API函数。
什么是SDK?
SDK是英文 Software Development Kit 的缩写,指“软件开发工具包”。Windows SDK已经封装了API函数,传统Win32 SDK编程方式就是用C语言通过调用API函数按部就班的完成各部分功能。因此,SDK应用程序结构清晰,但程序员必须编写所有代码。初学者最好先进行Win32 SDK编程,直接接触底层代码,以便了解windows的消息运行机制,再慢慢转向MFC编程就容易多了。
什么是MFC?
MFC,全称Microsoft Foundation Classes, MFC(Microsoft Foundation Classes)微软基础类库,即把WinAPI进行封装的类库。它是一个类的集合,通过覆盖WinAPI,为编程提供了一个面向对象的界面。它使windows程序员能够利用C++面象对象的特性进行编程,类似BCB的OWL,Delphi的VCL组件。用Visual C++这种开发工具编程时,利用MFC向导生成通用应用程序框架,完成了那些进行SDK编程时最繁琐的部分,使程序员专注于功能模块的实现。MFC程序框架庞大复杂,掩盖了很多技术细节,故初学者如果对C++面向对象机制和Windows运行机制没有深入的理解,是很难驾驭MFC的。由于MFC封装了WinAPI函数,故在进行MFC编程必要时可以直接调用Win32 API函数。不过一般要加上全局作用域符号,例如::MessageBox(,,,,),以与int CWnd::MessageBox(,,)区分。
什么是Visual C++?
Visual C++不仅是一个C++编译器,而且是一个功能强大的可视化集成开发环境(IDE)。Visual C++的源程序要求使用C++语言编写,并可以使用功能强大的微软基础类库MFC,它可以编制各种类型的Windows应用程序,充分体现了微软的技术精华。
二.几个Concept
1.程序(Program)
程序是计算机的一组指令的集合,它告诉计算机如何实现特殊的功能,经过编译和执行才能最终完成特定的任务。程序设计中的程序=数据结构+算法。通常编写的程序(以C程序为例),编辑的.C源文件要经过编译翻译成二进制目标代码,生成.Obj文件,最后将各模块的二进制代码与系统标准模块连接处理后得到具有绝对地址的.exe可执行文件。
2.进程(Progress)
所谓进程就是应用程序的执行实例。Windows是一个多进程的操作系统。进程是程序动态的描述,两者有本质的区别。存储在硬盘上的.exe 可执行文件叫做程序,未执行时它是一个静态的二进制码的文件。一旦双击了exe文件图标运行程序,那个“正在运行着程序便称为进程。它在双击的那一刻被系统创建,当你关机或者在任务栏的图标上单击鼠标右键选“退出”时,进程便消亡,彻底结束了生命。进程经历了由“创建”到“消亡”的生命期,而程序自始至终存在于你的硬盘上,不管你的机器是否启动。
3.线程(Thread)
线程是进程中的一个执行单元,同一个进程中的各个线程对应于一组CPU指令、一组CPU寄存器以及一堆栈。进程本来就具有动态的含义,然而实质上是通过线程来执行体现的,从这个意义上说,Windows 中进程的动态性意义已经不是很明显了,只算是给程序所占的资源划定一个范围而已,真正具有动态性意义的是线程。
4.窗口(Windows)
Windows是一个基于图形用户界面的操作系统。窗口是Windows 环境下的应用程序的基本界面单位,它是应用程序与用户之间交互的接口环境,也是系统管理应用程序的基本单位。标准Windows窗口具有工具栏、标题栏、状态栏、最大化、最小化按钮。另外经常用到的对话框等控件是特殊的窗口。编写Windows应用程序首先要创建一个或多个窗口,然后应用程序的执行过程是窗口内部、窗口与窗口之间、窗口与系统之间的数据交互和数据处理。
5.句柄(Handle)
句柄是整个Windows编程的基础。它是一个4字节长的整数值,用于标识应用程序中不同对象或同类对象中不同的实例,如一个具体的窗口(HWND),画笔(HPEN),图标(HICON),文件(HFILE),按纽等。
句柄的数据类型在winnt.h中说明如下:typedef void * HANDLE;可以看出句柄是一个泛型(无类型)指针。从物理上看它是一个指针,但从逻辑上看它又不是一个指针,它不是指向一个Windows对象的存储首地址,而是指向包含了使用该内核对象有关信息的一块内存单元,比如PCB、TCB,包含对象的地址还有其他相关的信息。调用API(例如CreateProcess、CreateThread)创建内核对象时,函数会返回标志此内核对象的句柄。许多API需要句柄作为参数来访问这个句柄所代表的内核对象。
本质上,句柄并不是一个指针,而是一个Index偏移量。每个进程都有一个句柄表,这样这个进程在使用句柄的时候,Windows的kernel知道将这个句柄作为Index查询这个句柄表来获得最终的指针。这就是所说的通过句柄获得指针的方式。《Inside Windows 2000》第三章 “object manager”对于handle,handle table和kernel object的关系进行了详细阐述。
Windows窗口句柄通常是全局量,动态建立的Windows窗口对象也是全局性的。所以一个进程或线程可以取得另一个进程或线程的窗口句柄,并给它发送消息。但一个线程只能使用本线程创建的MFC窗口对象,不能使用其它线程创建的MFC窗口对象。
6.事件消息驱动机制
Windows程序与DOS控制台程序有很大的区别。DOS应用程序采用顺序执行过程,而Windows 是一个“基于事件的,消息驱动的”操作系统。
当发生用户操作键盘、操作鼠标,点击菜单,或者改变窗口的大小等事件时触发一个相应的“事件”, 消息就是描述这些事件发生的信息。当事件发生时,将向适当的窗口发送消息。所有的Windows应用程序都是消息驱动的,消息处理是windows应用程序的核心。MFC应用程序也要处理消息,MFC采用消息宏映射机制。