这阵子在想一个需要利用com组件的小程序怎么做,突然想起上次去面试的时候考官问过autocad开发时为什么要利用com,而不采用一般的dll呢?     到google上查了一下,许多人也问了一样的问题:)     用com来写程序要比普通的dll麻烦一些,但是带来的好处也大很多,尤其是在开发像autocad这样大型软件的时候,需要跨区域来协同工作。 学习COM,首先要知道COM的目的是什么,它解决了一个什么样的问题,在此基础上,MS提供了各式各样的可扩展的COM服务,COM编程接口。这些服务和接口恐怕一个程序员一辈子都不可能通晓,因为发展是如此之快。大家也没有必要通晓这些接口,就象对待大量的WIN   API的态度,用到时再查帮助。  



 COM的各种努力都是在规定了一种二进制交互的协议。说起来简单,做起来相当复杂,要使使用不同语言编写的客户能够使用任意语言编写的服务程序谈何容易!这里说语言还是把问题简单化了,因为每种语言还有各式各样的编译器,不同编译器出来的二进制代码如何交互?  

就拿DLL来说,DLL是对静态连接的一种改进,带来了更细的开发分工,也带来了很多问题,

其中就有二进制如何交互的问题。这个问题当DLL输出类时更加突出。COM为解决此问题提出了极负创意的解决方案,不仅如此,更进一步引申,提出了如何跨 网络的交互。然后,针对internet服务器的开发提出COM+。COM体系中融合了多种经典的设计模式,可以说是一种更加精干的C++。



COM博大精深,若干大师仍须半年的mental   fog,   方能有豁然开朗之时。我们这些晚辈,还需多加修炼才对,但决不止是COM“    1、COM组件以接口对功能分类,便于组织;DLL特别是大的DLL,函数一大堆         ,难以组织;     2、COM组件便于升级维护,功能扩充,只需添加接口就行;DLL升级困难,函         数不能随意改变;     3、COM创建调用有很好的安全性,DLL没有;     4、COM组件可轻松实现进程间调用,DLL很困难;     5、COM组件可轻松实现分布式调用,DLL不可能;     6、COM组件具有封装、继承、多态的面向对象特征,DLL只有封装;     7、在COM组件的基础上实现了大量功能:ActiveX,OLE等;

Activex、OLE、COM、OCX、DLL之间的区别

熟悉面向对象编程和网络编程的人一定对ActiveX、OLE和 COM/DCOM这些概念不会陌生,但是它们之间究竟是什么样的关系,对许多们还是比较模糊的。在具体介绍它们的关系之间,我们还是先明确组件 (Component)和对象(Object)之间的区别。组件是一个可重用的模块,它是由一组处理过程、数据封装和用户接口组成的业务对象(Rules Object)。组件看起来像对象,但不符合对象的学术定义。它们的主要区别是: 1)组件可以在另一个称为容器(有时也称为承载者或宿主)的应用程序中使用,也可以作为独立过程使用; 2)组件可以由一个类构成,也可以由多个类组成,或者是一个完整的应用程序; 3)组件为模块重用,而对象为代码重用。现在,比较流行的组件模型有COM(Component Objiect Module,对象组件模型)/DCOM( Distributed COM,分布式对象组件模型)和CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)。到这里,已经出现了与本文相关的主题COM,而CORBA与本文无关,就不作介绍。之所以从组件 与对象的区别说起,是想让大家明确COM和 CORBA是处在整个体系结构的最底层,如果暂时对此还不能理解,不妨继续往下看,最后在回过头看一看就自然明白了。现在开始阐述ActiveX、OLE 和COM的关系。首先,让大家有一个总体的概念,从时间的角度讲,OLE是最早出现的,然后是COM和ActiveX;从体系结构角度讲,OLE和 ActiveX是建立在 COM之上的,所以COM是基础;单从名称角度讲,OLE、ActiveX是两个商标名称,而COM则是一个纯技术名词,这也是大家更多的听说 ActiveX和OLE的原因。既然OLE是最早出现的,那么就从OLE说起,自从Windows操作系统流行以来,“剪贴板”( Clipboard)首先解决了不同程序间的通信问题(由剪贴板作为数据交换中心,进行复制、粘贴的操作),但是剪贴板传递的都是“死”数据,应用程序开 发者得自行编写、解析数据格式的代码,于是动态数据交换(Dynamic Data Exchange,DDE)的通信协定应运而生,它可以让应用程序之间自动获取彼此的最新数据,但是,解决彼此之间的“数据格式”转换仍然是程序员沉重的 负担。对象的链接与嵌入(Object Linking and Embedded,OLE)的诞生把原来应用程序的数据交换提高到“对象交换”,这样程序间不但获得数据也同样获得彼此的应用程序对象,并且可以直接使用 彼此的数据内容,其实OLE是Microsoft的复合文档技术,它的最初版本只是瞄准复合文档,但在后续版本OLE2中,导入了COM。由此可见, COM是应OLE的需求而诞生的,所以虽然COM是OLE的基础,但OLE的产生却在COM之前。 COM的基本出发点是,让某个软件通过一个通用的机构为另一个软件提供服务。COM是应OLE 的需求而诞生,但它的第一个使用者却是OLE2,所以COM与复合文档间并没有多大的关系,实际上,后来COM就作为与复合文档完全无关的技术,开始被广 泛应用。这样一来, Microsoft就开始“染指”通用平台技术。但是COM并不是产品,它需要一个商标名称。而那时Microsoft的市场专家们已经选用了OLE作为 商标名称,所以使用COM技术的都开始贴上了 OLE的标签。虽然这些技术中的绝大多数与复合文档没有关系。Microsoft的这一做法让人产生这样一个误解OLE是仅指复合文档呢?还是不单单指复 合文档?其实OLE是COM的商标名称,自然不仅仅指复合文档。但Microsoft自己恐怕无法解释清楚,这要花费相当的精力和时间。 于是,随着Internet的发展,在1996年春,Microsoft改变了主意,选择ActiveX作为新的商标名称。ActiveX是指宽松定义 的、基于COM的技术集合,而OLE仍然仅指复合文档。当然, ActiveX最核心的技术还是COM。ActiveX和OLE的最大不同在于,OLE针对的是桌面上应用软件和文件之间的集成,而ActiveX则以提 供进一步的网络应用与用户交互为主。到这里,大家应该对ActiveX、OLE和COM三者的关系有了一个比较明确的认识,COM才是最根本的核心技术, 所以下面的重点COM。让对象模型完全独立于编程语言,这是一个非常新奇的思想。这一点从C++和Java的对象概念上,我们就能有所了解。但所谓COM 对象究竟是什么呢?为了便于理解,可以把COM看作是某种(软件)打包技术,即把它看作是软件的不同部分,按照一定的面向对象的形式,组合成可以交互的过 程和以组支持库。COM对象可以用C++、Java和VB等任意一种语言编写,并可以用DLL或作为不同过程工作的执行文件的形式来实现。使用COM对象 的浏览器,无需关心对象是用什么语言写的,也无须关心它是以DLL还是以另外的过程来执行的。从浏览器端看,无任何区别。这样一个通用的处理技巧非常有 用。例如,由用户协调运行的两个应用,可以将它们的共同作业部分作为COM对象间的交互来实现(当然,现在的OLE复合文档也能做到)。为在浏览器中执行 从Web服务器下载的代码,浏览器可把它看作是COM对象,也就是说,COM技术也是一种打包可下载代码的标准方法(ActiveX控件就是执行这种功能 的)。甚至连应用与本机OS进行交互的方法也可以用COM来指定,例如在Windows和Windows NT中用的是新API,多数是作为COM对象来定义的。可见,COM虽然起源于复合文档,但却可有效地适用于许多软件问题,它毕竟是处在底层的基础技术。 用一句话来说,COM是独立于语言的组件体系结构,可以让组件间相互通信。随着计算机网络的发展,COM进一步发展为分布式组件对象模型,这就是 DCOM,它类似于CORBA的ORB,本文对此将不再做进一步的阐述。通过上面的讲述相信大家一定对ActiveX、OLE和COM/DCOM的关系有 了一个清楚的了解。

使用Windows的人对于ActiveX控制一定不会陌生,它提供了一种类似于DLL动态链接库的调用,不过它与DLL的唯一区别就是ActiveX不 注册不能被系统识别并使用。那么,当我们得到一个ActiveX没有被正确安装且不能使用的消息后,又要安装ActiveX怎么办呢?1. Regsvr32程序法在Windows的System文件夹下有一个regsvr32.exe的程序,它就是Windows自己带的ActiveX注册 和反注册工具。利用它也能够非常方便地注册AcitveX控件,它的用法为:regsvr32/u/s/n/i dllname, dllname其中dllname为ActiveX控件文件名,建议在安装前拷贝到System文件夹下参数有如下意义:/u - 反注册控件/s - 不管注册成功与否,均不显示提示框/c - 控制台输出/i - 跳过控件的选项进行安装 (与注册不同)/n - 不注册控件,此选项必须与/i 选项一起使用例如笔者要注册一amovie.ocx控件,则打入 regsvr32 amovie.ocx即可,要反注册它时只需使用 regsvr32 /u amovie.ocx就行了。2.注册表法所谓注册AcitveX,无非是将一些信息记录在Windows的注册表中,如Shockwave Flash Object控件,我们可以运行Regedit.exe注册表编辑程序,利用关键字进行搜索,然后把搜索得到后的注册表导出为一REG注册表文件,再将其 相应的ActiveX文件拷贝到Windows的System文件夹(一般ActiveX的文件名为OCX,安装在Windows的System文件夹 内)下,最后在要安装ActiveX的机器上双击导入刚才导出的注册表文件即可完成安装。

Activex,OLE,COM都是微软的一些技术标准。Ole比较老后来发展成Activex,再后来发展成为COM OCX,DLL是扩展名。 Activex有两种扩展名OCX和DLL。实际上你可以把它们的扩暂名字调换。 COM作为ActiveX的更新技术,扩展名也有可能是DLL DLL文件还有可能是动态链接库。主要是装载一些函数,可以动态加载。 com的前景 以后一种比较理想的应用程序模式就是Web化(条件是网络速度足够快),未来的软件应该不存在客户应用软件的说法了,客户就只有浏览器,浏览器就是操作系统,客户一边下载一边使用,当然下载的都是一个个功能独立的模块。而这些功能独立的模块就是com组件,一般的dll是不能这么用的。

转载于:https://www.cnblogs.com/lihaozy/archive/2012/07/04/2576449.html

com组件和一般dll的区别相关推荐

  1. Activex、OLE、COM、OCX、DLL之间区别、联系

    转自:http://baike.baidu.com/view/393671.htm 概述 .ocx是ocx控件的扩展名,与.exe .dll同属于PE文件.下面说说什么是ocx控件! OCX 是对象类 ...

  2. OCX和DLL的区别

    转自:http://blog.csdn.net/scucj/archive/2006/06/29/852181.aspx 一.关于DLL的介绍        DLL,动态链接库,Dynamic Lin ...

  3. 关于Dll、Com组件、托管dll和非托管dll的理解

    Com组件和dll区别: 1.普通dll不能通过regsvr32.exe来注册,而Com组件能通过regsvr32.exe注册. 2.Com组件是微软的一个协议,满足com组件协议的dll文件就是co ...

  4. C/C++ 知识点---LIB和DLL的区别与使用(网摘)

    LIB和DLL的区别与使用 原文出处:[远风工作室] 共有两种库: 一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dyn ...

  5. LIB和DLL的区别与使用,非常详细

    2019独角兽企业重金招聘Python工程师标准>>> 共有两种库: 一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供, ...

  6. [转]LIB和DLL的区别与使用

    原文地址: http://www.cppblog.com/amazon/archive/2011/01/01/95318.html 共有两种库: 一种是LIB包含了函数所在的DLL文件和文件中函数位置 ...

  7. [react] 在React中组件和元素有什么区别?

    [react] 在React中组件和元素有什么区别? 组件首字母大写 组件是由元素构成的.元素数据结构是普通对象,而组件数据结构是类或纯函数 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚 ...

  8. [vue] 组件和插件有什么区别?

    [vue] 组件和插件有什么区别? 组件 (Component) 是用来构成你的 App 的业务模块,它的目标是 App.vue.插件 (Plugin) 是用来增强你的技术栈的功能模块,它的目标是 V ...

  9. lib和dll的区别

    lib和dll的区别 共有两种库: 一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link librar ...

最新文章

  1. SAP MM盘点流程里如何处理事务代码MI11 Recount过的盘点凭证?
  2. python json模块的内部实现_python – 如何使用JSON模块进行漂亮打印时实现自定义缩进?...
  3. 从C++中的const到MMU(存储器管理单元)(MMU部分为网页整理)
  4. java 运行 .jar 文件乱码
  5. leetcode 144 --- 二叉树前序遍历
  6. 一加10 Pro首发定制X轴线性马达:Top级超大体积 安卓阵营马达天花板
  7. RabbitMQ架构
  8. mysql单张表数据量极限_极限数据量范围的安全测试
  9. openwrt PPPoE拨号如何设置-小米3硬改
  10. 做嵌入式开发经历(三).绝知此事要躬行
  11. 电影天堂python分页爬取
  12. cf卡,mmc卡,sd卡,sm卡,xd卡,记忆棒的区别是什么?
  13. C语言中如何测量各种变量的长度
  14. 小米红米4(标准版)解BL锁教程申请BootLoader解锁教程
  15. Clojure Web开发–最新技术–第2部分
  16. go 四种 base64 编码实现方式
  17. fgets()和gets()函数的区别
  18. 【免费认证】Juniper免费认证指南
  19. 如何进行批量邮件搬迁?
  20. ITN网络课程笔记(十七)(完)

热门文章

  1. 伍六七带你学算法 入门篇-最小的k个数
  2. 三层交换机原理:02怎么用三层交换机?
  3. SpringSecurity安全验证中文乱码问题
  4. Apple苹果公司组织架构
  5. PyTorch 自动微分示例
  6. Linux内存技术分析(下)
  7. 3D惯导Lidar仿真
  8. seq2seq与Attention机制
  9. window路径和linux路径变换,从linux样式路径转换时,Docker装入的卷将; C添加到Windows路径的末尾...
  10. C++ 类模板的使用