文档章节

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
深入分析Windows和Linux动态库应用异同

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

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

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

jun9152143
01/18
0
0
如何解决msvcr100.dll丢失问题?

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

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

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

晨曦之光
2012/03/02
56
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

人生苦短:Python里的17个“超赞操作

人生苦短,我选Python”。那么,你真的掌握了Python吗? 1. 交换变量 有时候,当我们要交换两个变量的值时,一种常规的方法是创建一个临时变量,然后用它来进行交换。比如: # 输入 a = 5 b ...

糖宝lsh
53分钟前
4
0
咕泡-spring中常用设计模式概述

设计模式就是经验之谈,供后人借鉴,解决一些具有代表性的问题 设计模式来源于生活,反过来帮助我们更好生活 设计模式提升代码的可读性、可扩展性、维护成本、复杂业务问题 千万不要死记硬背...

职业搬砖20年
今天
2
0
day59-20180817-流利阅读笔记-待学习

假·照骗,真·社交焦虑 雪梨 2018-08-17 1.今日导读 发朋友圈之前,不少人为了展现更美好的生活状态会对照片加以“微调”,或是加个滤镜显得逼格更高,或是磨个皮瘦个脸拉个大长腿。现在,国...

aibinxiao
今天
23
0
OSChina 周五乱弹 —— 姑娘在这个节日里表白你接受么?

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @Sharon啊:完全被这个小姐姐圈粉了,学两首她的歌去哈哈 分享王贰浪的单曲《往后余生(翻自 马良)》 《往后余生(翻自 马良)》- 王贰浪 手...

小小编辑
今天
1K
17
为什么HashMap要自己实现writeObject和readObject方法?

为什么HashMap要自己实现writeObject和readObject方法? 如果你有仔细阅读过HashMap的源码,那么你一定注意过一个问题:HashMap中有两个私有方法。 private void writeObject(java.io.Objec...

DemonsI
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部