1 常用名词
API:Application Programming Interface,系统开放出来,给程序员使用的接口,就是API。
SDK:Software Develpment Kit,原指软件开发工具。每一套环境都可以有自己的SDK。在Windows这一领域,SDK原是指Microsoft的软件开发工具,但是现在已经变成一个专有名词。凡是以indows raw API撰写的程序我们通常也称为SDK程序,也有人把Windows API称为SDK API。
MFC:Microsoft Foundation Classes 的缩写,这是一个建立在Windows API 之上的C++类库,意图使Windows程序设计过程更有效率,跟符合面向对象的精神。
OWL:Object Windows Library 的缩写,这也是一个具备Application Framework架势的C++类库,附含在Borland C++之中。
Application Framework:在面向对象领域中,这是一个专有名词。基本上可以说它是一个更有凝聚力、关联性更强的类库。并不是每一套C++类库都有资格称为Application Framework,不过MFC和OWL都可以列入。Application Framework当然不一定是指C++类库,java和Delphi应该也称得上。
2 需要什么函数库(。lib)
众所周知,windows支持动态链接。换句话说,应用程序所调用的windows API 函数是在程序“执行期间”才链接上的。那么链接时期所需要的函数库有哪些?做什么用?
注意:并不是后缀名为.dll的才是动态链接函数库(DLL,Dynamic Link Library),事实上,.dll、.exe、.fon、 .mod、.drv、.ocx都是所谓的动态链接函数库。
Windows程序调用的函数可分为C Runtimes 以及windows API 两大部分。以下是它们的命名规则和使用时机。
C Runtimes library:(编译器生产商提供)
libc.lib —— C Runtimes 函数库的单线程静态链接版本,
msvcrt.lib —— C Runtimes 函数库的多线程动态链接版本(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。
Windows发展至今,逐渐加上的一些新的API函数(如Common Dialog,ToolHelp)并不放在GDI,USER,KERNEL三大模块中,而是放在诸如COMMDLG.DLL,TOOLHELP.DLL之中。如果要使用这些APIs,链接是还得加上这些DLLs所对应的import函数库,诸如COMDLG32.LIB和TH32.LIB。
补充:动态链接库和静态链接库(摘自VC++深入详解)
静态链接库:
函数和数据被编译成一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据,并把它们和应用程序中的其他模块组合起来创建最终的可执行文件(.EXE文件)。当发布产品时只需要发布这个可执行文件,并不需要发布被使用的静态库。
动态链接库:
在使用动态库的时候,往往提供两个文件:一个引入库文件(.lib)和一个DLL(.dll)文件。虽然引入库的后缀名也是lib,但是动态库的引入库文件和静态库文件有着本质上的区别。对一个DLL来说,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL的实际的函数和数据。在使用动态库的情况下,编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件中,直到可执行程序运行时,才去加载所需要的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出的函数。这时,在发布产品时,除了发布可执行文件同时还要发布改程序将要调用的动态链接库。
自从微软推出第一个版本的Windows操作系统以来,动态链接库一直是Windows操作系统的基础。动态链接库通常不能直接运行,也不能接受消息,它们是一些独立的二进制文件,其中包含能被可执行程序或其他DLL调用来完成某项工作的函数。只有在其他模块调用动态链接库中的函数时,它才发挥作用。在实际编程时我们可以把完成某种功能的函数放在一个动态链接库中,然后提供给其他函数调用。
Windows API中所有函数都包含在DLL中,其中有三个最重要的DLL
Kernel32.dll 它包含那些用于管理内存、进程和线程的函数,例如CreatThread函数;
User32.dll 它包含那些用于执行用户界面任务(如窗口的创建和消息的传送)的函数,例如CreatWindows函数;
GDI32.dll 它包含那些用于画图和显示文本的函数。
使用动态链接库的好处
1)可以采用多种编程语言来编写。可以采用自己熟悉的编程语言来编写DLL,然后由其他语言编写的可执行程序来调用这些DLL。
2)增强产品的功能。可以用新的产品的DLL取代原来发布的旧的DLL,对于升级软件版本更容易。
3)节省磁盘空间和内存。如果多个应用程序需要访问同样的功能,那么将该功能以DLL形式提供,这样机器上只需要存在一份DLL文件,节省磁盘空间;如果多个应用程序使用同一个DLL,该DLL得页面只需要放入内存一次,所有的应用程序就都可以共享它的页面了,内存使用更加有效。
4)有助于资源共享。编写一个动态链接库,许多应用程序可以共享这个DLL。
3 需要什么样的头文件
所有的Windows程序都必须载入windows.h文件。不过windows.h文件只包含三大模块所提供的API函数,如果你用到其他system DLLs,例如COMMDLG.DLL或MAPI.DLL等就的载入对应的头文件,例如COMMDLG.H或MAPI.H等。
(由此看出,动态链接库DLL有其对应的导入库.LIB和头文件。在编写代码时要include相应的头(.H)文件;在链接时链接相应的导入库(.LIB)文件;在程序运行时加载所需要的DLL,然后“跳”到DLL中执行。)