死亡以及多任务环境下程序之间共存的观念。至于第二项基础将由第二章为你夯实。
================================== ABC Amber CHM Converter 7.31 Trial version
==================================
图1-1 一个32位Windows SDK程序的开发流程
需要什么函数库(.LIB)
众所周知Windows 支持动态链接。换句话说应用程序所调用的Windows AI 函数是在「运行时」才链接上的。那么「链接时期」所需的函数库做什么用?有哪些?
并不是延伸文件名为 .dll 者才是动态链接函数库(DLLDynamic Link Library)事实上 .exe、.dll、.fon、.mod、.drv、.ocx 都是所谓的动态链接函数库。
Windows 程序调用的函数可分为 C Runtimes 以及 Windows AI 两大部分。早期的 C Runtimes 并不支持动态链接但Visual C++ 4.0 之
后已支持并且在32 位操作系统中已不再有small/medium/large 等内存模式之分。以下是它们的命名规则与使用时机 :
LIBC.LIB - 这是C Runtime 函数库的静态链接版本。
MSVCRT.LIB - 这是C Runtime 函数库动态链接版本(MSVCRT40.DLL)的 imort 函数库。如果链接此一函数库你的程序执行时必须有 MSVCRT40.DLL 在场。
另一组函数Windows AI由操作系统本身(主要是 Windows 三大模块 GDI32.DLL 和 USER32.DLL 和 KERNEL32.DLL)提(注)。虽说动态链接是在运行时才发生「链接」事实但在链接时期链接器仍需先为调用者(应用程序本身)准备一些适当的资讯才能够在运行时顺利「跳」到 DLL 执行。如果该 AI 所属之函数库尚未加载系统也才因此知道要先行加载该函数库。这些适当的信息放在所谓的「imort 函数库」中。32 位 Windows 的三大模块所对应的 imort 函数库分别为 GDI32.LIB 和 USER32.LIB 和 KERNEL32.LIB。
Windows 发展至今逐渐加上的一些新的 AI 函数(例如 Common Dialog、ToolHel)并不放在GDI和USER 和KERNEL三大模块中而是放在诸如COMMDLG.DLL、 TOOLHEL.DLL之中。如果要使用这些AIs链接时还得加上这些DLLs 所对应的imort函数库诸如COMDLG32.LIB
和 TH32.LIB。
很快地在稍后的范例程序“Generic”的makefile中你就可以清楚看到链接时期所需的各式各样函数库(以及各种链接器选项)。
需要什么头文件(.H)
所有Windows程序都必须含入WINDOWS.H。早期这是一个巨大的头文件大约有5000 行左右Visual C++ 4.0 已把它切割为各个较小的文件但还以 WINDOWS.H 总括之。除非你十分清楚什么 AI 动作需要什么头文件否则为求便利单单一个 WINDOWS.H 也就是了。
不过WINDOWS.H
只照顾三大模块所提的AI 函数如果你用到其它 system DLLs例如 COMMDLG.DLL 或 MAI.DLL 或 TAI.DLL 等等就得含入对应的头文件例如COMMDLG.H 或 MAI.H 或 TAI.H 等等。
以消息为基础以事件驱动之(message basedevent driven)
Windows 程序的进行系依靠外部发生的事件来驱动。换句话说程序不断等待(利用一个 while 循环)等待任何可能的输入然后做判断然后再做适当的处理。上述的「输入」是由操作系统捕捉到之后以消息形式(一种数据结构)进入程序之中。操作系统如何捕捉外围设备(如键盘和鼠标)所发生的事件呢?噢USER 模块掌管各个外围的驱动程序它们各有侦测循环。
如果把应用程序获得的各种「输入」分类可以分为由硬件装置所产生的消息(如鼠标移动或键盘被按下)放在系统队列(system queue)中以及由 Windows 系统或其它Windows 程序传送过来的消息放在程序队列(alication queue)中。以应用程序的眼光来看消息就是消息来自哪里或放在哪里其实并没有太大区别反正程序调用GetMessage AI就取得一个消息程序的生命靠它来推动。所有的GUI系统包括UNIX的X Window 以及OS/2的resentation Manager都像这样是以消息为基础的事件驱动系统。
可想而知每一个Windows程序都应该有一个循环如下:
MSG msg;
while (GetMessage(&am;msg, NULL, NULL, NULL)) {
TranslateMessage(&am;msg);
DisatchMessage(&am;msg);
} // 以上出现的函数都是Windows AI 函数
消息也就是上面出现的MSG结构其实是Windows内定的一种数据格式:
/* Queued message structure */
tyedef struct tagMSG {
HWND hwnd;
UINT message; // WM_xxx例如 WM_MOUSEMOVEWM_SIZE...
WARAM waram;
LARAM laram;