开发工具的安装目录下会有include,lib目录,这两个目录下存放着OS提供的API的声明以及经过封装的一些类以方便程序员开发,封装的类提供的服务大多通过调用OS的API来实现,而真正提供OS的API实现的却在一个个dll中。我们想要使用这些API或经过封装的类的服务时,一般做法如下:
//test.cpp
#include<xxx.h>
#param comment (lib, "xxx.lib")
//调用api或使用一个经过封装的类
使用了以上方式开发的程序不能保证在任何系统下都能正常工作,因为在执行这个程序的时候,系统会动态加载系统用到的各个dll,程序依赖的这些dll不一定都存在于系统中,例如gdiplus.dll在2000下默认是没有的,当加载失败的时候,程序可能就会有问题了。
一种解决方案是:在程序的安装包里带上程序依赖的dll,但是这样会带来安装包的增大。
另一种解决方案是:如果你能允许失去一些该dll提供的api时,那么可以考虑下面介绍的方案。
(1)去掉 #param comment (lib, "xxx.lib")
(2)封装API
假设你使用了 void ApiFunc1();那么你自己提供一个void ApiFunc1();函数
该函数的实现如下:
void ApiFunc1()
{
LoadLibrary("xxx.dll");
如果加载失败,或直接返回或自己实现一个简化的版本;
如果加载成功,那么调用真正的api
}
(3)开发工具提供的一些经过封装的类提供的一些方法是直接调用api的,我们也更改这种方式。但是这些经过封装的类大多在include目录里,这个目录里的文件我们不能随便更改,那么怎么办呢?我们还是只需要按照2的方法来做即可。编译器在链接api时,由于发现我们程序里就有这个函数的实现,它就把我们自己的程序链接进去了。