延迟载入DLL的局限 以及 应用

来源:互联网 发布:进度计划软件project 编辑:程序博客网 时间:2024/05/29 08:14

1。一个导出了字段(数据,全局变量)的DLL是无法延迟载入的

2。kernel32.dll是无法延迟载入的.因为载入该模块才能调用LoadLibrary和GetProcAddress

3。不应该在DllMain入口点函数中调用一个延迟载入的函数,因为这样可能会导致程序崩溃.

 

注意第二条,看,看,看到了没 "因为载入该模块才能调用LoadLibrary"

也就是说, 如果静态连接的函数选用了延迟导入,那么加载函数也会用到LoadLibrary,再想想SetDllDirectory, 想到了什么呢

 

没错,我们甚至可以调用SetDllDirectory函数来指定隐式联结的DLL模块的路径,只要在调用该DLL的函数之前先调用SetDllDirectory

 

//

//

延迟DLL的设置位置: Configuration Properties/Linker/Input ------ Delay Loaded DLLs

/DELAYLOAD:"MyDealyLoadedDLL.dll"

 

可以设置多个延迟DLL

 

如果想在程序中卸载延迟载入的DLL

需要设置另一开关: Configuration Properties/Linker/Advanced ----------------- Delay Loaded DLL

/DELAY:UNLOAD

 

在代码中调用

ExternC
BOOL WINAPI
__FUnloadDelayLoadedDLL2(LPCSTR szDll);

来卸载一个延迟加载的DLL

不要直接用FreeLibrary, 不然已经加载的函数地址不会重置,下次再调到延迟DLL的函数会导致程序崩溃.

调用__FUnloadDelayLoadedDLL2时候传入的DLL名字不应该包含路径,并且名字中字母的大小写必须和传入/DelayLoad链接器开关的DLL名字大小写完全相同.

 

 

原创粉丝点击