什么是 DLL?

转载 2006年05月30日 10:02:00
动态链接库 (DLL) 是包含函数和数据的模块的集合。程序文件(如 .exe 文件或 .dll 文件)在运行时加载这些模块(亦即所需的模块映射到调用进程的地址空间)。下面两类函数定义了 DLL: • 导出函数:这些函数由其他模块调用。
• 内部函数:这些函数仅从定义它们的 DLL 中调用。
DLL 还导出数据。不过,这些数据由相应的函数使用。
动态链接和静态链接
动态链接包括系统在加载或运行时查找导出的 DLL 函数的代码所需的信息。

在静态链接中,链接器将库函数的代码复制到调用 DLL 的每个模块。

可以通过下列方式调用 DLL 中的函数: • 加载时动态链接:调用方模块执行显式调用以导出 DLL 函数。为 DLL 创建导入库,然后将 DLL 链接到应用程序。在加载应用程序时,导入库提供加载 DLL 和查找导出的 DLL 函数所需的信息。
• 运行时动态链接:在运行时加载 DLL 时,调用方模块使用 LoadLibrary 函数或 LoadLibraryEx 函数。调用方模块调用 GetProcAddress 函数以获取导出的 DLL 函数的地址。
在链接时,Windows 搜索预安装的一组 DLL,例如性能库 (Kernel32.dll) 和安全库 (User32.dll)。然后,Windows 按以下顺序搜索 DLL: 1. 当前进程的可执行程序所在的目录。
2. 当前目录。
3. Windows 系统目录。(GetSystemDirectory 函数获取 Windows 系统目录的路径。)
4. Windows 目录。(GetWindowsDirectory 函数获取 Windows 目录的路径。)
5. PATH 环境变量中列出的目录。

注意:LIBPATH 环境变量不用于搜索。

DLL 和静态库
• DLL 可节省内存并减少交换。 通过在内存中共享 DLL 的单个副本,多个进程可以同时使用一个 DLL。相比之下,对于使用静态链接库构建的每一个应用程序,Windows 都要在内存中为其加载库代码的一个副本。
• DLL 可节省磁盘空间。 多个应用程序可以共享磁盘上的一个 DLL 副本。相比之下,使用静态链接库构建的每一个应用程序都需要让链接到程序文件映像的库代码作为一个单独的专用副本。
• DLL 可节省时间。 更改 DLL 中的函数时,只要函数的参数和返回值不变,就不必重新编译或重新链接使用这些函数的应用程序。但是,如果您使用静态链接的对象代码,则在更改函数后必须重新链接应用程序。

DLL 可以共享函数。 在 Win32 中,DLL 可以共享函数。默认情况下,数据对于每个进程来说是独立的。但是,静态库包含针对每一个进程的单独的数据副本和函数。

DLL 入口点
DLL 有一个特殊的入口点(DllMain 函数),它在附加和分离进程和线程时运行。此行为允许根据需要创建和销毁数据结构。文件扩展名为 .ocx、.cpl 和 .drv 的文件类型也是 DLL,尽管文件扩展名已改变。在 Windows 2.x 和 Windows 3.x 中,每个 DLL 都只有一个数据段实例,而不管有多少应用程序。在 Windows 32 中,可以将 DLL 标记为共享以导致相同的行为。但是,每个进程的默认设置是拥有 DLL 数据的专用副本。
您可以通过创建 DLL 实现以下目的: • 将程序划分为可按需加载的单独模块。
• 存储特定于语言或特定于区域的资源。
• 使您自己的应用程序能够使用核心代码库。
• 生成进程内 COM 对象或 ActiveX 控件 (OCX)。
• 将 OLE 对象用作进程内 DLL。这一用法可改进 OLE 链接的性能。
• 使用控制面板扩展或使用某些类型的驱动程序。
要生成 DLL,请使用 DllMain 函数(而不是程序文件)替换 WinMain 函数。

要在 Win16 中导出函数,请将 FAR EXPORT 添加到所有导出的 DLL 函数(在 Win32 中不要求这样做)。许多 32 位编译器提供了函数声明符,例如 __declspec(dllexport) 和 __declspec(dllimport)。这些函数声明符出现在函数声明之前以代替调用。不过,定义必须仅指定 dllexport 属性。

C++通过DLL调用C#代码

本文将介绍C++中通过DLL来调用C#代码。首先建立C#的“类库”工程CShapeDLL。然后输入如下代码://C++通过DLL调用C#代码 //http://blog.csdn.net/morew...

用VC开发串口通信dll控件

VC串口通信技术网《VC串口上位机编程方法简介》介绍了串口编程的常见方法,其中就有使用串口dll控件的方法,dll是一种动态链接库,使用起来非常方便。    本文利用VC编程工具,对Windows提供...

Win7中出错:无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-|1-1-0.dll

安装完 Python 后,配置好 Python 目录于 ‘Path’,然后 CMD 命令下输入 python 验证是否配置成功,但是竟然出现结果跳出对话框,出错: 无法启动此程序,因为计算机中丢失...

DLL劫持及调用数据跟踪二: 利用 MS 的Detours

MS 出来了Hook API的SDK:Detours, 利用dll inject技术把Hook DLL注入到目标进程中,以实际API的劫持。 官方的Demo以Messagebox API为例作了说明...
  • qffhq
  • qffhq
  • 2013年03月26日 14:45
  • 721

VS2015 编译生成C#的DLL文件,并调用

转载请注明出处! C#生成dll文件是Visual Studio2015自动生成的,把项目的程序集信息(类的字段、属性、方法函数等信息)封装在dll中。然后其他项目可以通过引用dll来调用封装好...

dll应用,传说中的万恶的智能指针

最近一个小实现模块完工,准备接入

C++ 多个类的DLL封装以及隐式链接和显式链接2种方法调用

将OpenCL和OpenCV一些简单的方法封装成DLL,具体OpenCL和OpenCV的配置方法可以参考本人的博客。 VS2015下安装与编译OpenCV源码并在VS2015下配置OpenCV环境 ...

利用mstscax.dll开发远程登录客户端

最近项目要用到远程登录客户端,类似于windows自带的mstsc.exe的功能,自己在网上找了好久,说是可以在mstscax.dll基础上进行开发,但是找不到比较好的资料,经过自己的摸索,终于成功了...

c++ 把类打包成dll接口文件

之前在网上一直查不到关于把类打包成dll文件的程序,今天自己写了个测试程序,供大家参考 一、生成类的dll文件 1.我是在vs2008上测试的,建立工程,在选择建立何种类型的工程的时候,勾上app...

基于LumiSoft.Net.dll发、收、删邮件

发邮件: using LumiSoft.Net.SMTP.Client; Mime m = new Mime(); MimeEntity mainEntity = m.MainEntity;...
  • wyh0318
  • wyh0318
  • 2012年07月30日 12:38
  • 4704
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:什么是 DLL?
举报原因:
原因补充:

(最多只允许输入30个字)