文档章节

Windows 动态链接库DLL浅解

_编程菜鸟_
 _编程菜鸟_
发布于 2014/07/27 11:15
字数 896
阅读 64
收藏 1

动态链接库(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能运行成功。

 

© 著作权归作者所有

共有 人打赏支持
_编程菜鸟_
粉丝 3
博文 105
码字总数 14021
作品 0
武汉
无法定位程序输入点_except_handler4_common于动态链接库msvcrt.dll上

最近,多种软件都出现了一个启动时的错误提示 “无法定位程序输入点excepthandler4common于动态链接库msvcrt.dll上”。 出现这个提示情况是:Windows Xp 系统; 软件包括:window live write...

niunan
2010/03/26
0
0
如何解决msvcr100.dll丢失问题?

msvcr100.dll是Visual Studio 2010的一个动态链接库,如果某程序是用它开发出来的,那么该程序的运行就有可能需要此动态链接库,有些程序直接将其打包到了安装目录,并注册,就不会出现缺失的...

傲娇字符
2015/07/23
0
2
深入分析Windows和Linux动态库应用异同

摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。 ...

长平狐
2013/01/06
69
0
msvcr100.dll问题描述及修复方式

出现问题的大部分原因是因该文件被木马病毒破坏导致系统找不到此文件,出现错误提示框,想要解决此问题只需找到专业的DLL文件下载网站,下载该文件,复制到相应目录。即可解决。msvcr100.dl...

jun9152143
01/18
0
0
深入分析Windows和Linux动态库应用异同

摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。 ...

晨曦之光
2012/03/02
56
0

没有更多内容

加载失败,请刷新页面

加载更多

好用的vue组件

http://elickzhao.github.io/2017/08/vue%E4%B8%80%E4%BA%9B%E7%89%B9%E5%88%AB%E6%9C%89%E7%94%A8%E7%9A%84%E6%8F%92%E4%BB%B6/...

Littlebox
33分钟前
3
0
linux 源码安装mysql8

1.安装依赖 yum -y install wget cmake gcc gcc-c++ ncurses ncurses-devel libaio-devel openssl openssl-devel   2.下载源码包 wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-......

苏牧影子
33分钟前
1
0
BeanFactory和FactoryBean

BeanFactory BeanFactory是ioc容器的顶层接口,里面定义了一些容器基本的功能 类似ConfigurableBeanFatory和ApplicationContext就是比较高级的容器,除了基本的方法之外,还实现了很多高级的...

sendo
35分钟前
2
0
Java并发(9)- 从同步容器到并发容器

引言 容器是Java基础类库中使用频率最高的一部分,Java集合包中提供了大量的容器类来帮组我们简化开发,我前面的文章中对Java集合包中的关键容器进行过一个系列的分析,但这些集合类都是非线...

Ala6
39分钟前
3
0
Java定时器Timer学习之一

种类: 接通延时型定时器:接通延时型定时器是各种PLC(可编程控制器)中最常见最基本的定时器,这种定时器在Siemens的PLC中,成为SD型定时器 断开延时型定时器:这种定时器是当输入条件00000为ON时...

王怀楼
41分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部