其他分享
首页 > 其他分享> > win32 dll

win32 dll

作者:互联网

动态库的特点

运行的时候独立存在(有自己的主函数,但是需要依附别的程序执行),是一个独立的进程,有着自己独立的空间
源码不会被link.exe(链接)到执行程序
使用的时候加载

.dll 文件包含两个部分每一个部分是文件头(存函数的 pointer[下标0,函数名字,函数指针]),一个是正文(存源码)如图
编号 函数名字 函数相对地址
0 add af9090
1 sub aa8888
函数源码
配套生成的lib文件存{对应 .dll文件的文件名,[导出函数的名字,下标编号]}配到的lib文件如图

相应dll文件的名字



0add

1sub

dll 比较 lib

1. lib 是将代码嵌入到程序,使用的程序越多,会有多分代码,体积就会在增大,动态库只需要存在一份,其他程序通过函数的地址使用
2. lib 发生变化之后,需要重新链接嵌入代码。dll只要函数的定义(或者地址)没有变化,dll程序不需要重新链接
3. 在link的时候 lib 的源码就被link在了 exe 里面,此时的lib文件就可以删除了,而dll的话,就是把指针放进去

导出dll库程序

1. 方法一:申明导出:使用 _declspec(dllexport)导出函数{在需要导出的函数前面加上这个关键字}[dll编译之后会生成生成名字相同的lib文件,用来作为动态库的映射使用,于lib库不完全相同]
_declspec(dllexport) int add(int a,int b) {   //导出的是地址
	return a + b;
}
2. 方法二:模块定义文件 .def(此时不需要加_declspec(dllexport))[此时就不会给我们改名字了]
LIBRARY 
EXPORTS
   sub @1
   XXX @2

使用动态库

隐式链接(操作系统让dll执行)
	1. 需要使用动态库文件的函数原型前申明 _declspec(dllimport)
	2. 导入dll的lib文件[#pragma comment(lib,"../x64/debug/cDll.lib")]
	3. 调用

显式链接(程序员让dll执行,此时不需要使用#pragma comment导入对应的lib文件)
	1. 定义函数指针[接收函数的指针]
	2. 加载动态库[让动态库进内存]{HMODULE|HINSTANCE LoadLibrary(LPCTSTR lpFileName); 返回dll实例句柄}
	3. 获取函数地址[FARPROC GetProcAddress();//成功返回函数加载后内存绝对地址]
	4. 使用函数[]
	5. 卸载动态库[BOOL FreeLibrary(HMODULE hModule);//释放空间]

隐式链接dll文件测存放位置

1. 与可执行文件在同一目录下面(强烈建议)
2. 当前项目的目录下面
3. windows
4. windows/system32
5. windows/system
6. 环境变量指定的path目录

标签:文件,函数,lib,导出,dll,win32,动态
来源: https://www.cnblogs.com/sqmw/p/16535336.html