什么是 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 属性。

相关文章推荐

Windows下Cmake与VS联合制作dll

接触大的项目,铺天盖地的代码总是会掩盖了开发环境和工具的本质,上手之前,跑跑小的历程有助于对项目的理解,提高效率。 首先记录一下 dll(动态链接库)的生成过程: 建立文件夹 Execise_Cm...

<Win32> VS新建DLL工程

1. 建立步骤 VS新建工程/添加项目 -> Win32 -> Win32项目 -> 下一步 -> 应用程序类型:DLL -> 完成  2. 文件代码

Reflector dll反编译工具

Reflector是由微软员工Lutz Roeder编写的免费程序。Reflector的出现使。NET程序员眼前豁然开朗,因为这个免费工具可以将。NET程序集中的中间语言反编译成C#或者Visual ...

MFC DLL资源动态切换

在MFC使用过程中,遇到DLL资源与主EXE资源冲突问题。 出现这样的Bug,一时无从下手。 报错位置在核心代码中dlgcore.cpp。 [cpp] view ...

C# 调用Dll中非托管C++代码,函数参数的类型对照

对于一维数组,C#参数在基本类型前加ref或out,out表示有返回数据。 如调用 c++的f(float[] a), 在c#中,为f(ref a). 对数据结构, c++ struct S...

visual c#中调用visual c++ 编译的cxform.dll问题总结

1.调用bat自动生成的cxform-c.dll库的结果最近有一个项目,收到“J2000”的坐标要转换为“GEO”格式显示,不同坐标系之间的转换,网上已经有现成的源代码了,源代码叫做cxform,百度...

Unity3D放破解反编译。DLL加密,mono解密。全程详解。

U3D 防止破解修改。DLL加密以及mono解密。。PC和Android平台下对Unity3D应用进行加密解密全程操作,详细实录
  • KiTok
  • KiTok
  • 2017-05-18 15:57
  • 3206

如何将vbs脚本用VB封装为DLL,并在vbs脚本中调用

近来,做关于wincc的项目,用到将vbs脚本封装成DLL,并在vbs脚本里面调用,故而整理如下。 一、如何将vbs脚本封装DLL 1. 在VB6.0中新建ActiveX DLL工程。 2.命名

MFC下DLL/lib的调用

1、简介: dll和.lib都是程序集合,便于代码重用。都是二进制的文件。 .dll也叫动态链接库,与程序链接的方式为运行时链接(run-time linked),为PE(portable e...

Under The Hood: Reduce EXE and DLL Size with LIBCTINY.LIB

source: http://preview.library.microsoft.com/en-us/library/bb985746.aspx   way back in my ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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