动态链接库技术及其研究.pdf
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 链接 技术 及其 研究
- 资源描述:
-
动态链接库技术及其研究
李谋平
安庆师范学院安徽246011
摘要:本文深入分析了 Windows动态链接库(DLL工作原理,闻述了DL的优点等特性,通过简单实倒,探讨了创建
和调用动态链接库的方法,为工程人员开发和使用动态链接库提供了一定的技术支持。
关键词:动态链接率;动态调用;静态调用
0前音
名和参数序列。简单的DLL文件只为应用程序提供导出函
动态链接库(DLL)是一个包含可由多个程序同时使用的数,比较复杂的DLL文件除了提供导出函数以外,还调用其
代码和数据的库,DLL不是可执行文件。动态链接提供了一它DLL文件中的函数。
种方法,使进程可以调用不属于其可执行代码的函数。函数
在DLL代码中,必须像下面这样明确声明导出函数:
的可执行代码位于一个DL中,该DL包含一个或多个已 declspec( dllexport) int Myfunction(int n
被编译、链接并与使用它们的进程分开存储的函数。DLL还
但也可以在模块定义(DEF)文件中列出导出函数,不过
有助于共享数据和资源。多个应用程序可同时访向内存中单这样做常常引起更多的麻烦。在应用程序方面,要求像下面
个DL制本的内容。
这样明确声明相应的入函数:
1DLL基本编程原理分析
declspec(dilimpor)int Myfuncition(int n)
一般来说,DL是一种磁盘文件(通常带有,lI扩展名),“仅有导入和导出声明并不能使应用程序内部的函数调
它由全局数据、服务函数和资源组成,在运行时被系统加載用链接到相应的DL文件上。应用程序的项目必须为链接程
到进程的虚拟空间中,成为调用进程的一部分。如果与其它序指定所需的输入库(LB文件)。而且应用程序事实上必须
DL之间没有沖突,该文件通常映射到进程虚拟空间的同一至少包含一个对DL函数的调用。
地址上。DL模块中包含各种导出函数,用于向外界提供服1.2与DLL模块建立链接
务。 Windows在加载DLL模块时将进程函数调用与DL文
应用程序导入函数与DLL文件中的导出函数进行链接
件的导出函数相匹配。在Win32环境中,每个进程都复制了有两种方式:隐式链接和显式链接。所谓的隐式链接是指在
自己的读写全局变量。如果想要与其它进程共事内存,必須应用程序中不需指明DLL文件的实际存储路径,程序员不需
使用内存映射文件或者声明一个共享数据段。DLL模块需要关心DL文件的实际装載。而显式链接与此相反。显式链
的堆截内存都是从运行进程的堆栈中分配出来的。
接方式对于集成化的开发语言(例如VB)比较适合。
1.1导出和导入幽数的匹配
1.3使用符号名链接与标识号链接
DL文件中包含一个导出函数表。这些导出函数由它们
导出函数由它们在Win32环境中, Microsoft现在推荐使用符号名链接
的符号名和称为标识号的整数与外界联系起来。函数表中还但在MFC库中的DLL版本仍然采用的是标识号链接。一个
包含了DLL中函数的地址。当应用程序加载DLL模块时,典型的MFC程序可能会链接到数百个 MIFC DLL函数上。采
它并不知道调用函数的实际地址,但它知道函数的符号名和用标识号链接的应用程序的EXE文件体相对较小,因为它不
标识号。动态链接过程在加载的DLL模块时动态建立一个函必包含导入函数的长字符串符号名。
数调用与函数地址的对应表。如果重新缜译和重建DL文1.4编写 Dimain函数
件,并不需要修改应用程序,除非你改变了导出函数的符号 Dllmain函数是DL模块的默认入口点。当 Windows
者简介:李平(1979-),男.安大学在读傾土研究生,研究方向:计算視科学与技术
2010,8生技朮与阳79
万方数据
技术应用?
加载DL模块时调用这一函数。系统首先调用全局对象的构时清空堆截。VC将函数编译后会在函数名前面加上下划线
造函数,然后调用全局函数 Dllmain。 DLLMAIN函数不仅前绶,在函数名后加上"@"和参数的字节数。
在将DLL链接加载到进程时被调用,在DL模块与进程分
(2)C调用约定,按从右至左的顺序压参数入,由调
离时(以及其它时候)也被调用。
用者把参数弹出。对于传送参数的内存钱是由调用者来维
1.5模块句柄
护的。另外,在函数名修饰约定方面也有所不同。 cdecl是
进程中的每个DL模块被全局惟一的32字节的C和C+程序缺省的调用方式。每一个调用它的函数都包含
HINSTANCE句柄标识。进程自己还有ー个 HIINSTTANCE句清空堆的代码,所以产生的可执行文件大小会比调用
辆。所有这些模块句柄都只有在特定的进程内部有效,它们 stdcall函数的大。函数采用从右到左的压機方式。VC将函
代表了DLL或EXE模块在进程虚拟空间中的起始地址。在数编译后会在函数名前面加上下划线前缀。它是MFC缺省
Win32中, HNSTANCE和 HMODULE的值是相同的,这两调用约定。
种类型可以替换使用。进程模块句柄几乎总是等于
(3) fastcall调用约定的主要特点就是快,因为它是通
0x40000而DLL模块的加载地址的缺省句柄是过寄存器来传送参数的(实际上,它用ECX和EDX传送前两
0x10000如果程序同时使用了几个DLL模块,每一个都个双字( DWORD)或更小的参数,剩下的参数仍旧自右向左压
会有不同的 HINSTANCE值。这是因为在侧建DLL文件时传送,被调用的函数在返回前清理传送参数的内存枝),在
指定了不同的基地址,或者是因为加載程序对DLL代码进行函数名修饰约定方面,它和前两者均不同。 fastcall方式的
了重定位。
函数采用寄存器传递参数,VC将函数编译后会在函数名前
模块句柄对于加载资源特別重要。Win32的面加上"@"前缀,在函数名后加上"@"和参数的字节数
Findresource函数中带有一个 HINSTANCE参数。EXE和
(4) thiscall 1仅仅应用于"C+"成员函数。this指针存放
DLL都有其自己約资源。如果应用程序需要来自于DL的于CX寄存器,参数从右到左压。 thiscall不是关键词,因此
资源,就将此参数指定为DL的模块句柄。如果需要EXE不能被程序负指定。
文件中包含的资源,就指定EXE的模块句柄。但是在使用
(5) naked call采用(1)(4)的调用约定时,如果必要的
这些句柄之前存在一个向题,你怎样得到它们呢?如果需要话,进入函数时编译器会产生代码来保存ESI,EDl,EBX,
得到EXE模块句柄,调用带有Nul参数的Win32函数EBP寄存器,退出函数时则产生代码恢复这些寄存器的内客。
Getmodulehandle如果需要DLL模块句柄,就调用以 DLL naked call不产生这样的代码。 naked call不是类型修饰符,
文件名为参数的Win32函数 Getmodulehandle。
故必须和 declspec共同使用。
2DLL的实现及其调用
2.2创建动态链接库DL
在创建和调用动态链接库时要用到一些函数调用约定。
在 Visual C+6.0开发环境下,打开 File Newproject选
函数调用约定是指决定函数参数传送时入截和出栈的顺序,项,可以选Wn32 Dynamic Link Library或MFC
由调用者还是被调用者把参数弹出截,以及编译器用来识别 App fdl来以不同的方式来展开阅读全文
文档分享网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。



链接地址:https://www.wdfxw.net/doc38108062.htm