发信人: lofe ()感激生活(), 信区: BorlandDev
标  题: 动态链结函式库(Dynamic Linked Library)(5)
发信站: 哈工大紫丁香 (2000年08月30日19:52:51 星期三), 站内信件

动态链结函式库彻底研究

在前面的范例中,我们已经示范了一个基础dll的撰写方式,然而那只能说是少部份的
Know-How而已,接下来我想针对DLL做一个彻底的探讨,企图使您对它有一个全面的认
知,同时也希望在Know-How之外,可以告诉你一些关於DLL的Know-Why。

DLL的生与死

DLL顾名思义,是一个可以动态链结的函式库。这其中包含两个意义。第一,它是动态
链结的,也就是说它必须具有『招之即来,挥之即去』的基本特性,它只有在被需要
的时候才会被载入系统中,而在不被需要时,即自系统中释放。第二,它是一个函式
库,因此它的行为模式和一般的函式库没什麽不同,当它载入时,它就视同其他一般
的函式般。

『招之即来,挥之即去』的DLL

前面我们提到,DLL必须具备『招之即来,挥之即去』的基本特性。那麽要如何载入及
释放DLL呢?关於此点,我们必须分为两方面来探讨;即所谓的明确呼叫及不明确呼
叫。

明确呼叫(explicited linked):所谓明确呼叫(explicited linked)是使用
LoadLibrary函式来载入 DLL。使用FreeLibrary函式来释放 DLL。这种方式是由使用
者主动透过LoadLibrary 载入该 DLL,然後以GetProcAddress来取得函式位址,再呼
叫该函式。最後在不使用该DLL之後,再将其释放。使用明确呼叫的优点在於,你可以
完全控制该DLL的载入及释放,最有效地利用系统资源:缺点则是,必须自行利用
GetProcAddress来取得叫使用的函式位址,但也由於使用了GetProcAddress来取得函
式位址,因此在使用上增加许多弹性。由於此种使用方式载入函式程式是主动且可见
的,因此名之为明确呼叫。

不明确呼叫 ( implicited linked):所谓不明确呼叫则是利用链结DLL函式库所相对
应的输出函式库 ( export library),来达成呼叫函式的目的。因此载入DLL以及释
放DLL的程序是不可见的,当使用该输出函式库的程式载入後,系统即将该DLL载入,
当使用该输出函式的程式结束後,系统即将该DLL释放。使用不明确呼叫的优点在於,
使用者可以完全不必顾虑到函式的载入及释放相关问题,使用时就如同一般的静态函
式般。由於此种使用方式载入函式是非主动且不可见的,因此名之为不明确呼叫。

DLL的使用次数 (Usage Count)

前面提到的载入及释放其实在定义上是不明确的。为什麽呢?因为DLL的载入及释放尚
牵涉到多行程使用时的载入及释放。由於DLL是动态链结的,因此可以同时有许多程式
在使用同一个 DLL,举例来说:若一个X.DLL同时被A、B、C叁个程式使用着,则X.DLL
会被载入叁次。然而系统为了结省资源,当然不会重复载入,因此此时在系统内会有
一个表格来记载X.DLL的使用次数。所以当A程式载入X.DLL後,B、C程式再次载入
X.DLL时,此时X.DLL并没有被重复地载入,系统只是将X.DLL的使用次数加一,然後将
先前载入的X.DLL位址传回给 B、C两个程式使用,如此就可以达到共享函式库的目的
了。同样地在释放X.DLL时,若该DLL同时有多人使用时,系统纯粹只是将该DLL的使用
次数减一,当其使用次数等於0时,系统才会『真正』地将它由系统中释放。否则若是
系统不分青红皂白即将DLL释放,会造成系统的灾难。

由以上可知,无论我们使用明确呼叫或是不明确呼叫,DLL的载入及释放都和它的使用
次数有关。所以DLL的生与死其实和它的使用次数有关,当它的使用次数不为0时,就
表示其『阳寿未尽』,系统就会维持其活动状态;反之,若其使用次数为0时,则表示
它该『寿终正寝』了,系统就将其释放,并回收其使用的资源。然而若使用该DLL的程
式当掉,导致该DLL没被释放时,该DLL就会因为使用次数没有被适时减少,而一直在
系统内『阴魂不散』了。这种利用使用次数来管理共享资源的方法,也同时使用在OLE
之中。

--
真正的程序员用C, 聪明的程序员用什么?——Inprise工具!

欢迎光临BorlandDev版,探讨Inprise编程

           独孤九剑的最高境界是不拿剑
           编程的最高境界是无所谓工具

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: malacs.hit.edu.cn]
※ 修改:·lofe 於 08月30日19:55:18 修改本文·[FROM: malacs.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.612毫秒