COM组件技术讲义04

合集下载

COM培训教程

COM培训教程

COM培训教程COM是一种面向对象的编程模型,是微软公司提出的Component Object Model(组件对象模型)的英文缩写。

COM技术的出现标志着微软公司向Windows应用程序开发提供了一个统一的内部机制,并向Windows软件开发领域引入了面向对象的编程思想。

COM具有广泛的适用范围,在Windows系统中,COM组件可以透明地使用,是Windows平台上的标准组件开发模型,包括DLL、EXE、OCX等。

为了帮助开发人员学习COM构架开发,推出COM培训教程,下面就以此为主题,进行详细介绍。

一、COM培训教程的概述在计算机技术日新月异的今天,软件应用变得越来越复杂,这就需要使用复杂的软件编程模型。

而COM组件模型的出现满足了这个需求,它可以很容易地构造出可重用的软件组件。

COM培训教程就是为了帮助开发人员更好的掌握COM组件模型的使用。

COM培训教程分为初级课程和高级课程两个部分。

初级课程主要介绍COM的基础知识,包括COM对象、接口、注册表、运行时库等方面的内容。

同时,还会介绍COM对象的调用顺序、内存管理及异常处理等知识点。

高级课程则会着重介绍COM组件的设计、开发和实现,以及如何进行组件的测试和调试等方面的内容。

同时还会介绍COM+等技术,并通过实例演示来深入讲解COM在具体应用中的实现过程。

二、COM培训教程的课程设置1.初级课程1.1 COM的基础概念了解COM组件模型含义,COM基础概念,COM组件的构成和分类。

1.2 COM对象了解COM对象的定义和特性,COM对象的标识方式,理解如何创建COM对象,如何使用COM对象等。

1.3 COM接口介绍接口的基础知识以及接口、对象、实现的关系,讲解相关技术术语,如IUnkown。

1.4 COM注册表讲解COM注册表的概念,以及如何使用注册表进行应用程序和组件的绑定等。

1.5 COM运行时库讲解COM运行时库的概念,介绍如何初始化COM运行时库以及相关函数。

COM组件及其设计.ppt

COM组件及其设计.ppt
• COM 组件之间是彼此独立的。当应用需求发生变更时, 可能需要更换中间层的个别COM组件,但这并不会影响 其他组件的继续使用。
• COM 组件具有若干对外接口(属性和方法),相当于芯片 的“管脚”。根据不同的应用需求,可以有选择地使用 不同的管脚。即使某些管脚被“废弃”,COM组件本身 仍然可继续使用。
四、DNS、MTS
2、MTS工作原理
四、DNS、MTS
3、 MTS的主要功能
MTS是一个基于组件的事务处理系统,用于开发配置和管 理高性能、可测和可靠的Internet及Intranet企业级应 用程序,提供了包括数据连接缓冲、线程管理、事务服 务等多项服务,很好地解决了多客户端利用组件频繁访 问后台数据库等一系列问题。使用好MTS不仅仅是一 个简单的技术问题,还需要运行经验的不断积累。
• 数据服务层 为应用提供数据来源。和以上的两层体系结构不同, 数据库不再和每个活动客户保持一个连接,而是若干个客户通过应 用逻辑组件共享数据库的连接,从而减少了连接次数,提高了数据 服务器的性能和安全性。我们可以根据需要选择Microsoft SQL Server、Oracle或任何与OLE DB或ODBC兼容的数据源。
三、COM组件对象的软件工程方法
(2)对组件进行设计时测试 在VB内部测试:添加一个标准EXE工程
利用VC的ActiveX Control Test Container 对 ActiveX控件进行测试:对控件的注册、注销及 重注册
在注册表中删除:regedit
三、COM组件对象的软件工程方法
3、COM/DCOM组件技术是由Microsoft公司与DEC公司 于 2 0 1 9 年 提 出 的 , COM 代 表 Component Object Model( 组 件 对 象 模 型 ) , DCOM 代 表 Distributed Component Object Model。

COM组件

COM组件

除了指定二进制组件标准,COM还定义一些基本的接口以提供一些所有基于COM组件的技术所公有的函数。此外,COM还提供一些所有组件所需要的API函数。
DCOM(the Distributed Component Object Model)扩展COM,以支持不同计算机之间的对象间通信,这些计算机可以是位于局域网,广域网,甚至是互连网。
COM对语言的唯一要求就是必须能创建结构指针,并且能显式地或隐式地通过指针调用函数。面向对象语言,如C++、Smalltalk等,都提供简化COM组件实现的编程机制。其它语言环境,如C、Pascal、Ada、Java、BASIC等也都能创建和使用COM组件。
COM定义了COM组件的本质特征。一般来说,软件是由一组数据以及操纵这些数据的函数构成的。COM组件通过一个或多个相关函数集来存取组件的数据,这些函数集称为接口,而接口的函数称为方法。COM组件通过接口指针调用接口的方法。
固有的安全性
负载平衡和错特征
分发、配置和管理的高效性
可以同任何网络协议相结合并集成到任何硬件平台
可以充分利用其它Internet标准和协议 DCOM规定了网络上组件之间的通信协定,因此DCOM可以说是组件之间的TCP/IP协议。
COM/DCOM组件目前广泛地用于Windows平台,由于Windows平台的极大的市场占有率,因此COM/DCOM事实上已经成为一种组件标准。COM/DCOM的流行还得益于众多优秀的开发工具的支持,Visual C++、Visual Basic、Delphi等语言工具都支持COM组件的制作。
为了理解COM以及所有建立COM基础之上的技术,有一点必须铭记在心,那就是COM不是一种面向对象语言,而是一种标准。COM 也不指定一个应用程序应该如何构建。语言,结构,以及实现细节都留给应用开发人员。COM指定一种组件模型以及COM组件(或对象)之间相互作用所需具备的编程要求。COM组件可以分布在同一个进程内,或者在不同的进程间,甚至是远端的机器上。COM组件可以是用不同的语言编写,结构也可以有很大的不同。COM被认为是一种二进制标准,因为它是一种当程序被编译成二进制机器码后才起作用的标准。

第四章COM技术

第四章COM技术

{ refcount++ } „引用次数,表明有指针过来
(此句话调用release)
release写了两句话: refcount- if refcount=0
Dotnet:垃圾回收
对象释放
六、获取别的接口
QueryInterface(QI) 获得其它的方法和属性(QI功能:从同一对象的
一个接口跳转到另一个接口) Dim pCar As IDrive Set pCar=new RaceCar pCar.Accelerate Dim pRace As IRace Set pRace=pCar pRace.PitStop pCar.Accelerate
文件 C
Class3 ….
Include (引用类) 分发时只需将文件拷贝
VB程序也想使用,但无法使用 程序需要编译,而中间需到二进制.exe,.dll级别
在二进制上创建类的规范,只需要按照该规范, 符合该规范,并具有相同的结构。 COM则是在二进制级别上创建类的标准。
(一)COM定义:
COM是定义如何进行类编程的标准, 不是一种语言,可在不同应用程序间被重用。 Dim object as class Set object= new class Object.____
(三)如何用COM类来工作
用接口来实例化一个类 dim <variable> As <some interface> 接口组属性和方法
Dim pGarbage As IDrive
IDrive GarbageTruck Fuel
Set pGarbage=New GarbageTruck pGarbage.Fuel=“Full”
(3)IActiveView:两种视图下都可获得如刷新显示等功能。

com 原理

com 原理

com 原理COM原理。

COM(Component Object Model)是一种面向对象的组件技术,它是微软公司在Windows操作系统中广泛应用的一种软件组件模型。

COM组件是一种可以被其他程序使用的独立的、可重用的软件单元,它可以以二进制形式存在于文件中,也可以作为动态链接库(DLL)的一部分存在。

COM组件可以被多种编程语言(如C++、Visual Basic、Delphi等)调用和使用,因此在Windows平台上得到了广泛的应用。

COM的核心思想是将软件功能划分为独立的组件,每个组件可以独立开发、测试、部署和维护。

这种模块化的设计思想使得软件开发变得更加灵活和高效,同时也方便了软件的升级和维护。

在COM中,每个组件都有自己的接口(Interface),其他程序可以通过调用这些接口来访问组件提供的功能。

这种基于接口的设计使得不同组件之间可以进行灵活的交互和组合,从而实现更加复杂的功能。

在COM中,组件之间的通信是通过接口调用来实现的。

每个COM组件都有一个或多个接口,每个接口都定义了一组相关的功能。

当一个程序需要使用某个组件的功能时,它首先需要获取该组件的接口指针,然后通过接口指针来调用组件提供的功能。

这种基于接口的通信机制使得组件之间的耦合度降低,同时也提高了系统的灵活性和可维护性。

COM组件的生命周期是由它的引用计数来管理的。

当一个程序需要使用某个组件时,它会通过接口指针来获取该组件的引用,并将引用计数加一;当不再需要使用该组件时,程序会释放该组件的引用,并将引用计数减一。

当引用计数减为零时,系统会自动销毁该组件,释放其占用的资源。

这种基于引用计数的内存管理机制使得COM组件的使用更加安全和高效。

在COM中,组件的注册是通过注册表(Registry)来实现的。

当一个COM组件被安装到系统中时,它会在注册表中创建相应的条目,包括组件的CLSID (Class Identifier)、接口的IID(Interface Identifier)等信息。

COM组件技术

COM组件技术

COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。

在COM构架下,人们可以开发出各种各样功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。

由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下。

COM与语言,平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块。

COM是开发软件组件的一种方法。

组件实际上是一些小的二进制可执行程序,它们可以给应用程序,操作系统以及其他组件提供服务。

开发自定义的COM组件就如同开发动态的,面向对象的API。

多个COM对象可以连接起来形成应用程序或组件系统。

并且组件可以在运行时刻,在不被重新链接或编译应用程序的情况下被卸下或替换掉。

Microsoft的许多技术,如ActiveX, DirectX以及OLE等都是基于COM而建立起来的。

并且Microsoft的开发人员也大量使用COM组件来定制他们的应用程序及操作系统。

COM所含的概念并不止是在Microsoft Windows操作系统下才有效。

COM并不是一个大的API,它实际上象结构化编程及面向对象编程方法那样,也是一种编程方法。

在任何一种操作系统中,开发人员均可以遵循“COM方法”。

一个应用程序通常使由单个的二进制文件组成的。

当编译器生成应用程序之后,在对下一个版本重新编译并发行新生成的版本之前,应用程序一般不会发生任何变化。

操作系统,硬件及客户需求的改变都必须等到整个应用程序被重新生成。

目前这种状况已经发生变化。

开发人员开始将单个的应用程序分隔成单独多个独立的部分,也既组件。

这种做法的好处是可以随着技术的不断发展而用新的组件取代以有的组件。

此时的应用程序可以随新组件不断取代旧的组件而渐趋完善。

而且利用已有的组件,用户还可以快速的建立全新的应用。

Com组件的详细资料

Com组件的详细资料

动态链接库动态链接库是个能够被应用程式和其他的DLL调用的过程和函数的集合体,他里面包含的是公共代码或资源。

由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL 中能实现一些一般程式所不能实现的功能,如实现windows的HOOK、ISAPI等。

同时,DLL还为不同语言间代码共享提供了一条方便的途径。

因而DLL在编程时应用较为广泛,本文将介绍怎么在 Delphi 中建立和使用DLL。

一.DLL 库内存共享机制从使用效果看,DLL和unit 非常像,他们都能被别的工程模块所调用,但二者在内部的实现机制上确存在着差别。

如果一个程式模块中用uses语句引用了某个unit,编译程式在编译该模块时,便会连同unit一起编译,并把编译后的可执行代码链接到本程式模块中,这就是个程式模块能够调用所引用unit中过程和函数的原因。

当同一个unit被多个工程所引用时,则每个工程中都含有该unit的可执行代码,当含有该unit的多个工程同时执行时,unit的可执行代码会随不同工程而多次被调入内存,造成内存资源的浪费。

DLL则不同,他即使被某个工程调用,编译后仍是独立的,也就是说编译后,一个DLL库形成一个独立的可执行文件,而不和所有其他的可执行文件连接在一起,因而DLL库并不从属于某个特定的工程,当多个工程调用同一个DLL 库时只有第一个工程把DLL库调入内存,其余工程并不重复调入同一个DLL库到内存,而是到同一个共享内存区读取。

并且,DLL的执行代码是在程式运行期间动态调入的,而不是如unit在程式运行时就和整个工程一起调入内存。

这样便可消除unit带来的相同代码多处占用内存的弊病。

二 Delphi中DLL库的建立在Delphi环境中,编写一个DLL同编写一个一般的应用程式并没有太大的差别。

事实上作为DLL 主体的DLL函数的编写,除了在内存、资源的管理上有所不同外,并不必其他特别的手段。

COM培训教程

COM培训教程

COM培训教程COM(Component Object Model)是一种用于组件间通信的架构,它可以实现不同应用程序组件的互操作。

COM培训教程旨在向初学者介绍COM的基本概念和使用方法,以帮助他们快速入门并开始开发自己的COM组件。

第一部分:COM概述(约200字)COM是一种面向对象的技术,它允许开发人员将代码模块化并以可重用的方式进行组合。

COM组件可以是任意编程语言编写的,只要它们符合COM的规范,就可以在不同的应用程序中进行调用和使用。

COM的核心概念是接口(Interface)。

接口定义了COM组件提供给其他组件调用的方法和属性。

通过接口,组件之间可以进行交互和通信。

COM组件还具有生命周期管理和对象实例化等基本特性。

第二部分:COM开发环境搭建(约300字)在开始COM开发之前,我们需要安装COM开发所需的工具和环境。

通常,COM开发需要使用Microsoft Visual Studio作为开发集成环境(IDE)。

Visual Studio提供了编译、调试和托管COM组件的功能。

除了IDE,我们还需要安装COM SDK(Software Development Kit),它包含了一些用于COM开发的工具和库。

COM SDK提供了COM组件的编译器、链接器和注册器等工具。

第三部分:COM组件编写(约400字)在这一部分,我们将学习如何编写一个简单的COM组件。

首先,我们需要定义COM组件的接口,接口定义了组件对外提供的方法和属性。

然后,我们需要实现接口,编写组件的具体功能代码。

接着,我们需要注册COM组件,使其可以在其他应用程序中被调用。

注册COM组件需要使用COM注册表,它是一个记录已注册组件信息的数据库。

我们可以使用COM SDK提供的注册器工具来执行注册操作。

最后,我们需要编译和部署COM组件。

编译COM组件需要使用COM编译器,它会将源代码转化为二进制文件。

部署COM组件需要将编译后的二进制文件复制到目标应用程序的目录,并在应用程序中进行配置。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
! 在客户与组件之间插入COM库,由COM 库完成创建的细节工作
Windows系统注册表
! 树状结构
– 根是“My Computer” – 预定义的5个子节点 – HKEY_CLASSES_ROOT
!为HKEY_LOCAL_MACHINE的一个子节点
– HKEY_CURRENT_USER
!为HKEY_USERS的一个子节点
HRESULT DllGetClassObject( const CLSID& clsid, const IID& iid, (void **)ppv
);
创建函数需要哪些信息?
! clsid
– 与类厂绑在一起
! iid
– 客户提供
! 结果接口指针
– 类型取决于iid
IClassFactory接口
创建过程的位置透明性
! 位置透明性可以极大地方便客户程序 ! 如何做到位置透明性?
– 在当前环境下,每个clsid必定与某个组件相 联系
– 如何从clsid映射到组件位置?
! 解决方案:
– 维护clsid与组件位置的映射关系 – 在客户与组件之间插入中介
COM方案
! 在Windows平台上,使用系统注册表保 存映射关系,所以,从clsid可以找到对 应组件的位置
! 进程外组件
– 命令行参数/RegServer和/UnregServer
COM库
! 创建过程
– COM库处于COM组件和客户中间
! 调用过程
– 对于进程内组件, COM库不再参与处理
COM对象创建过程
客户
COM创建函数
COM库
类厂对象接口指针
DllGetClassObject 组件
COM创建函数
创建函数所在的对象
! 该对象被称为类对象,也称为类厂 ! 现在问题是:如何创建类厂对象?
– 对于DLL通过引出函数 – 对于EXE,EXE的引出函数?
! 客户-〉引出函数-〉类厂对象-〉用户对象 ! 引出函数的名字固定:DllGetClassObject ! 增加了一层间接性,带来灵活性
创建对象结构示意图
组件程序 (组件进程)
组件对象
存根 DLL
④服务完成 后返回
③调用组件 对象接口成 员函数
回顾:对象与客户之间的连接
! 客户通过vtable与对象进行通信 ! 客户如何获得第一个接口指针?
– CreateString引出函数
! 如何创建(create)?激活(activate)? ! 创建工作一定是由组件中的一个函数来
回顾:COM对象的标识
! CLSID,两种形式
– 128位整数,随机数,不需要运算功能,但是 需要比较和查找功能
– 字符串形式
例如: {72d3edc2-a4c4-11d0-8533-00c04fd8d503}
! ProgID:友好名,字符串形式
– 有可能重名,用一种约定来避免重名 – 例如:Word.Document – 包含版本:Word.Document.8
! 第三个里程碑
– 管理对象生命周期:引用计数
COM接口
! 接口标识:IID ! IUnknown接口:
class IUnknown { public:
virtual HRESULT__stdcall QueryInterface( const IID& iid, void **ppv) = 0 ;
完成:创建函数CreateObject ! 客户如何访问这个函数?
创建建函数 – 优点:对于DLL非常方便
! 方案2
– 把创建函数封装到一个对象中,通过vtable调用 – 优点:灵活,客户以一致的方式调用创建函数
创建函数(续)
客户
创建函数指针
组件
客户
组件
创建函数指针
COM实现
潘爱民 /compcourse
内容
!复习:COM接口与COM对象 !注册表 !类厂 !COM库 !总结和例子
组件接口
! 第一个里程碑
– 用vtable作为接口 – 解决了名字冲突和二进制结构兼容问题
! 第二个里程碑
– 接口转换:Dynamic_cast
! 一个COM对象可以实现多个接口
– QueryInterface是技术保证
! QueryInterface实现
– 多继承情况:使用static_cast向上转换 – 对象身份:IUnknown必须唯一
! 客户通过QueryInterface使用对象的接口
– 注意:QueryInterface内含AddRef
virtual ULONG __stdcall AddRef() = 0; virtual ULONG __stdcall Release() = 0; };
COM接口结构
接口指针
pVtable
指针
vtable
指针函数 1 指针函数 2 指针函数 3
。。。。。。
对象实现
COM接口引用计数
! 引用计数的含义
IDL
! 类C的语言,但不是编程语言
– 跨语言的中间语言
! 编译器:MIDL.exe产生C++头文件定义
– 产生C++头文件定义,相当于C++定义
! MIDL.exe产生TLB类型库
– 许多编程语言利用COM对TLB的支持
! 所有的标准接口都可以在SDK中找到IDL描述
– 支持import/importlib语法
组件类别
COM组件的注册
! 进程内组件
– 两个引出函数DllRegisterServer和DllUnregisterServer 注册工具:RegSvr32.exe 例如:RegSvr32 c:\DictComp\DictComp.dll RegSvr32 /u c:\DictComp\DictComp.dll
! COM库中三个用于创建组件的函数:
CoGetClassObject CoCreateInstance CoCreateInstanceEx
CoGetClassObject
! 创建一个类厂
HRESULT CoGetClassObject( const CLSID& clsid, DWORD dwClsContext, COSERVERINFO *pServerInfo, const IID& iid, (void **)ppv
TreeControl的ProgID信息
{0713E8A2-850A-101B-AFC0-4210102A8DA7} COMCTL.TreeCtrl.1 {0713E8A2-850A-101B-AFC0-4210102A8DA7}
注册表其他事项
! 系统全局的注册信息、公共信息仓库 ! 工具RegEdit.exe、Regedt32、OLEView ! 程序访问途径:Win32 API ! Component Categories(组件类别)
– HKEY_LOCAL_MACHINE – HKEY_USERS – HKEY_CURRENT_CONFIG
通过注册表管理COM对象
! HKEY_CLASSES_ROOT\CLSID
TreeView组件的注册信息
Microsoft TreeView Control C:\WINDOWS\SYSTEM\COMCTL32.OCX COMCTL.TreeCtrl.1 {6B7E6392-850A-101B-AFC0-4210102A8DA7} C:\WINDOWS\SYSTEM\COMCTL32.OCX
应用 A (进程 A)
存根 DLL
②存根 DLL 通过 LPC 调用服务 f
③服务 f 通过 LPC 返回结果
进程 B 服务 f
进程外组件(续)
⑥代理对象返 回最终结果
①客户调 用接口成 员函数
客户程序 (客户进程)
代理 DLL 中代理对象
⑥⑤④ ①②③
②代理对象通过 LPC 调用组件存根
⑤存根 DLL 通过 LPC 返回结果
编译IDL
xxx.IDL文件
MIDL.exe
xxx.h C++头文件 xxx_i.c GUID xxx_p.c P/S dlldata.c xxx.tlb
用于客户/服务器 proxy/stub
用于其他编程语 言,如Java、VB
COM对象
! 对象标识:CLSID
! 封装:属性和方法,或者状态和操作
if (FAILED(hr)) return hr;
hr = pCF->CreateInstance(pUnkOuter, iid, (void *)ppv); pCF->Release();
return hr; }
CoCreateInstanceEx
HRESULT CoCreateInstanceEx( const CLSID& clsid, IUnknown *pUnknownOuter, DWORD dwClsContext, COSERVERINFO *pServerInfo, DWORD dwCount, MULTI_QI *rgMultiQI
– Outstanding reference
! 对象实现引用计数
– AddRef、Release
! 客户显式地操纵引用计数
– 客户有责任维护好引用计数
! 引用计数规则
COM接口QueryInterface
HRESULT __stdcall QueryInterface( const IID& iid, void **ppv)
GetProcAddress、FreeLibrary
相关文档
最新文档