前言:这是一篇总结性的文章,需要有一点C++和dll基本知识的基础,在网上查阅了很多资料感觉没有一篇详细、具体、全面的dll开发介绍,我这是根据最近项目和网上资料整理出来的,并附带实例的一个总结性的文章(由于篇幅较长故不附带源码解释)。另外,个人愚昧地认为以后C++的开发会更多地面向库的开发,所以学会库的开发必不可少。
1、 静态链接库和动态链接库
1. 静态链接库(LIB)只用在程序开发期间使用,而动态链接库(DLL)在执行期间使用。
2. 静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
3. 静态链接库,浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。另一个问题是静态库对程序的更新、部署和发布页会带来麻烦。如果静态库libname.lib更新了,所有使用它的应用程序都需要重新编译、发布给用户(对于用户来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新)。
4. 动态库则实现了增量更新,进程间可以共享动态库,节约了资源,当程序第一次调用动态库时,系统将该库加载到内存中,当另一个程序也调用这个库时,系统不再加载,而是将状态+1,当某个程序退出或释放该库时,状态则-1,直到当系统中没有程序调用该库时,系统自动将其清理并释放内存。
2、 知识点
1. 在VS中创建的类库有2种类型,一种是直接选择VC++类库(是使用微软版本的C++创建的类库),一种是Win32项目或Win32控制台程序,然后选择对应的类库类型,也就是ANSI标准的C++类库,一般我们用这种方式创建的类库,而它又分三种:Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC ExtensionDLL(MFC扩展DLL)。
2. 非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。
3. 当Windows要执行一个使用了动态链接库的程序而需要加载该链接库时,动态链接库文件必须储存在含有该.EXE程序的目录下、目前的目录下、Windows系统目录下、Windows目录下,或者是在通过MS-DOS环境中的PATH可以存取到的目录下(Windows会按顺序搜索这些目录)。
4. 动态链接库模块可能有其它扩展名(如.EXE或.FON),但标准扩展名是.DLL。只有带.DLL扩展名的动态链接库才能被Windows自动加载。如果文件有其它扩展名,则程序必须另外使用LoadLibrary或者LoadLibraryEx函数加载该模块。
5. DLL 的编制与具体的编程语言及编译器无关。只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。
3、 关键字
1. 当建立一个DLL时,它应该包含处理字符和字符串的Unicode和非Unicode版的所有函数,比如实现ANSI版和宽字符版。
#ifdef UNICODE
#define TextW //定义宽字符版的函数
#else
#define TextA //定义ANSI版的函数
#endif
2. __declspec