Windows程序设计
虽然做了一段时间的MFC了,但是对windows程序设计感觉还是那么的陌生,可能上微软把那个框架包的太好了,总看不到深层的东西,今天看了一点侯捷的MFC深入浅出,总算对windows这个东西还有了点感觉。以下摘自侯捷的MFC深入浅出
1. Windows程序开发流程
Windows 程序分为「程序代码」和「UI(User Interface)资源」两大部份,两部份最后以RC编译器整合为一个完整的EXE 文件(图1-1)。所谓UI 资源是指功能菜单、对话框
外貌、程序图标、光标形状等等东西。这些UI 资源的实际内容(二进制代码)系借助各种工具产生,并以各种扩展名存在,如.ico、.bmp、.cur 等等。程序员必须在一个所谓的资源描述档(.rc)中描述它们。RC 编译器(RC.EXE)读取RC 档的描述后将所有UI资源档集中制作出一个.RES 档,再与程序代码结合在一起,这才是一个完整的Windows可执行档。
2. 需要什么样的链接库
众所周知Windows 支持动态联结。换句话说,应用程序所调用的Windows API 函数是在「执行时期」才联结上的。那么,「联结时期」所需的函数库做什么用?有哪些?并不是延伸档名为.dll 者才是动态联结函数库(DLL,Dynamic Link Library),事实上.exe、.dll、.fon、.mod、.drv、.ocx 都是所谓的动态联结函数库。
Windows 程序调用的函数可分为C Runtimes 以及Windows API 两大部份。早期的C
Runtimes 并不支持动态联结,但Visual C++ 4.0 之后已支持,并且在32 位操作系统
中已不再有small/medium/large 等内存模式之分。以下是它们的命名规则与使用时机:
■ LIBC.LIB - 这是C Runtime 函数库的静态联结版本。
■ MSVCRT.LIB - 这是C Runtime 函数库动态联结版本(MSVCRT40.DLL)的import 函数库。如果联结此一函数库,你的程序执行时必须有MSVCRT40.DLL在场。
另一组函数,Windows API,由操作系统本身(主要是Windows 三大模块GDI32.DLL 和USER32.DLL 和KERNEL32.DLL)提供(注)。虽说动态联结是在执行时期才发生「联结」事实,但在联结时期,联结器仍需先为调用者(应用程序本身)准备一些适当的信息,才能够在执行时期顺利「跳」到DLL 执行。如果该API 所属之函数库尚未加载,系统也才因此知道要先行加载该函数库。这些适当的信息放在所谓的「import 函数库」中。32 位Windows 的三大模块所对应的import 函数库分别为GDI32.LIB 和USER32.LIB和KERNEL32.LIB。
3.需要什么样的头文件
所有Windows 程序都必须包含WINDOWS.H。早期这是一个巨大的头文件,大约有5000行左右,Visual C++ 4.0 已把它切割为各个较小的文件,但还以WINDOWS.H 总括之。
除非你十分清楚什么API 动作需要什么头文件,否则为求便利,单单一个WINDOWS.H也就是了。不过,WINDOWS.H 只照顾三大模块所提供的API 函数,如果你用到其它system DLLs,例如COMMDLG.DLL 或MAPI.DLL 或TAPI.DLL 等等,就得包含对应的头文件,例如COMMDLG.H 或MAPI.H 或TAPI.H 等等。
//对于MFC设计,除了这些链接库之外,他还额外的需要其他的头文件。
MFC 程序不这么单纯,下面是它常常需要面对的另外一些.H 档:
STDAFX.H :这个文件用来做为Precompiled header file(请看稍后的方块说明),其内只是包含其它的MFC 头文件。应用程序通常会准备自己的STDAFX.H,例如本章的Hello 程序就在STDAFX.H 中包含AFXWIN.H。
AFXWIN.H :每一个Windows MFC 程序都必须包含它,因为它以及它所包含的文件声明了所有的MFC 类别。此档内含AFX.H,后者又包含AFXVER_.H,后者又包含AFXV_W32.H,后者又包含WINDOWS.H(啊呼,终于现身)。
AFXEXT.H : 凡使用工具栏、状态列之程序必须包含这个文件。
AFXDLGS.H : 凡使用通用型对话框(Common Dialog)之MFC 程序需包含此
档,其内部包含COMMDLG.H。
AFXCMN.H : 凡使用Windows 95 新增之通用型控制组件(Common Control)
之MFC 程序需包含此文件。
AFXCOLL.H : 凡使用Collections Classes(用以处理数据结构如数组、串行)之程序必须包含此文件。
AFXDLLX.H : 凡MFC extension DLLs 均需包含此档。
AFXRES.H - MFC 程序的RC 文件必须包含此档。MFC 对于标准资源(例如File、Edit 等菜单项目)的ID 都有默认值。