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

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名字大小写完全相同.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值