Windows 动态链接库DLL浅解
Windows 动态链接库DLL浅解
_编程菜鸟_ 发表于4年前
Windows 动态链接库DLL浅解
  • 发表于 4年前
  • 阅读 64
  • 收藏 1
  • 点赞 0
  • 评论 0

移动开发云端新模式探索实践 >>>   

摘要: 什么是动态链接库?为什么要使用动态链接库?如何使用动态链接库?

动态链接库(DLL),即:Dynamic Link Library。一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。

设计动态链接库初衷是为了节约应用程序的磁盘和内存空间。在之前传统非共享库中,一个代码段简单的附加到程序中,如果另一个程序同时需要调用该代码段时,则会在内存中出现两个相同的代码段。动态链接库在内存中只有一个实例。

DLL与LIB的关系

咋一看:lib是静态链接库;DLL是动态链接库,一个编译时提供;一个运行时提供,完了。

其实没那么简单! lib也有静态lib和动态lib之分。

静态lib:它将导出声明和实现均放到lib中,编译后所有代码都嵌入到宿主程序中去。

动态lib:相当于一个h文件,它是对实现部分(.DLL)的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中,运行时需要相应的DLL文件的支持,否则无法工作。当生成一个新的DLL时,也会有配套的lib产生(即二者需一起分发),此时的lib即为动态lib。

上文引自:http://blog.csdn.net/heyabo/article/details/8721611

 使用动态dll有两种方法,一种是隐式链接,一种显示链接,如果用loadlibrary就是显示链接,用lib就属于隐式链接

dll是个编译好的程序,调用时可以直接调用其中的函数, 不参加工程的编译。
而lib应该说是一个程序集, 只是把一些相应的函数总结在一起, 如果调用lib中的函数, 在工程编译时,这些调用的函数都将参加编译。
简单讲,静态库就是直接将需要的代码连接进可执行程序;动态库就是在需要调用其中的函数时,根据函数映射表找到该函数然后调入堆栈执行。   
做成静态库可执行文件本身比较大,但不必附带动态库   
做成动态库可执行文件本身比较小,但需要附带动态库

 实例

1.通过Loadlibrary显式调用DLL

a.新建工程,生成动态库DLL;(我们发现在生成动态库DLL的同时会生成一个同名的Lib)

//MyDll.h
extern "C" __declspec (dllexport) int Add(int a,int b);   //将Add作为导出函数

//MyDll.cpp
int Add(int a,int b)
{
 return a+b;
}

b.通过主函数调用

//Main.cpp
#include <stdio.h>
__declspec(dllimport) int Add(int ,int );

typedef int (*pAdd)(int ,int);
int _tmain(int argc, _TCHAR* argv[])
{
 HINSTANCE hDll;
 pAdd Add;
 hDll=LoadLibrary("MyDll.dll");
 if (hDll)
 {
  Add=(pAdd)GetProcAddress(hDll,"Add");
 }
 printf("a+b=%d\n",Add(10,15));
  return 0;
}

运行结果:

2.通过Lib隐式调用DLL(*.h+*.lib+*.dll)

a.将MyDll.h、MyDll.lib和MyDll.dll拷贝至Main工程中;

b.将MyDll.h添加至Main工程;

c.将MyDll.lib添加至Main工程的“附加依赖项”中;

d.在Main中调用Add。

//Main.pp
#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{
 printf("a+b=%d\n",Add(10,15));
 
 return 0;
}

e.删除Main工程中的MyDll.dll,再次编译链接Main工程。编译链接均成功,单运行时会有如下提示:

3.直接调用静态库

 将MyDll工程设置为生成静态库Lib,通过布置2中的方法调用Add函数,不需要MyDll.dll能运行成功。

 

标签: 动态链接库 DLL
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 3
博文 104
码字总数 14021
×
_编程菜鸟_
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: