现在的位置: 首页 > 综合 > 正文

关于VS的延迟加载dll的使用和理解

2018年02月09日 ⁄ 综合 ⁄ 共 972字 ⁄ 字号 评论关闭

延迟加载dll:
当一个应用程序过多加载dll的时候,如果都是在启动时加载,那么无疑会减慢程序启动速度,而且会让初始的程序就占用很大内存

空间,但并不是所有的dll都是经常使用的,有些可能仅在特殊情况下才会使用到,比如你需要打印功能时,额外的一个dll用于负责

此事,但这项功能可能很少人使用,如果程序一启动就加载会有些浪费,谓词微软提供了延迟载入dll的功能,就是当你执行到某个

函数的时候,如果是首次执行,那么可以在用到时加载该dll,甚至可以在用完再重新释放卸载掉该dll。方法比较简单,只需要以下

几个步骤即可:
1:必须和原来加载dll一样在input中放入相关的lib文件用于程序链接的时候能找到。否则编译不过
2:在linker-》input里的Delay loaded Dlls中写入相关的需要延迟载入的dll名称,注意,这里不是写入lib文件,而是写入dll文

件全名。他的作用是
 1)告诉编译器将该dll文件从可执行模块的导入段中去除,这样初始化的时候就不会加载该dll了,
 2)在可执行模块嵌入一个新的延迟载入段(即Delay import section称为.didata)来表示要从mydll。dll中导入哪些函数 
 3)通过让延迟载入函数的调用跳转到__delayLoadHelper2函数,来完成对延迟载入函数的解析。
3:在linker-》advanced里面打开“delay Loaded Dll”里打开unload开关,使他support Unload。这样就支持使用后即可通过

__FUnloadDelayLoadedDLL2来调用卸载。

通过延迟载入后,相关的函数会被重置,如果我们不用__FUnloadDelayLoadedDLL2来卸载,而直接用FreeLibrary卸载的话,由于相

关函数没有被重置,这样当我们下一次试图调用dll的函数时,就会引发访问违规。
在调用__FUnloadDelayLoadedDLL2时,需要注意,我们传入的dll名字无路径,且大小必须和传入给/DelayLoad链接器开关的dll名字

大小写完全相同,否则无效。如果调用了卸载函数,而没有打开链接器的unload开关,则函数调用没任何效果。

延迟载入的另一个特性就是我们调用的函数会被绑定到进程地址空间中的一个内存地址上,这个地址是系统认为该函数应该在的位置

抱歉!评论已关闭.