OCX和DLL的区别

转自:http://blog.csdn.net/scucj/archive/2006/06/29/852181.aspx   

OCX和DLL的区别

一、关于DLL的介绍
 
    DLL,动态链接库,Dynamic Link Library的缩写,是一个包含函数和数据的模块集合,可以被其它应用程序共享的程序模块。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 函数。
    (5)提供扩展 MFC 库类的机制。可以从现有 MFC 类派生类,并将它们放到 MFC 扩展 DLL 中供 MFC应用程序使用。
    (6)支持多语言程序,并使国际版本的创建轻松完成。通过将资源放到 DLL 中,创建应用程序的国际版本变得容易得多。可将用于应用程序的每个语言版本的字符串放到单独的 DLL 资源文件中,并使不同的语言版本加载合适的资源。[4]

  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 都基于组建对象模型(Component Object Model,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上和Window Forms程序开发上。应用程序使用ActiveX/COM组件来扩展自身的业务逻辑、事务处理和应用服务的范围。

   顺便提一下以.ocx为后缀名的ActiveX控件的注册和卸载方法,在“开始”菜单的“运行”输入以下代码完成任务:
    regsvr32 path & "\xxx.ocx" '注册
    regsvr32 /u path & "\xxx.ocx" '卸载

    其中path代表该xxx.ocx所以在的目录的路径。

三、OCX和DLL的区别

   以.ocx为后缀名的ActiveX控件是一种比较特殊的DLL,它的基础是OLE和COM,是有交互界面的可视化控件,定义了控件的属性和方法,定义控件可引发的事件的响应。我们通常说的.DLL为后缀名的文件是一个包含函数和数据的模块集合,可以被其它应用程序共享的程序模块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 从VS2008 DLL封装为OCX的角度来看,这是一种将动态链接库(DLL)转换为ActiveX控件(OCX)的过程。通过封装,可以将某个函数或一组函数作为可重用的控件提供给其他开发人员或应用程序使用。 首先,在VS2008中创建一个动态链接库项目,编写所需的功能函数。这些函数可以是通用的、可重复使用的功能,比如数据处理、算法等。确保这些函数在DLL中能够被正确地调用和执行。 接下来,通过定义控件接口(Interface),将DLL函数封装为控件。通过使用COMComponent Object Model)技术,在DLL中添加COM接口并注册该接口,使得其他应用程序或开发人员能够使用这个控件。 之后,将DLL编译为OCX控件。在VS2008中,可以将DLL的编译配置更改为ActiveX控件的配置,并生成相应的OCX文件。 在生成OCX文件后,可以将该文件部署到其他开发环境中,并通过引用该控件,从而使用和调用其中的功能函数。 需要注意的是,封装为OCXDLL应该具备良好的封装和设计,以便在其他环境中能够正确地使用。需要保证函数的参数、返回值等接口设计的一致性,并确保控件在其他环境中的稳定性和可用性。 总结起来,将VS2008 DLL封装为OCX是通过定义控件接口、注册COM接口、编译为ActiveX控件等步骤实现的。通过这种方式,可以提供一种可重用、易于部署和调用的控件,以满足其他开发人员或应用程序的需求。 ### 回答2: VS2008是微软的集成开发环境,用于开发Windows平台的应用程序。DLL(Dynamic Link Library)是一种动态链接库,封装了一些可重复使用的代码和函数,可以被不同的应用程序共享使用。OCX(OLE Control Extension)是基于COMComponent Object Model)的控件扩展,主要用于创建可视化的用户界面。 要将VS2008中的DLL封装成OCX,首先需要创建一个OCX项目,在VS2008中选择“新建项目”,然后选择“MFC ActiveX Control Wizard”模板。根据需要设置项目名称、位置和所需的功能。 接下来,在项目中添加要封装的DLL文件。可以通过右键点击“资源视图”中的“导入文件...”来添加DLL文件。选择要导入的DLL文件,然后点击“确定”进行导入。 然后,在OCX项目中提供对DLL函数和代码的封装。在OCX项目中的源文件中,可以使用DLL的导入库来调用DLL函数。根据需要,可以创建适当的封装函数,将DLL函数的参数和返回值与OCX控件的属性和方法进行映射。 接下来,可以设计和实现OCX控件的外观和交互功能。可以在OCX控件的资源视图中添加按钮、文本框等控件,设置控件的属性和事件。可以使用MFC提供的功能和技术,通过代码实现控件的功能和行为。 最后,可以将OCX控件生成为可执行文件。在VS2008中选择“生成”菜单,点击“生成解决方案”来生成OCX文件。通过在其他应用程序中导入这个OCX文件,就可以使用封装的DLL功能了。 通过以上步骤,就可以将VS2008中的DLL封装成OCX控件,方便在其他应用程序中使用。 ### 回答3: VS2008是Visual Studio 2008的缩写,OCX则代表Object Linking and Embedding (OLE) Control Extension,是一种微软的ActiveX控件格式。 要将VS2008中的DLL封装为OCX,可以按照以下步骤进行: 1. 打开Visual Studio 2008,并创建一个新的ActiveX控件项目。 2. 在项目中添加所需的DLL文件。可以使用“添加现有项”选项将DLL文件包含到项目中。 3. 在项目的资源管理器中,找到DLL文件,并右键单击该文件以打开属性窗口。 4. 在属性窗口中,将“扩展属性”下的“内容”设置为“yes”,并设置“独立内容”为“否”。 5. 在控件项目中添加与DLL文件相对应的接口和方法。接口和方法应该与DLL文件的功能相匹配。 6. 编译和生成项目,生成的结果将是一个OCX文件,其中包含了DLL文件封装后的控件。 7. 在其他项目中使用这个生成的OCX文件。可以通过将此OCX文件添加到项目的引用中,然后在项目中进行开发和使用。 封装后的OCX文件可以在其他应用程序中方便地使用,通过使用OCX提供的接口和方法,我们可以访问封装的DLL文件的功能。这样,我们就可以简化对DLL文件的调用和使用,提高开发的效率和灵活性。 总之,要将VS2008中的DLL封装为OCX,我们需要创建一个ActiveX控件项目,并将DLL文件添加到项目中。然后定义接口和方法,编译项目并生成OCX文件。最后,将生成的OCX文件用于其他项目中。通过这种方式,我们可以方便地使用封装后的DLL文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值