您的位置:首页 > 其它

动态链接库隐式连接解释

2012-10-16 19:55 246 查看
动态链接库有2种连接方式,一种是通过库直接加入(又叫隐式加载或载入时加载),一种是在运行时加入。后者很好理解,比如LoadLibrary(),GetProcAddress()获取想要引入的函数,使用完后,就FreeLibrary()。

FreeLibrary是释放该动态链接库。而由于动态链接库是多进程共享的,因此调用FreeLibrary并不意味者动态链接库在内存中被释放,每个动态链接库都有一个变量用来记录它的共享引用技术,而FreeLibrary的功能只是将这个计数减一,只有当一个动态链接库的引用计数为0时,它才会被操作系统释放。

对于理解隐式加载,还需要特别说明,

隐式链接

  隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。实现隐式链接很容易,只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以了。下面的例子通过隐式链接调用MyDll.dll库中的Min函数。首先生成一个项目为TestDll,在DllTest.h、DllTest.cpp文件中分别输入如下代码:

//Dlltest.h

#pragma comment(lib,"MyDll.lib")

extern "C"_declspec(dllimport) int Max(int a,int b);

extern "C"_declspec(dllimport) int Min(int a,int b);

//TestDll.cpp

#include<stdio.h>

#include"Dlltest.h"

void main()

{

 int a;

 a=min(8,10)

 printf("比较的结果为%d\n",a);

}

在创建DllTest.exe文件之前,要先将MyDll.dll和MyDll.lib拷贝到当前工程所在的目录下面,也可以拷贝到windows的System目录下。如果DLL使用的是def文件,要删除TestDll.h文件中关键字extern
"C"。TestDll.h文件中的关键字Progam commit是要Visual C+的编译器在link时,链接到MyDll.lib文件,当然,开发人员也可以不使用#pragma comment(lib,"MyDll.lib")语句,而直接在工程的Setting->Link页的Object/Moduls栏填入MyDll.lib既可。

问题1:在客户程序里使用隐式连接,一定要使用__declspec(dllimport)声明在吗?

答:不使用
__declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它十分清楚函数是否在 DLL 中,因此可以生成跳过间接级别的代码,而在跨 DLL 边界的函数中通常存在这些间接代码。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。

问题2:静态库和隐式链接的动态库有什么区别??

答:静态库,动态库相对于代码文件本身来说的(硬盘上放的东西不一样)

编译时使用动态库,代码文件中放的是要调用代码的地址

编译时使用静态库,代码文件中放的是要调用代码本身

隐式链接,显示连接是另外的概念,是指代码加载到内存中的方式,

就是把硬盘上放的东西加到内存去的方式

隐式链接,硬盘放的某些代码一开始就加到内存

显示连接,要用的时候才把硬盘放的某些代码加到内存,不用就释放

用静态库的话,目标电脑上如果没有这个文件的话能正常使用程序。

用动态库的话,目标电脑上必须要有这个文件才能正常使用程序,或者你可以要发布程序的时候将这个文件一起打包。

参考:http://topic.csdn.net/t/20061008/11/5066740.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐