背景:
今天编译程序的时候发现,dll在系统中显示无法加载,因为是二次开发,如果dll没有加载的话,相对应的功能就无法使用。
之前也通过反编译看对应的dll里面的方法,然后找到对应功能的API,但是对于系统加载dll的原理还是不是很清楚。
基本概念:
>>动态链接库(DLL,即 “Dynamic-Link Library”)是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共 代码或资源。DLL是Windows的基石,所有的Win32 API函数都包含在DLL中。
动态链接库一般不能直接执行,而且它们一般也不接收消息。
它们是包含许多函数的独立文件,这些函数可以被应用程序和其他 DLL 调用以完成某些特定的工作。
一个动态链接库只有在另外一个模块调用其所包含的函数时才被启动
采用dll的好处:
1 可以采用多语言看来编写
2 增强产品的功能
3 提供二次开发的平台
4 简化项目管理
5 节省磁盘空间和内存,只需要一份的内存空间,多个进程和同时引用同一个dll文件,有利于资源共享,有利于实现应用程序的本地化。
DLL的调用方式:
静态调用中,由编译系统完成对DLL的加载和应用程序结束时DLL的卸载。
动态调用中,由编程者用API函数加载和卸载DLL(DLL加载—DLL函数地址获取—DLL释放)方式。
Dll与exe的差别:
a.Exe有自己的进程空间,dll没有,dll只能被引用后,和exe共享进程空间才能被调用和运行(其实还有rundll32命令可以启动dll,该系统命令本质上就是为其提供进程空间)。
b.dll也叫动态链接库,可以将反复使用的共有代码和资源放在动态链接库中,这样在内存中只会有一个副本,节约内存空间(不同的进程根据不同的重定位信息可以定位到制定的dll中)
在测试过程中应该注意:
1.DLL是和由调起他的EXE共享进程空间的,所以在测试过程中,需考虑两者之间的兼容,比如初始化时是否重复初始化导致崩溃。
2.完全调用某DLL的EXE程序测试通过,并不代表该DLL测试通过
3.不要轻易相信研发说的:就是一样,没关系的,类似这样的话。