您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > ActiveDll与DLL的区别
一、关于DLL的介绍DLL,动态链接库,DynamicLinkLibrary的缩写,是一个包含函数和数据的模块集合,可以被其它应用程序共享的程序模块。DLL作为共享函数库的可执行文件,封装了一个或多个已被编译、链接的函数。多个进程可以同时使用一个DLL,在内存中共享该DLL的一个副本。DLL还有助于共享数据和资源。它和可执行文件(.EXE文件)非常类似,他们的区别在于DLL中虽然包含了可执行代码却不能单独执行,只能由需要使用它的应用程序来直接或间接调。[1]通俗的说,在Windows操作系统中,许多应用程序并不是一个完整的可执行文件,它们的正确执行需要调用一些相对独立的动态链接库,即DLL文件。一个应用程序可以调用多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。[2]DLL文件一般被存在C:\Windows\System目录下,也可能放在应用程序所在的目录或是子目录中。提到动态链接,先说明一下静态连接。什么是静态连接呢?在程序链接的过程中,需要将编译后的二进制代码链接成目标代码,链接器从静态链接库中获得所有被引用的函数,并将这些被引用的函数同代码一起放到可执行文件中。那么关于DLL的静态连接则是指链接器将被引用的库函数的代码复制到调用DLL的可执行模块(.dll文件或.exe文件)中。什么是动态链接呢?动态链接是系统允许可执行模块(.dll文件或.exe文件)在运行程中,只需要包含在定位DLL函数的可执行代码所需的信息。换句话说,可执行模块(.dll文件或.exe文件)在运行时加载这些模块(亦即所需的模块映射到调用进程的地址空间)。[3]那么动态链接和静态连接相比,优点有哪些呢?(1)节省内存,减少交换操作。使用动态链接,多个进程可以同时使用一个DLL,在内存中共享该DLL的一个副本。使用静态链接,每个应用程序都包含被引用的库函数的代码,那么Windows必须在内存中为每个应用程序加载引用的库函数的代码的一个副本。(2)节省磁盘空间。使用动态链接,在磁盘上仅需要DLL的一个副本。使用静态链接,每个应用程序都包含被引用的库函数的代码。(3)更易于升级。使用动态链接,DLL中的函数发生变化时,只要函数的参数和返回值没有更改,就不需重新编译或重新链接使用它们的应用程序。使用静态链接,在函数发生变化时,需要重新链接来生成应用程序。(4)支持多语言程序,只要程序遵循函数的调用约定,用不同编程语言编写的程序就可以调用相同的DLL函数。支持多语言程序,并使国际版本的创建轻松完成。通过将资源放到DLL中,创建应用程序的国际版本变得容易得多。可将用于应用程序的每个语言版本的字符串放到单独的DLL资源文件中,并使不同的语言版本加载合适的资源。[4](5)提供扩展MFC库类的机制。可以从现有MFC类派生类,并将它们放到MFC扩展DLL中供MFC应用程序使用。DLL中包含下面两类函数的定义:导出函数:这些函数由可执行模块(.dll文件或.exe文件)调用。内部函数:这些函数仅从定义它们的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环境变量不用于搜索。[3]DLL有一个特殊的入口点(DllMain函数),它在附加和分离进程和线程时运行。此行为允许根据需要创建和销毁数据结构。文件扩展名为.ocx、.cpl和.drv的文件类型也是DLL,尽管文件扩展名已改变。您可以通过创建DLL实现以下目的:(1)将程序划分为可按需加载的单独模块。(2)存储特定于语言或特定于区域的资源。(3)使您自己的应用程序能够使用核心代码库。(4)生成进程内COM对象或ActiveX控件(OCX)。(5)将OLE对象用作进程内DLL。这一用法可改进OLE链接的性能。(6)使用控制面板扩展或使用某些类型的驱动程序。[3]二、关于以.ocx为后缀名的ActiveX控件刚才提到过,文件扩展名为.ocx、.cpl和.drv的文件类型也是DLL。现在的ActiveX控件等价与以前的OLE控件或OCX,一个典型的控件包括设计时和运行时的用户界面,唯一的IDispatch接口定义了控件的属性和方法,唯一的IConnectionPoint接口定义控件可引发的事件。一个控件可以在容器中运行,所以从运行的角度看它类似与一个DLL。[5]尽管ActiveX和OLE都基于组建对象模型(ComponentObjectModel,COM),它们为程序员提供的却是截然不同的服务。COM提供的是低级的对象捆绑机制,该机制支持对象之间的交互通讯。OLE使用COM来提供低级的应用服务,例如采用连接和嵌入机制,支持用户创建复合文档。与之不同,ActiveX提供更精细的结构,用以支持在网络站点上嵌入控件,以及对事件的交互反应。优化ActiveX,目的是为了提高时间和空间效率,而优化OLE,是为了便于终端用户的使用和集成台式系统的应用程序。ActiveX还为Internet技术带来了一些技术上的变革,例如,ActiveX大大减小了代码量(代码量减少了百分之五十到七十),支持更多的提交和异步连接。[6]ActiveX的基础是OLE和COM,但是通过MS的各种开发工具可以屏蔽掉COM模型中许多另人费解的技术细节。ActiveX组件技术包括以下一些方面:(1)自动化服务器(2)自动化控制器(3)控件(4)COM对象(5)文档(6)容器。以.ocx为后缀名的ActiveX控件主要应用在WEB上和WindowForms程序开发上。应用程序使用ActiveX/COM组件来扩展自身的业务逻辑、事务处理和应用服务的范围。顺便提一下以.ocx为后缀名的ActiveX控件的注册和卸载方法,在“开始”菜单的“运行”输入以下代码完成任务:regsvr32path&\xxx.ocx'注册regsvr32/upath&\xxx.ocx'卸载其中path代表该xxx.ocx所以在的目录的路径。三、OCX和DLL的区别以.ocx为后缀名的ActiveX控件是一种比较特殊的DLL,它的基础是OLE和COM,是有交互界面的可视化控件,定义了控件的属性和方法,定义控件可引发的事件的响应。我们通常说的.DLL为后缀名的文件是一个包含函数和数据的模块集合,可以被其它应用程序共享的程序模块
本文标题:ActiveDll与DLL的区别
链接地址:https://www.777doc.com/doc-2896000 .html