`
houzhe11
  • 浏览: 136972 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论
阅读更多

dll文件(dynamic linkable library即动态连接库文件),是一个不能单独运行的文件,它允许程序共享执行特殊任务所必须的代码和其它资源。

 比较的应用程序都由很多的模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。

可能存在一些模块的功能比较的通用,在构成其它软件是可能会被使用。在构造软件系统时,如果将所有模块的原代码都静态编译到整个应用程序exe文件中,会产生一些问题。一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,造成系统资源的浪费;另一个缺点是,在编写大的exe文件时,在每次修改重建时都必须调整编译所有的原代码,增加编译过程的复杂性,也不利于阶段性的测试。

windows系统平台提供了一种完全不同的有效的编程和运行环境,你可以将独立的程序模块创建为较小的dll文件,并可对他们单独编译和测试。在运行时,只有当exe程序确实要调用这些dll模块时,才将他们装入内存中。这中方式不仅减少了exe文件的大小而且对内存空间的需要。而且使这些dll模块同时被多个应用程序使用。windows系统就自己将一些主要的系统功能以dll的形式实现。

dll是一种磁盘文件,以.dll,drv,fon.sys和许多的exe为扩展名的都可以为dll文件。它由全局函数,服务函数和资源组成,在运行时被系统加载到调用进程的虚拟空间中,成为调用进程的一部分。如果和其它的dll没有冲突,该文件通常映射到虚拟空间的同一地址。dll包含各种导出函数,用于向外界提供服务,dll可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式,一个dll内存只有一个事例,dll实现了代码的封装。

在 Win32 环境中,每个进程都复制了自己的读/写全局变量。如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL 模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。Windows 在加载 DLL 模块时将进程函数调用与 DLL 文件的导出函数相匹配。Windows 操作系统对 DLL 的操作仅仅是把 DLL 映射到需要它的进程的虚拟地址空间里去。DLL 函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。

  调用方式:

  1、静态调用方式:由编译系统完成对 DLL 的加载和应用程序结束时 DLL 卸载的编码(如还有其它程序使用该 DLL,则 Windows 对 DLL 的应用记录减1,直到所有相关程序都结束对该 DLL 的使用时才释放它,简单实用,但不够灵活,只能满足一般要求。

  隐式的调用:需要把产生动态连接库时产生的 .LIB 文件加入到应用程序的工程中,想使用 DLL 中的函数时,只须说明一下。隐式调用不需要调用 LoadLibrary() 和 FreeLibrary()。程序员在建立一个 DLL 文件时,链接程序会自动生成一个与之对应的 LIB 导入文件。该文件包含了每一个 DLL 导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB 文件作为 DLL 的替代文件被编译到应用程序项目中。

  当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与 LIB 文件中导出符号相匹配,这些符号或标识号进入到生成的 EXE 文件中。LIB 文件中也包含了对应的 DL L文件名(但不是完全的路径名),链接程序将其存储在 EXE 文件内部。

  当应用程序运行过程中需要加载 DLL 文件时,Windows 根据这些信息发现并加载 DLL,然后通过符号名或标识号实现对 DLL 函数的动态链接。所有被应用程序调用的 DLL 文件都会在应用程序 EXE 文件加载时被加载在到内存中。可执行程序链接到一个包含 DLL 输出函数信息的输入库文件(.LIB文件)。操作系统在加载使用可执行程序时加载 DLL。可执行程序直接通过函数名调用 DLL 的输出函数,调用方法和程序内部其 它的函数是一样的。

  2、动态调用方式:是由编程者用 API 函数加载和卸载 DLL 来达到调用 DLL 的目的,使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。

  显式的调用:

  是指在应用程序中用 LoadLibrary 或 MFC 提供的 AfxLoadLibrary 显式的将自己所做的动态连接库调进来,动态连接库的文件名即是上面两个函数的参数,再用 GetProcAddress() 获取想要引入的函数。自此,你就可以象使用如同本应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用 FreeLibrary 或 MFC 提供的 AfxFreeLibrary 释放动态连接库。直接调用 Win32 的 LoadLibary 函数,并指定 DLL 的路径作为参数。LoadLibary 返回 HINSTANCE 参数,应用程序在调用 GetProcAddress 函数时使用这一参数。GetProcAddress 函数将符号名或标识号转换为 DLL 内部的地址。程序员可以决定 DLL 文件何时加载或不加载,显式链接在运行时决定加载哪个 DLL 文件。使用 DLL 的程序在使用之前必须加载(LoadLibrary)加载DLL从而得到一个DLL模块的句柄,然后调用 GetProcAddress 函数得到输出函数的指针,在退出之前必须卸载DLL(FreeLibrary)。

  正因为DLL 有占用内存小,好编辑等的特点有很多电脑病毒都是DLL格式文件。但不能单独运行。

  动态链接库通常都不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其它DLL调用来完成某项工作的函数。只有在其它模块调用动态链接库中的函数时,它才发挥作用。

分享到:
评论

相关推荐

    emp.dll下载 找不到emp.dll DLL文件丢失.zip

    dll控件常规安装方法(仅供参考): 一、如果在运行某软件或编译程序时提示缺少、找不到dll等类似提示,您可将下载来的dll拷贝到指定目录即可(一般是system系统目录或放到软件同级目录里面),或者重新添加文件引用...

    WIN7 64位系统刚装完系统后初始状态的三个DLL文件deskadp.dll,deskmon.dll,deskperf.dll 显卡加速可还原

    deskadp.dll,deskmon.dll,deskperf.dll WIN7 64位原系统刚装完后初始状态可用恢复覆盖 WIN7 64位原系统deskadp.dll,deskmon.dll,deskperf.dll替换掉WIN7 64系统里的windows/system32文件夹下的三个相应的文件,...

    MFC42D.DLL MFCO42D.DLL MSVCRTD.DLL

    当你运行VC6.0的DEBUG程序时,突然弹出一个丢失MFC42D.DLL。 一般情况下是你的系统目录下确实以下三个文件。 MFC42D.DLL MFCO42D.DLL MSVCRTD.DLL 本压缩包包含完整的3个DLL文件,均从VC6.0下复制的,没有任何改动。...

    ADC083X.DLL(报错:External model DLL "ADC083X.DLL" not found.)

    ADC083X.DLL(报错:External model DLL "ADC083X.DLL" not found. GLE=0x000036B1.) 注意!注意! 注意:替换后再次仿真时仍然有可能失败,这和电脑系统有关(毕竟用的是Po_Jie版本的),可以尝试换台电脑试一试! ...

    drv33260.dll drv43260.dll ffmpeg.exe mencoder.exe Pncrt.dll以及java程序

    drv33260.dll drv43260.dll ffmpeg.exe mencoder.exe Pncrt.dll以及java程序drv33260.dll drv43260.dll ffmpeg.exe mencoder.exe Pncrt.dll以及java程序drv33260.dll drv43260.dll ffmpeg.exe mencoder.exe Pncrt....

    多个DLL合并成一个DLL

    ILMerge 这个工具能把多个DLL合并成一个DLL。 开发打包方便多了。 多个DLL合并成一个DLL,把DLL合并到Exe中的解决方案 多个DLL合并成一个DLL,把DLL合并到Exe中的解决方案 开始-》运行 -》 "cmd" -> "cd C:\...

    cyg.dll以及cygg.dll合集(完整版).zip

    cygattr-1.dll cygbz2-1.dll cygform-10.dll cygformw-10.dll cyggcc_s-1.dll cyggmp-3.dll cyghistory7.dll cygicons-0.dll cygiconv-2.dll cygintl-8.dll cyglsa.dll cyglsa64.dll cyglzma-5.dll cygmagic-1.dll ...

    msvcr71.dll 和 msvcp71.dll

    windows2008/windows2008r2/win7 Msvcp71.dll和Msvcr71.dll错误的解决方法 MSVCP71.DLL和msvcr71.dll文件都是VC7运行库文件,如果缺少了这两个文件,会使得很多常用软件无法正常运行。如果在 windows 7或者windows ...

    cygwin所需cyg*.dll

    cygattr-1.dll cygbz2-1.dll cygform-10.dll cygformw-10.dll cyggcc_s-1.dll cyggmp-3.dll cyghistory7.dll cygicons-0.dll cygiconv-2.dll cygintl-8.dll cyglsa.dll cyglsa64.dll cyglzma-5.dll cygmagic-1.dll ...

    C++ 编写DLL文件给易语言调用方法

    需要三个文件,dll_demo.h、dll_demo.cpp、dll_dome.def 直接上代码: 头文件如下: #ifndef _DLL_DEMO_H_ #define _DLL_DEMO_H_ #ifdef DLLDEMO_EXPORTS #define DLL_DEMO extern "C" __declspec(dllexport) #else...

    Aspose所有dll破解版本

    Aspose.Cells.dll 版本 5.3.1.0 大小 :6.26M 破解 Aspose.Diagram.dll 版本1.9.0.1 大小 :1.86MB 未破解 Aspose.Editor.Client.dll 版本3.0.3.3227 大小 :1.83MB 破解 Aspose.Editor.Desktop.dll 版本3.0.3.3227 ...

    VS调用MATLAB缺少dll文件问题

    解决VS2008调用MATLAB时提示缺少DLL文件而不能启动程序问题,主要包括的DLL文件有:comcli.dll,DataSvcs.dll,icudt24l.dll,icuin24.dll,icuio24.dll,libmwhardcopy.dll,libmwservices.dll,libmx.dll,libut....

    C#将引用的dll嵌入到exe文件中

    应用场景:当发布的程序有引用其它dll, 又只想发布一个exe时就需要把dll打包到exe; 方法如下: 1、 项目右键选择“属性”; 2、 添加资源文件:在属性设置界面选择“资源”选项卡,点击“添加现有文件”,选择需...

    msys-1.0.dll

    文件描述:MSYS® POSIX Emulation DLL 常见的错误:文件未找到、丢失或损坏,软件冲突,病毒感染。exe/dll文件: 未响应,意外的错误,CPU使用率过高、文件遇到问题需要关闭、应用程序发生异常未知的软件异常(0xxxxxxxx...

    通达信DLL开发视频教程

    通达信DLL开发视频教程,目前只出了几个章节,后续慢慢加上。 基础教程 1。讲解搭建开发环境 1_开发工具选择及安装 2_VS2005软件介绍 3_新建项目介绍 4_文件结构介绍 5_项目属性介绍 6_编译生成调试介绍 2...

    手把手教delphi写你的dll文件

    手把手教delphi写你的dll文件 一、调用参数用stdcall  和前面提到的一样,当引用DLL中的函数和过程时也要使用stdcall参数,原因和前面提到的一样。 二、用external语句指定被调用的DLL文件的路径和名称  正如...

    VC++动态链接库(DLL)编程深入浅出,DLL编写教程 两篇

    DllMain带有三个参数,hModule表示本dll的实例句柄(听不懂就不理它,写过windows程序的自然懂),dwReason表示dll当前所处的状态,例如DLL_PROCESS_ATTACH表示dll刚刚被加载到一个进程中,DLL_PROCESS_DETACH表示...

    反编译DLL文件为.CPP工具

     AheadLib 是用来生成一个特洛伊DLL的工具,用于分析DLL中的函数参数调用(比如记录Socket send了什么等等)、更改函数功能(随心所欲了:)、更改界面功能(比如在Hook里面生成一个按钮,截获事件等等)。...

    加密狗DLL 加密狗DLL

    加密狗DLL 加密狗DLL

    ABAP 调用 DLL文件

    就是SAP 的ABAP语言调用 DLL文件中的函数实现一些功能, 例如可以用DLL文件连接外部数据库读取数据. 我在网上找了好久,都没有一个完整的答案, 也没有一个完整的实例, 根据网上的各种说法, 我整合到一起, 终于成功, ...

Global site tag (gtag.js) - Google Analytics