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

DLL加载方式-动态vs静态

2013年08月30日 ⁄ 综合 ⁄ 共 1880字 ⁄ 字号 评论关闭

静态加载比较方便,动态加载比较灵活一些,对于不常用的代码,可以在使用时LoadLibrary,在不用时FreeLibrary,不必长时间占用内存资源。有些情况(例如导出类)只能用静态加载的方式。从代码维护角度来说,两者差别不大,用静态略微方便一些。
静态加载,简单方便,但是不够灵活

动态加载,复杂一些,需要显示地获取函数调用地址,但是很灵活,可以随时加载和卸载

 

--------------------------------------------------------------------------------
这个问题第5个回答:
有一种典型情况,需要用动态加载

当你不能确定动态库是否存在时,可以用LoadLibrary加载,如果返回失败,就可以直到该动态库不存在,如果用静态加载的话,就会弹出系统出错框
--------------------------------------------------------------------------------
第6个回答:
 静态加载自动link进去了,调用的时候,只需要在别的工程中包含对应的h,lib文件,然后就可以直接调用了,实际运行的时候,把对应的静态加载比较方便,
 动态加载比较灵活一些,对于不常用的代码,dll放到当前路径等。动态加载就是代码中LoadLibrary,GetProcAddress来调用函数,只需要h和dll就够了,而且可以FreeLibrary,这样可以动态变化,不会一直占用进程的内存空间,方便控制,一般都是使用这个了,有些情况(例如导出类)只能用静态加载的方式。
--------------------------------------------------------------------------------
这个问题第8个回答
对于MFC类库和windows类库:
  我们一般在VS.net下开发的程序,需要这些类库的支持,但是对于没有VC环境的电脑,静态加载(实际就是静态加载了MFC或者windows库)就是将它所依赖的库加载到程序中,这样,程序就不用担心一直到不同用户的机子上,会运行不起来。静态加载,对于不含有VC环境的电脑上使用开发程序是一种很大便利。
  对于COM/ActiveX控件,如果使用动态库的话,控件就结构就比较的复杂,因为控件是个精细的东西。如果控件库依赖缺少,就会导致控件下载不下来,或者注册不上。而且动态库的依赖,需要在INF配置文件中有严格的书写,不然也会导致不能下载,更别说智能升级了。但是对于使用静态加载的话,所有的依赖性,都最后包含在生成的最终文件中,只有一个文件,处理起来相当的便利。

可以说,对于发布给客户这个阶段来说,使用静态编译是比较好的。

对于开发者来说:
  静态加载就有一定的劣势,静态加载不能进行调试,不能进行下层的跟踪,是一个致命的问题。而动态库却相对来说灵活的多。
  同时,假设给发给用户的部分依赖库进行升级,动态库也是有很大优势的。静态库就没这个优势了。
-----------------------------------------------
这个问题第9个回答:
1.静态加载,默认情况下进程启动就开始加载,并在进程退出时卸载,相对于使用过程当中比较频繁,或者贯穿整个程序的生命周期的选择这一种方法,并且可以通过bind来提升效率。
2.对于某些可能会用不到,但是如果用得到的话就贯穿整个应用程序的,那么可以选择Delayload.
3.动态加载,相对比较灵活,可控性更强,但是需要用代码维护DLL的生命周期。可对于那些很偶然才会用到的采用动态加载,相对资源消耗更小。另外对于一个长时间稳定运行的应用程序,例如一周内七剩二十四小时不间断运行的,那么相比之下使用动态加载,还有一个好处就是热更新,也就是在程序运行过程当中在不停止程序的情况下进行更新(具体的操作这里就不提了)。
--------------------------------------------------
这个问题第12个回答:
:)
静态加载不能更换dll的名字把?
动态的就没有这个限制拉 你在程序里随便加那个dll 而且不会不受控制的报错把?静态的一定会告诉你 找不到那dll了
--------------------------------------------------------------------------------
这个问题第13个回答:
静态加载的时候在发布程序的时候不需要有额外的库,而动态加载的时候就需要有额外的库的帮助了

抱歉!评论已关闭.