延迟加载的学习

模块加载有三种方式:

1、隐士链接:在应用程序编译时就链接到模块,并在应用程序进程初始化时就加载到进程空间。

2、显示链接:在应用程序运行时使用LoadLibrary函数动态加载模块。

3、延迟加载:属于隐士链接,不同的是只有当应用程序在引用该模块的符号时才加载。

 

vs2005设置延迟加载步骤为:

Properties->Configration Properties->Linker->Input->Delay Loaded Dlls中添加需延迟加载的dll。

 

参考资料,Copy如下:

 

延迟加载作用:

1、如果你的应用程序使用若干个DLL,那么它的出事胡时间就比较长,因为加载程序要将所有需要的DLL映射到进程的地址空间中。解决这个问题的方法之一是在进程运行的时候分开加载各个DLL。延迟加载的DLL能够容易地完成这样的加载。

2、如果调用代码中的一个新函数,然后试图在老版本的系统上运行你的应用程序,而该系统中没有该函数,那么加载程序就会报告一个错误,并且不允许该应用程序运行。你需要一种方法让你的应用程序运行,然后,如果(在运行时)发现该应用程序在老的系统上运行,那么你将不调用遗漏的函数。

 

延迟加载缺点:

延迟加载的代价就是可执行文件变大和一定程度(很小)的调用性能损失。

 

延迟加载dll原理
延迟加载技术并不是系统原生功能,而是通过间接的方式在软件自身的代码中实现的。其原理大致就是建立一个虚拟的dll代理对象,所有对延迟dll中符号的引用在编译链接时都指向这个代理对象,运行时第一次调用到这个代理对象时,代理对象会实际的去加载相应的dll并得到真正的符号地址,然后把指向代理的引用都转接到真正的地址去。虽然这个表述显得有些粗略,但是可以明确:
1、延迟加载的dll最终还是通过LoadLibrary来显示加载的。
2、延迟加载的dll在编译期却是隐式连接的,只不过实际上隐式连接到了一个虚拟的代理对象。
3、在vc2005中还可以设定延迟加载的dll可以被卸载(调用__FUnloadDelayLoadedDLL ),我没有注意过其他版本是否有这个选项(按理说应该都会有,包括vc6),这意味着对隐式加载有更大的控制性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值