言前:由于最近复习了下动态链接库,所以决定写一个动态链接库专题。动态链接库网上各种达人已近写过很多了,资料也是一大把一大把的。但是我还是想写一份,因为网上讲的都很分散,讲的不是很系统,而且很多问题没有深究。因此我自己还是写一份吧,因为说明了是浅析。所以说我不可能讲的太深入,但是本文还是立足于有一定动态链接库编程基础的读者。 动态链接库专题我准备分为4篇文章来介绍 1.Win32 动态链接库 2.MFC常规动态链接库 3.MFC扩展动态链接库 4.各种链接库总结对比
好吧,现在就开始Win32 动态链接库编程吧。首先还是简单的介绍下基本知识(由于本人比较懒,所以只是大概提一下基本知识,这点上不会很全面,但是本人还是强烈建议大家,还是首先在网上系统的学习一下动态链接库的最基本知识。如动态链接库在内存上的映射方式,查看动态链接库的导入导出啊等等之类的最最最基本的知识)
基础知识:
1.动态链接库有很多的优点:如隐藏实现细节,实现代码共享,便于升级产品,可以在不同语言之间交互等等。
2.我们在编写好了动态链接库以后,我们必须导出我们留给用户使用的接口,然后用户在自己的程序里导入这些接口以便自己使用。导出的方式会有两种,一种是使用dllimport/dllexport ,还有一种是使用def 模块定义文件来导出,在后面我们会详细全面的介绍这种到出方法
3.调用:一共有两种调用动态链接库的方方式
动态调用:在程序中使用 LoadLibrary()/FreeLibrary() 动态的获得函数,类成员变量的指针。然后通过指针调用函数/成员函数。这种方法比较适合大型项目中使用,用户在我们要使用动态链接库的时候才去加载,使用完了以后就释放掉,这样对内存的利用效率还是比较高的。
静态调用:使用#pragma comment(lib,"XXXX.lib")或在编译器中设置,相关选项,来使用动态链接库,这种方式比较方便,不用我们显示的加载和释放动态链接库。程序在运行时会自动的去加载我们制定的动态链接库。在这种情况下我们可以用dumpbin 的imports 命令来查看到导入的动态链接库的接口。如果是动态调用的话,我们是无法查看到我们自己导出的动态链接库的imports信息的哦
动态链接库调用路径
- 程序载入的目录.
- 当前目录.
- system目录. 使用GetSystemDirectory 函数获取这个目录路径.
- Windows目录. 使用GetWindowsDirectory函数可以获取该目录路径.
- PATH 环境变量设置的目录列表
4.我们导出的动态链接库通常,编译器在编译的时候通常都会给我们的函数修改名称这导致了,导出的函数的名称相应的发生了改变。下面便是编译器改名的具体规则。
对于C语言编译器
对于__stdcall调用约定,编译器和链接器会在输出函数名前加上一个下划线前缀,函数名后面加上一个“@”符号和其参数的字节数,例如_functionname@number。__cdecl调用约定仅在输出函数名前加上一个下划线前缀,例如_functionname。__fastcal