dll概要Word格式文档下载.docx
- 文档编号:7958654
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:10
- 大小:21.97KB
dll概要Word格式文档下载.docx
《dll概要Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《dll概要Word格式文档下载.docx(10页珍藏版)》请在冰点文库上搜索。
DLL的优点
下表说明了当程序使用DLL时提供的一些优点:
•使用较少的资源
当多个程序使用同一个函数库时,DLL可以减少在磁盘和物理内存中加载的代码的重复量。
这不仅可以大大影响在前台运行的程序,而且可以大大影响其他在Windows操作系统上运行的程序。
•推广模块式体系结构
DLL有助于促进模块式程序的开发。
这可以帮助您开发要求提供多个语言版本的大型程序或要求具有模块式体系结构的程序。
模块式程序的一个示例是具有多个可以在运行时动态加载的模块的计帐程序。
•简化部署和安装
当DLL中的函数需要更新或修复时,部署和安装DLL不要求重新建立程序与该DLL的链接。
此外,如果多个程序使用同一个DLL,那么多个程序都将从该更新或修复中获益。
当您使用定期更新或修复的第三方DLL时,此问题可能会更频繁地出现。
DLL依赖项
当某个程序或DLL使用其他DLL中的DLL函数时,就会创建依赖项。
因此,该程序就不再是独立的,并且如果该依赖项被损坏,该程序就可能遇到问题。
例如,如果发生下列操作之一,则该程序可能无法运行:
•依赖DLL升级到新版本。
•修复了依赖DLL。
•依赖DLL被其早期版本覆盖。
•从计算机中删除了依赖DLL。
这些操作通常称为DLL冲突。
如果没有强制实现向后兼容性,则该程序可能无法成功运行。
下表说明了为了帮助最大限度地减少依赖性问题而在MicrosoftWindows2000和较高版本的Windows操作系统中引入的更改:
•Windows文件保护
在Windows文件保护中,操作系统禁止XX的代理更新或删除系统DLL。
因此,当程序安装操作尝试删除或更新被定义为系统DLL的DLL时,Windows文件保护将寻找有效的数字签名。
•专用DLL
通过专用DLL可以使程序避免遭受对共享DLL进行的更改。
专用DLL使用版本特定信息或空.local文件来强制要求程序所使用的DLL的版本。
要使用专用DLL,请在程序根文件夹中查找DLL。
然后,对于新程序,请向该DLL中添加版本特定信息。
对于旧程序,请使用空.local文件。
每个方法都告诉操作系统使用位于程序根文件夹中的专用DLL。
DLL故障排除工具
可以使用多个工具来帮助您解决DLL问题。
以下是其中的部分工具。
DependencyWalker
DependencyWalker工具可以递归扫描以寻找程序所使用的所有依赖DLL。
当您在DependencyWalker中打开程序时,DependencyWalker会执行下列检查:
•DependencyWalker检查是否丢失DLL。
•DependencyWalker检查是否存在无效的程序文件或DLL。
•DependencyWalker检查导入函数和导出函数是否匹配。
•DependencyWalker检查是否存在循环依赖性错误。
•DependencyWalker检查是否存在由于针对另一不同操作系统而无效的模块。
通过使用DependencyWalker,您可以记录程序使用的所有DLL。
这可能有助于避免和更正将来可能发生的DLL问题。
当您安装MicrosoftVisualStudio6.0时,DependencyWalker将位于以下目录中:
drive\ProgramFiles\MicrosoftVisualStudio\Common\Tools
DLLUniversalProblemSolver
DLLUniversalProblemSolver(DUPS)工具用于审核、比较、记录和显示DLL信息。
下表说明了组成DUPS工具的实用工具:
•Dlister.exe
该实用工具枚举计算机中的所有DLL,并且将此信息记录到一个文本文件或数据库文件中。
•Dcomp.exe
该实用工具比较在两个文本文件中列出的DLL,并产生包含差异的第三个文本文件。
•Dtxt2DB.exe
该实用工具将通过使用Dlister.exe实用工具和Dcomp.exe实用工具创建的文本文件加载到dllHell数据库中。
•DlgDtxt2DB.exe
该实用工具提供Dtxt2DB.exe实用工具的图形用户界面(GUI)版本。
有关DUPS工具的更多信息,请单击下面的文章编号,以查看Microsoft知识库中相应的文章:
247957(示例:
使用DUPS.exe解决DLL兼容性问题
DLL帮助数据库
DLL帮助数据库帮助您查找由Microsoft软件产品安装的特定版本的DLL。
有关DLL帮助数据库的更多信息,请访问下面的Microsoft网站:
(
DLL开发
本节介绍您在开发自己的DLL时应该考虑的问题和要求。
DLL的类型
当您在应用程序中加载DLL时,可以使用两种链接方法来调用导出的DLL函数。
这两种链接方法是加载时动态链接和运行时动态链接。
加载时动态链接
在加载时动态链接中,应用程序像调用本地函数一样对导出的DLL函数进行显式调用。
要使用加载时动态链接,请在编译和链接应用程序时提供头文件(.h)和导入库文件(.lib)。
当您这样做时,链接器将向系统提供加载DLL所需的信息,并在加载时解析导出的DLL函数的位置。
运行时动态链接
在运行时动态链接中,应用程序调用LoadLibrary函数或LoadLibraryEx函数以在运行时加载DLL。
成功加载DLL后,可以使用GetProcAddress函数获得要调用的导出的DLL函数的地址。
在使用运行时动态链接时,无需使用导入库文件。
下面的列表说明了有关何时使用加载时动态链接以及何时使用运行时动态链接的应用程序条件:
•启动性能
如果应用程序的初始启动性能很重要,则应使用运行时动态链接。
•易用性
在加载时动态链接中,导出的DLL函数类似于本地函数。
这使您可以方便地调用这些函数。
•应用程序逻辑
在运行时动态链接中,应用程序可以分支,以便按照需要加载不同的模块。
在开发多语言版本时,这一点很重要。
DLL入口点
在创建DLL时,可以有选择地指定入口点函数。
当进程或线程将它们自身附加到DLL或者将它们自身从DLL分离时,将调用入口点函数。
您可以使用入口点函数根据DLL的需要来初始化数据结构或者销毁数据结构。
此外,如果应用程序是多线程的,则可以在入口点函数中使用线程本地存储(TLS)来分配各个线程专用的内存。
下面的代码是一个DLL入口点函数的示例。
以下是引用片段:
BOOL
APIENTRY
DllMain(
HANDLE
hModule,
//
Handle
to
DLL
module
DWORD
ul_reason_for_call,
Reason
for
calling
function
LPVOID
lpReserved
)
Reserved
{
switch
(
ul_reason_for_call
)
case
DLL_PROCESS_ATTACHED:
//
A
process
is
loading
the
DLL.
break;
DLL_THREAD_ATTACHED:
creating
a
new
thread.
DLL_THREAD_DETACH:
thread
exits
normally.
DLL_PROCESS_DETACH:
unloads
}
return
TRUE;
}
当入口点函数返回FALSE值时,如果您使用的是加载时动态链接,则应用程序不启动。
如果您使用的是运行时动态链接,则只有个别DLL不会加载。
入口点函数只应执行简单的初始化任务,不应调用任何其他DLL加载函数或终止函数。
例如,在入口点函数中,不应直接或间接调用LoadLibrary函数或LoadLibraryEx函数。
此外,不应在进程终止时调用FreeLibrary函数。
注意:
在多线程应用程序中,请确保将对DLL全局数据的访问进行同步(线程安全),以避免可能的数据损坏。
为此,请使用TLS为各个线程提供唯一的数据。
导出DLL函数
要导出DLL函数,您可以向导出的DLL函数中添加函数关键字,也可以创建模块定义文件(.def)以列出导出的DLL函数。
要使用函数关键字,您必须使用以下关键字来声明要导出的各个函数:
__declspec(dllexport)
要在应用程序中使用导出的DLL函数,您必须使用以下关键字来声明要导入的各个函数:
__declspec(dllimport)
通常情况下,您最好使用一个包含define语句和ifdef语句的头文件,以便分隔导出语句和导入语句。
您还可以使用模块定义文件来声明导出的DLL函数。
当您使用模块定义文件时,您不必向导出的DLL函数中添加函数关键字。
在模块定义文件中,您可以声明DLL的LIBRARY语句和EXPORTS语句。
下面的代码是一个定义文件的示例。
//SampleDLL.def
//
LIBRARY
"
sampleDLL"
EXPORTS
HelloWorld
示例
和应用程序
在
Microsoft
Visual
C++
6.0
中,可以通过选择“Win32
动态链接库”项目类型或“MFC
应用程序向导
(dll)”来创建
DLL。
下面的代码是一个在
中通过使用“Win32
动态链接库”项目类型创建的
的示例。
SampleDLL.cpp
//
#include
stdafx.h"
#define
EXPORTING_DLL
sampleDLL.h"
DllMain(
HANDLE
hModule,
ul_reason_for_call,
lpReserved
)
void
HelloWorld()
MessageBox(
NULL,
TEXT("
Hello
World"
),
In
DLL"
MB_OK);
File:
SampleDLL.h
#ifndef
INDLL_H
#ifdef
extern
__declspec(dllexport)
void
HelloWorld()
;
#else
__declspec(dllimport)
#endif
#endif
下面的代码是一个“Win32应用程序”项目的示例,该示例调用SampleDLLDLL中的导出DLL函数。
//SampleApp.cpp
int
WinMain(HINSTANCE
hInstance,
HINSTANCE
hPrevInstance,
LPSTR
lpCmdLine,
nCmdShow)
HelloWorld();
0;
在加载时动态链接中,您必须链接在生成SampleDLL项目时创建的SampleDLL.lib导入库。
在运行时动态链接中,您应使用与以下代码类似的代码来调用SampleDLL.dll导出DLL函数。
...
typedef
VOID
(*DLLPROC)
(LPTSTR);
hinstDLL;
DLLPROC
HelloWorld;
fFreeDLL;
hinstDLL
=
LoadLibrary("
sampleDLL.dll"
);
if
(hinstDLL
!
NULL)
HelloWorld
(DLLPROC)
GetProcAddress(hinstDLL,
HelloWorld"
(HelloWorld
(HelloWorld);
fFreeDLL
FreeLibrary(hinstDLL);
...
当您编译和链接SampleDLL应用程序时,Windows操作系统将按照以下顺序在下列位置中搜索SampleDLLDLL:
1.应用程序文件夹
2.当前文件夹
3.Windows系统文件夹
GetSystemDirectory函数返回Windows系统文件夹的路径。
4.Windows文件夹
GetWindowsDirectory函数返回Windows文件夹的路径。
.NETFramework程序集
在引入Microsoft.NET和.NETFramework以后,大多数与DLL相关联的问题已经通过使用程序集消除了。
程序集是在.NET公共语言运行库(CLR)控制之下运行的逻辑功能单元。
程序集实际上是作为.dll文件或.exe文件存在的。
但是,在内部,程序集与MicrosoftWin32DLL大不相同。
程序集文件包含程序集清单、类型元数据、Microsoft中间语言(MSIL)代码和其他资源。
程序集清单包含程序集元数据,以提供使程序集成为自描述程序集所需的全部信息。
程序集清单中包含以下信息:
•程序集名称
•版本信息
•区域性信息
•强名称信息
•程序集文件列表
•类型引用信息
•引用和依赖程序集信息
程序集中包含的MSIL代码是无法直接执行的,需要通过CLR来执行。
默认情况下,当您创建一个程序集时,该程序集是应用程序专有的。
要创建共享程序集,需要为该程序集分配强名称,然后在全局程序集缓存中发布该程序集。
下表说明了程序集的一些功能,并将其与Win32DLL的功能进行了比较:
•自描述
当您创建程序集时,CLR运行该程序集所需的全部信息都包含在程序集清单中。
程序集清单包含一个依赖程序集列表。
因此,CLR可以维护一组在应用程序中使用的一致的程序集。
在Win32DLL中,当您使用共享DLL时,无法维护应用程序中使用的一组DLL之间的一致性。
•版本控制
在程序集清单中,版本信息由CLR记录和实施。
另外,可以通过版本策略来实施版本特定用法。
在Win32DLL中,无法由操作系统实施版本控制。
相反,您必须确保DLL向后兼容。
•并行部署
程序集支持并行部署。
一个应用程序可以使用一个版本的程序集,而另一个应用程序可以使用另一不同版本的程序集。
从Windows2000开始,通过将DLL放置到应用程序文件夹中支持并行部署。
另外,Windows文件保护能够防止系统DLL被XX的代理改写或替换。
•独立和隔离
通过使用程序集开发的应用程序可以是独立的,并且与计算机中正在运行的其他应用程序隔离。
这一特性有助于创建零干扰安装。
•执行
程序集在程序集清单所提供的并且由CLR控制的安全权限下运行。
•语言无关性
可以通过使用任何一种受支持的.NET语言来开发程序集。
例如,可以在MicrosoftVisualC#中开发程序集,然后在MicrosoftVisualBasic.NET项目中使用该程序集。
参考
有关DLL和.NETFramework程序集的更多信息,请访问下面的Microsoft网站:
DLL冲突(DLLconflicts)
在应用程序中实现并行组件共享(Implementingside-by-sidecomponentsharinginapplications)
如何生成和维护用于WindowsXP的独立应用程序和并行程序集(Howtobuildandserviceisolatedapplicationsandside-by-sideassembliesforWindowsXP)
使用.NETFramework简化部署和解决DLL冲突(SimplifyingdeploymentandsolvingDLLconflictswiththe.NETFramework)
.NETFramework开发人员指南:
程序集
创建Win32DL(CreatingaWin32DLL)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- dll 概要