一,分类
1.静态库:
使用静态库时候,发布产品不需要(.dll)文件.
静态库中 函数 和 数据都在(.LIB)文件当中.
2.动态库:
组成: 引入库(.lib):声明函数及变量的符号名.
DLL(.dll):函数的具体实现过程.
二.DLL创建
1.DLL中的函数必须声明为 _declspec (dllexport) 才可以被其他客户端程序调用.
2.客户端程序中使用函数前需要声明. 可以为 extern 声明, 也可以是 _declspec (dllimport) 声明.
三.DLL加载
1.隐式加载(vc++)
(1) .lib 与 .dll 拷贝倒当前工程目录下
(2) 在VC中设置引入 引入库文件(.lib)
(3)函数声明. #include "myDll.h"
2.显示加载
代码如下:
(1)HINSTANCE hInst;
(2)hInst = LoadLibrary("Dll.dll");//加载DLL模块,参数:文件名,返回值:文件句柄
(3)typedef int (*PROC)(int a, int b);
(4)PROC proc = (PROC)GetProcAddress(hInst, " add" );//加载DLL中的函数,参数:文件句柄/函数名,返回值:函数指针
(5) proc (4, 6);
四.其他
1.dumpbin命令
//查看.dll或.exe的导入,导出函数
dumpbin -export dll.dll
dumpbin -import test.exe
2.Depends工具
//查看.dll 或 .exe文件中的动态链接库的依赖情况, 可以查看.dll中函数情况
3.名字改编问题
引发原因:(一):不同编译器对函数进行名字改编,所以imports时候出错.例如C++,C
(二):调用约定不同: __cdecl :c调用 , __stdcall: 标准调用约定
解决方法:(一):extern "C": 解决c++与c直接的冲突. 不适于含有类的DLL引入C文件. 不能解决调用约定问题
(二):模块定义文件(DEF): 在工程源文件中添加文件 xxx.def .内容如下
LIBRARY DllNname
EXPORTS
utName = interNname
4.DllMain() 函数
系统加载DLL时,自动调用DllMain()函数
作用:(1):返回DLL的句柄地址
(2):DLL的调用方式
5.VC++6.0支持MFC DLL
(略)