动态链接库隐式连接解释

来源:互联网 发布:软件学着玩 编辑:程序博客网 时间:2024/05/24 00:13

动态链接库有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




原创粉丝点击