书签 分享 收藏 举报 版权申诉 / 3

类型动态链接库技术及其研究.pdf

  • 上传人:15953279350
  • 文档编号:38108062
  • 上传时间:2019-05-05
  • 格式:PDF
  • 页数:3
  • 大小:209KB
  • 配套讲稿:

    如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来以不同的方式来
    展开阅读全文
    提示  文档分享网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:动态链接库技术及其研究.pdf
    链接地址:https://www.wdfxw.net/doc38108062.htm
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    版权所有:www.WDFXW.net 

    鲁ICP备09066343号-25 

    联系QQ: 200681278 或 335718200

    收起
    展开