动态链接库的隐式连接与显式连接有什么不同

     隐式链接是指在代码中使用了了库中的代码,只是在链接时,链接器会把该库的符号信息以及导入函数的信息写入到生成的Exe文件的特定的区段中。当该程序加载时,操作系统会根据这个区段中的信息,来查找每个它需要的动态库,并根据这些动态库的导出表,与程序中的导入表相配对,以确定程序中使用的动态库中的代码在什么位置。这样应用程序就能够正确是链接到动态库中的代码了。如果在这个过程中,发生了错误,比如没有找到要求的库文件,或者库中没有你要使用的函数,程序的初始化就会失败,操作系统就会报错,并终止该程序的初始化,你的程序就死掉了。
显式链接一般是指在程序运行中,由程序代码用LoadLibrary和LoadLibraryEx函数来加载动态库。这两个函数仅仅是把库文件映射到你的进程地址空间中,并不会查找你要使用的函数的地址。如果这些函数成功,就会返回库文件在你的进程中的映像的基址,随便你就可以使用这个基址来调用GetProcAddress()函数来得到你要用的库中的函数的地址了。如果LoadLibrary函数失败,就会返回NULL,并不会强制杀死你的应用程序。
两种方法对于你的程序调用动态库时没有任何区别,只是你在编程时,步骤是不一样的。显式调用麻烦了点,但可以没有相应的lib库;隐式调用,使用起来比较简单,有函数的声明就可以了,但必须有lib库。

在VC中两种方式的具体方法:
一、动态库的隐示调用:
在 VC 工程中直接链接静态输入库XXX.lib,然后即可像调用其它源文件中
的函数一样调用DLL中的函数了。
二、动态库的显式调用:
显式调用动态库步骤:
1、创建一个函数指针,其指针数据类型要与调用的 DLL 引出函数相吻
合。
2、通过 Win32 API 函数LoadLibrary()显式的调用DLL,此函数返回
DLL 的实例句柄。
3、通过 Win32 API 函数GetProcAddress()获取要调用的DLL 的函数地
址,把结果赋给自定义函数的指针类型。
4、使用函数指针来调用 DLL 函数。
5、最后调用完成后,通过 Win32 API 函数FreeLibrary()释放DLL 函数。

 

 

 

 

posted on 2009-03-02 00:46  hcmfys_lover  阅读(822)  评论(0编辑  收藏  举报