当前位置: 首页 > 编程日记 > 正文

com组件和一般dll的区别

这阵子在想一个需要利用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

相关文章:

WinCE6.0 修改开机Logo方法集锦(二)

中秋假期已过&#xff0c;回来继续该博文主题。今天讲解第二种方法&#xff0c;将Logo图片的数据写入到Nand Flash中&#xff0c;在启动初始化LCD的时候&#xff0c;从固定的地址将数据读出并填充到显示缓存中。<?xml:namespace prefix o ns "urn:schemas-microsoft…

[动态dp]线段树维护转移矩阵

背景&#xff1a;czy上课讲了新知识&#xff0c;从未见到过&#xff0c;总结一下。 所谓动态dp&#xff0c;是在动态规划的基础上&#xff0c;需要维护一些修改操作的算法。 这类题目分为如下三个步骤&#xff1a;&#xff08;都是对于常系数齐次递推问题&#xff09; 1先不考虑…

原始ajax方式调用asp.net后台方法

aspx页面&#xff1a; <% Page Language"C#" AutoEventWireup"true" CodeFile"Data.aspx.cs" Inherits"Data" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xht…

洛谷P4480 【[BJWC2018]餐巾计划问题】

这道题和网络流 \(24\) 题中的餐巾计划的确不一样, \([\) \(BJWC\) \(2018\) \(]\) 餐巾计划问题的数据范围更大。 一个餐厅在相继的 \(n\) 天里&#xff0c;每天需用的餐巾数不尽相同。假设第 \(i\) 天 \((\) \(i\) \(\) \(1\) \(,\) \(2\) \(,\) \(...\) \(,\) \(n\) \()\)需…

灵活使用java反射简化servlet

在我们初学jsp的时候&#xff0c;我们通常将java代码放到jsp页面

第四篇 Gallery控件

直奔主题~&#xff01; 结构如图&#xff1a; main.xml代码: <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical" android:la…

macaca之app-inspector

简单介绍 之前已经将macaca的环境搭建好了&#xff0c;现在就需要进行元素的定位&#xff0c;这里使用app-inspector&#xff0c;然后进行自动化脚本的编写。 实际操作 一、安装app-inspector npm i app-inspector -g 安装成功确保如下命令中有手机或模拟器的连接&#xff0c;可…

visual-reasoning 笔记

目录 整理最近学习 visual-reasoning的笔记 1. 关注 ACL、EMNLP、NAACLI等会议文章 未开始 2. Cyc项目 2.1 cyc知识库介绍&#xff1a; ​ 该知识库包含了320w条人类断言&#xff0c;30w概念&#xff0c;15000谓词。 ​ Cyc知识库中表示的知识一般形如“每棵树都是植物”、“植…

使用beanutil简化request值的接收

在刚开始学习java web的时候&#xff0c;我们想要接收从其他页面传过来的值常使用以下的语句 request.setCharacterEncoding("UTF-8");String Kind1 request.getParameter("foodKind");String Code1 request.getParameter("foodCode");String…

命令行编译运行CSharp文件

命令行编译运行CSharp文件 找到csc.exe所在的路径。如我本机上为“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727”在环境变量里增加变量CSC_HOME&#xff0c;值为以上路径。在PATH变量的值中加入%CSC_HOME%在cmd中进入要编译的cs文件所在的文件夹输入命令csc 文件名&#xf…

大话IT职场之工作和生活的平衡

每一个职场人都有自己的规划&#xff0c;特别是IT人员&#xff0c;基本都在想我要几个月掌握这门技术或语言&#xff0c;我要多久能带团队&#xff0c;我多长时间可以做到管理岗位&#xff0c;技术经理、技术总监等&#xff0c;每个人基本都充斥着这样的想法。但是否同时也在考…

安装和使用git遇到的问题总结

一&#xff0c;centos7下安装(因为centos7下用yum安装git的版本太低了&#xff0c;所以只能下载源代码&#xff0c;然后用源代码安装&#xff09; 下载编译工具 yum -y groupinstall "Development Tools" 下载依赖包 yum -y install zlib-devel perl-ExtUtils-MakeM…

Linux系统文本命令快速登录与退出

Linux是一个多用户的操作系统&#xff0c;用户要使用该系统&#xff0c;首先必须登录系统&#xff0c;使用完系统后&#xff0c;必须退出系统。用户登录系统时&#xff0c;为了使系统能够识别自己&#xff0c;必须输入用户名和密码&#xff0c;经系统验证无误后方能进入系统。在…

调试 后台 ajax post 对应的php的方法

在对应的javascript中 $.post("<?php echo ROOTURL ?>/Service/SetPlayerStartCord.php", "IP192.168.0.32&startCord_X400&startCord_Y30", function(data){!!!alert("Data Loaded: " data); }转载于:https://www.cnblogs.com…

log4j在eclipse上使用简介

Log4j是Apache的一个开源项目&#xff0c;通过使用Log4j&#xff0c;我们可以控制日志信息输送的目的地是控制台、文件、GUI组件&#xff0c;甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等&#xff1b;我们也可以控制每一条日志的输出格式&#xff1b;通过定义每…

关于编程的浅学习与深学习

导读&#xff1a;Tanky Woo的程序人生在博客中发表了《关于编程的浅学习与深学习》&#xff0c;文章是关于编程学习的一个提议、归纳、总结。以下是文章全部内容&#xff1a;关于编程的学习&#xff0c;大家肯定都知道&#xff0c;也是大家都说来说去的&#xff0c;就几句话&am…

shiro实战系列(一)之入门实战

一、什么是shiro? Apache Shiro 是一个强大而灵活的开源安全框架&#xff0c;它干净利落地处理身份认证&#xff0c;授权&#xff0c;企业会话管理和加密。 Apache Shiro 的首要目标是易于使用和理解。安全有时候是很复杂的&#xff0c;甚至是痛苦的&#xff0c;但它没有必要…

数据源和连接池

JDBC数据源&#xff1a; Data Source JDBC中提供了javax.sql.DataSource接口&#xff0c;负责建立与数据库的连接 DataSource对象可以由Web服务器提供&#xff0c;前提是需要在服务器配置DataSource&#xff08;包括连接池&#xff09; 连接池&#xff1a;Connection Pool…

FastReport.net 使用 Winform WebForm打印

delphi用的fastreport比较多 所以。net中也研究一下用法,这个打印控件还是很简单的 只要手动设计一下写少许代码就可以打印了 甚至可以写成通用代码 以后就可以不用写代码 安装demo会同时安一个设计器 打开设计器 通过设计器设计模板 新建数据源 新建数据集 查询单表全部内容&…

Ubuntu 12.04安装Sun JDK 6

Ubuntu 12.04安装Sun JDK 6 下载 sun jdk 6 bin. 设置权限 chmod x jdk-6u25-linux-i586.bin 解压文件 ./jdk-6u25-linux-i586.bin 移动位置到 sudo mv jdk1.6.0_25 /usr/lib/jvm/ 设置系统环境 sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.6.…

如果你的云服务商倒闭该怎么办?

如果你的云服务商倒闭或暂时中断服务&#xff0c;以下4个步骤能够帮助你的企业把损失减少到最低。 2009年2月&#xff0c;云服务商Coghead在一封写给客户的电子邮件中宣布该公司"由于受到经济挑战的影响"&#xff0c;将立即终止基于云的开发平台服务。随后&#xff0…

Ubuntu16.04桌面系统如何配置和启动wireshark

上一篇介绍了在Ubuntu系统中安装wireshark 本篇介绍在Ubuntu系统中配置和启动wireshark&#xff1b; 安装好后&#xff0c;直接在终端运行$ wireshark。出于安全方面的考虑&#xff0c;普通用户不能够打开网卡设备进行抓包&#xff0c;Wireshark不建议用户通过sudo在root权限下…

[导入]笔记本”终极“散热方案

笔记本老了&#xff0c;三年了&#xff0c;电池不太行了&#xff0c;散热量也大。解决电池问题首先是能耗的问题&#xff0c;我把能够卸下来的光驱和读卡器都拆了&#xff0c;这下留了一个大长孔&#xff0c;很好的是这样散热问题也得到了解决&#xff0c;光驱的大孔和读卡器那…

Android中Broadcast

前一段时间&#xff0c;听说过android的广播&#xff0c;这段时间经过研究终于可以写出一个Demo 首先新建一个android工程项目 在BroadCastActivity.java中 package com.mypack;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import…

java web三大组件之filter过滤器

过滤器是java web中相当重要的组成成分&#xff0c;是JavaWeb三大组件之一&#xff0c;它与Servlet很相似。不过过滤器有以下三条特性&#xff1a; 过滤器是用来拦截请求的&#xff0c;而不是处理请求的。当用户请求某个Servlet时&#xff0c;会先执行部署在这个请求上的Filte…

Permission denied: make_sock: could not bind to address [::]:81 Apache 虚拟主机

想建立一个测试用的虚拟主机&#xff0c;遇到了这个问题&#xff1a; [rootlocalhost html]# service httpd start Starting httpd: httpd: Could not reliably determine the servers fully qualified domain name, using localhost.termwikidev for ServerName (13)Permissio…

E: GPG 错误:http://developer.download.nvidia.com Release: 下列签名无效: NODATA 1 NODATA 2...

参考链接&#xff1a;https://github.com/NVIDIA/nvidia-docker/issues/571 在安装CUDA的时候出现的问题&#xff0c;根本原因是各位都懂的地区局域网特色&#xff0c;我试了很多方法&#xff0c;结果还是Github上一个老铁提出的一个简单方法&#xff1a;修改/etc/apt/sources.…

spring 框架学习(一)

1、spring简介 Spring 是一个开源框架&#xff0c;是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构&#xff0c;分层架构允许您选择使用哪一个组件&#xff0c;同时为 J2EE 应用程序开发提供集成的框架。Spring的一个最大的目的就是使JAVA EE开发…

Styling with the DataGridColumnStyle

详细讲解了如何自定义DataGrid控件&#xff0c;将多种控件&#xff08;如&#xff1a;进度条、按钮、下拉框&#xff09;绑定到数据列中 参考MSDNPart 1&#xff1a;http://msdn.microsoft.com/en-us/library/ms996449Part 2&#xff1a;http://msdn.microsoft.com/en-us/libra…

Excel常用公式记录

1.生成指定时间段内的日期&#xff1a; TEXT("2019/8/9 00:00"RAND()*54,"yyyy/mm/hh HH:MM") 注意&#xff1a;RAND()*54&#xff0c;54指从2019/8/9日起的54天&#xff0c;有时会有2019/8/00的错误格式 2.生成类似于“第一级”&#xff0c;“第二级”类似…