COM组件的运行机制,即COM是怎么跑起来的

合集下载

com文件和exe文件的结构是怎么样的

com文件和exe文件的结构是怎么样的

com文件和exe文件结构1、com文件结构及原理com文件结构比较简单,它包含程序的一个绝对映像,即为了运行程序准确的处理器指令和内存中的数据,MS-DOS通过直接把该映像从文件直接复制到内存,从而加载com程序,而不做任何改变。

为加载一个com程序,MS-DOS首先试图分配内存,因为com程序必须位于一个64KB 的段中,所以com文件的大小不能超过65024(64KB减去用于PSP的256B和用于一个起始堆栈的至少256B)。

如果MS-DOS不能为程序、一个PSP、一个起始堆栈分配足够的内存,则分配尝试失败。

否则,MS-DOS分配尽可能多的内存(直至所有保留内存),即使com程序本身不能大于64KB。

在试图运行另一个程序或分配另外的内存之前,大部分com程序释放任何不需要的内存。

分配内存后,MS-DOS在该内存的前256B建立一个PSP,如果PSP中的第一个FCB 含有一个有效驱动器标识符,则置AL为00H,否则置位0FFH。

MS-DOS还置AH为00或0FFH,这依赖于第二个FCB是否含有一个有效驱动器标识符。

建造PSP后,MS-DOS 在PSP后立即开始(偏移100H)加载com文件,它置SS、DS和ES为PSP的段地址,接着创建一个堆栈。

为创建这个堆栈,在已分配了至少64KB内存的情况下,MS-DOS置SP为0000H;否则它置寄存器比所分配的自己总数大2的值。

最后,将0000H进栈(这是为了保证与在早期MS-DOS版本上设计的程序的兼容性)。

MS-DOS通过把控制传递给偏移100H处的指令而启动程序。

程序设计者必须保证COM 文件的第一条指令是程序的入口点。

注意:因为程序是在偏移100H处加载,因此所有代码和数据偏移也必须相对于100H。

汇编语言程序设计者可通过设置程序的初值为100H而保证这一点(例如通过在源程序的开始使用语句org 100h)。

com文件格式/PSP文件结构程序空余出的0x100的空间,由DOS生成。

第19章 组件对象模型(COM)解析

第19章  组件对象模型(COM)解析

新建ATL COM应用程序
设置ATL COM项目属性
19.3.2 创建新的ATL对象
• 要是ATL COM项有所作为,必须建立自定义的ATL对象。 • 单击“Insert”菜单,选中“New ATL Object”选项,在弹出的 ATL对象向导对话框中选中相应“Objects”对应右侧的“Simple Object”选项,如图19.4所示,选中后单击“Next”按钮。 • 如图所示,在单击“Next”按钮后,弹出的对话框如图所示,填 写对象名为“HelloMyATL”。
19.3.6 运行效果和小节
• 按F5键编译并运行“HelloOffice”项目,如果能正常编译通过, 则表明该项目已经顺利完成,并在输出目录下会生成一个 “HelloOffice.dll”文件,该文件已经在程序中注册了,因此无 需读者再进行手动注册,然后,打开Office Word软件,会发现如 图所示的效果。
19.3.4 导入Office接口文件
• 要与Office关联起来,需要导入Office给其他开发者提供的二次接口文件。 一个是“MSO.dll”,另一个是“MSWORD.OLB”。在“stdafx.h”头文件 中加入如下语句: #import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE10\\mso.dll" \ rename_namespace("Office") named_guids,exclude("Pages") using namespace Office; #import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.olb" rename_namespace("VBE6") using namespace VBE6; #import "C:\\Program Files\\Microsoft Office\\OFFICE\\MSWORD9.OLB" rename("ExitWindows","ExitWindowsEx") #import "C:\\Program Files\\Microsoft Office\\OFFICE\\MSWORD9.OLB" \ rename_namespace("Word"), raw_interfaces_only, named_guids ,exclude("Pages") using namespace Word;

COM组件简介

COM组件简介

COM组件简介面向对象的思想难以适应这种散布式软件模型,于是组件化程序设计思想取得了迅速的进展。

依照组件化的程序设计的思想,复杂的应用程序被设计成一些小的,功能单一的组件模块,这些组件模块能够运行在同一台机械上,也能够运行在不同的机械上。

为了实现如此的应用软件,组建程序和组建程序之间需要一些极为细致的标准,只有组件程序遵守了这些一起的标准,然间系统才能正常运行。

为此,OMG和Microsoft别离提出了CORBA(Common Object Request Breaker Architecture)和COM(Component Object model)标准,目前CORBA模型要紧应用于UNIX操作系统平台上,而COM 那么要紧应用于Microsoft Windows操作系统平台上。

在COM标准中,一个组件程序也被称为一个模块,它能够是一个动态连接库(DLL), 被称为进程内组件(in-of-process component)也能够是一个可执行程序(EXE),被称为进程外组件(out-of-process component).COM对象是成立在二进制可执行代码级的基础上,而C++等语言中的对象是成立在源代码级基础上的,因此COM对象是语言无关的。

这一特性利用不同编程语言开发的组件对象进行交互成为可能。

在Microsoft Windows系统平台上,COM技术被应用于系统的各个层次,从底层的COM对象治理到上层的应用程序交互都用到了COM标准。

概述COM既提出了组件之间进行交互的标准,也提供了实现交互的环境,因为组件对象之间交互的标准不依托于任何特定的语言,因此COM也能够是不同语言协作开发的一种标准。

OLE技术以COM标准为基础,OLE充分发挥了COM标准的优势,使Windows操作系统上的应用程序具有极强的可交互性。

若是没有OLE的支持,Windows操作系统那么会逊色很多。

可是,COM标准并非局限于OLE技术,事实上,OLE技术只是COM的一个应用罢了,这几年,OLE 技术在进行网络互连是显示出了专门大的局限性,而COM那么表现出了极强的适应能力。

结构化存储

结构化存储

1、结构化存储COM的结构化存储(structured storage)机制,也称为永久存储(persistent storage)机制。

结构化存储可以说是软件存储技术的一个重要进展,COM针对组件软件的需要,在文件系统的基础上,提出了结构化存储的概念。

利用结构化存储,组件程序之间可很好地协同工作,一个组件程序可以与另一个组件程序共享同一个文件,就如同一个应用程序与另一个应用程序共享同一个磁盘文件系统一样。

COM定义了结构化存储的规范,包括一组接口和实现这些接口成员函数的一些规则;同时COM也提供了结构化存储的实现,即复合文档技术。

复合文档技术是 OLE的基础。

OLE最初的目标是在文档中嵌入或链接对象,当然现在OLE的发展已经超出了这个范围,但复合文档仍然是OLE的基础存储技术。

2、结构化存储的引入组件化程序设计方法把应用系统设计成多个组件程序,如何在这些组件程序之间以共享方式访问同一个文件是组件化程序设计必须要解决的问题。

而多个组件通过文件句柄访问共享文件难以实现,结构化存储技术“借用”文件系统的概念,在文件内部构造了一个类似于文件系统的树状层次结构,解决了这一问题。

结构化存储的层次结构的节点可以是两种对象:存储对象和流对象,每个存储对象或者流对象都是一个可独立进行读写操作的对象,组件程序只对它拥有的节点对象进行操作。

从应用系统整体上看,这些组件程序在共享访问同一个文件。

3、文件系统操作系统的诞生把应用程序与底层存储设备隔离开来,操作系统为应用程序的运行提供了基本的抽象环境,它可以处理所有与存储设备有关的基本操作。

同时,操作系统引入了文件系统的概念,允许多个应用程序共享同一个存储设备。

而且,操作系统为应用程序提供了一种抽象的流式存储结构,应用程序仍然独立地访问它自己的存储空间,不同应用程序相互之间不受干扰。

4、文件系统与结构化存储的框图5、存储对象和流对象对于一个完整的存储操作来说,它被分为两个层次:应用程序调用API函数;操作系统提供API函数的实现。

COM组件技术介绍

COM组件技术介绍

软件发展趋势
❖ 组件软件、软件组件
– 中间件市场已经形成
❖ 软件基础设施的重要性
– 经验和成果的重用
❖ 软件的可重用性要求
– 重用粒度不同
❖ API的多样化 ❖ 软件方案(solution),consulting市场
组件软件
❖ 部分升级
– 补丁 – 缩短软件的更新周期
❖ 增加了异构软件的可能
– 标准接口、标准规范、标准协议
❖ 变种:
– B/S
概念:软件层次思想
❖ 垂直层次
❖ 层次之间采用“接口与实现”分离的原则
❖ 理解层次的思想有助于理解整个系统或者整个 应用
– 对于计算机而言,层次是逻辑的,它是计算机软件 领域中的发展空间
– 层次使得软件更加有序、有组织、有条理 – 层次的代价:效率、体积庞大
概念:其他
❖ 现代软件的发展形成了很多重要的概念
– 身份确定 – 封装 – 可重用
IUnknown
Interface1 Interface2
Object
COM:组件
❖ COM对象的载体
– 包含多个COM对象
❖ 进程内组件
– DLL
❖ 进程外组件
– EXE
COM:进程内组件
❖ Inproc server
– Export Entrys
客户
组件
COM:进程外组件
❖ MTS和COM+
COM:COM体系
❖ 基本的功能 ❖ 扩展功能
– 连接点 – 结构化存储 – 名字服务 – 自动化 – 其他
❖ COM+
COM:COM+
❖ 建立在COM的基础上,COM的自然 延伸

《COM原理与应用》学习笔记一

《COM原理与应用》学习笔记一

《COM原理与应⽤》学习笔记⼀ 为了学习ActiveX插件的编写,从这⼏天开始学习COM原理。

ActiveX是以COM为基础的,所以要想要⽐较深⼊的学习ActiveX技术需要先学习COM原理。

COM是微软提出的组件标准。

COM是在OLE技术的发展过程中产⽣的。

OLE主要是实现复合⽂档,⽽且OLE1也只实现了复合⽂档的功能,OLE1使⽤的是⼀种被称为动态数据交换(DDE, Dynamic Data Exchange)的技术。

其中DDE技术建⽴在Windows的消息基础之上,DDE有稳定性不好、效率低的缺点。

所以,DDE很快的就被淘汰了。

在OLE的第⼆个版本OLE2中,微软重写了OLE的⼤量底层代码,推出了新的COM模型。

(以上内容摘⾃《COM原理与应⽤》,p10) COM包括了两个部分,⼀个是COM的规范,另⼀个就是提供组件程序运⾏所需要的环境。

COM组件可以被视为⼀个模块,这个模块可以使动态链接库(Dll),也可以使⼀个可执⾏⽂件。

⽽且COM的实现是在⼆进制代码上,不存在语⾔不同不能调⽤的情况,可以做到夸语⾔调⽤。

⽽且现在⼤多数语⾔都⽀持COM,如C++、Java等主流语⾔都是⽀持COM的。

COM的优势:我在最开始看COM的时候,就想到了这么⼀个问题。

为了使⽤其他组件提供的功能,需要使⽤很多重复⽽⿇烦的函数来载⼊组件,这不是很⿇烦么,⼲嘛不直接使⽤dll解决问题得了。

后来想了想,使⽤COM有⼏个优势。

dll需要加载进⼊进程中去,⽽COM可以提供进程外的调⽤,甚⾄可以调⽤远程计算机上的组件。

同时dll加载到进程中去以后,⼀旦dll中的函数崩溃,那么主进程也会崩溃。

如果这是使⽤进程外调⽤,那么主进程仍然可以稳定的运⾏。

⾯对⼀个具有很多功能的⼤型程序,我们都会很⾃然的想到把这些功能分成⼏个⼩块来实现。

这样⽅便开发、测试以及维护。

这些⼀个个的⼩模块就是组件。

COM是⼀种⾯向对象的组件模型,⽀持继承、数据的封装等。

COM原理及组件开发ppt课件

COM原理及组件开发ppt课件

事务支持
分布式构件服务
资源分发管理
安全模型
COM
易于管理
基于接口的编程模型
基本的构件服务
精选课件ppt
9
什么是COM?
COM(Component Object Model),组件对象模型,是一 种以组件为发布单元的对象模型,这种模型使得各个软件组件 可以用一种统一的方式进行交互 COM是一种协议,它建立了一个软件模块同另一个软件模 块之间的连接,提供了组件之间进行交互的规范,也提供了实 现交互的环境
virtual ULONG_stdcall Release() = 0;
}
精选课件ppt
16
基本概念:接口定义语言
微软接口定义语言MIDL(Microsoft Interface Definition
Language)是定义COM接口的申述式语言
通过独立于具体编程语言的方式来定义接口
该语言基于OSF分布式计算环境(DCE)远程过程调用
接口定义例:
interface IDictionary
{
HRESULT Initialize();
HRESULT LoadLibrary([in] string);
HRESULT InsertWord([in] string, [in] string);
HRESULT DeleteWord([in] string);
精选课件ppt
25
接口查询
一个COM对象(构件)可以实现多个接口. 使用QueryInterface查询某个构件是否支持某个特定的接口
void foo(Iunknown * pI){
IX * pIX = NULL;
HRESULT hr = pI->QueryInterface(IID_IX,

COM原理讲述

COM原理讲述

COM原理COM是更好的C++C++:如果是静态连接的话,发布一个类库,此时类库的可执行代码将成为客户应用中不可分割的一部分。

当三个应用程序都使用这个库时,那么每个可执行文件都包含类库代码。

一旦类库厂商发现类库有一个缺陷后,发布一个新的类库,此时需要编译所有运用此类库的应用程序。

DLL:代码共享,解决上面问题的是将类库做成动态链接库(DLL ,Dynamic Link Library)的形式封装起来。

类库所有方法都将被加到dll 的引出表(export list)中,而且链接器将会产生一个引入库(import library)。

这个库暴露了库的方法成员的符号。

当客户链接引入库时,有一些存根会被引入到可执行文件中,它在运行时通知装载器动态装载dll。

COM:因为C++类那既是接口也是实现。

这里需要把接口从实现中分离出来才能提供二进制组件结构。

此时需要有二个C++类,一个作为接口类另一个作为实现类。

COM基础返回值:COM要求所有的方法都会返回一个HRESULT类型的错误号。

HRESULT 其实就一个类型定义;typedef LONG HRESULT。

有关HRESULT的定义见winerror.h 文件// Values are 32 bit values layed out as follows:// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0// +-+----+-------------------------+---------------------------------+// |S| Res| Facility | Code |// +-+----+-------------------------+---------------------------------+// where// S - is the severity code// 0 - Success// 1 - Error// Res- is a reserved bit// Facility - is the facility code// Code - is the facility''s status codeIDL:每个标准的COM组件都需要一个接口定义文件,文件的扩展名为IDL。

什么是COM如何使用COM

什么是COM如何使用COM

什么是COM,如何使用COM本文的目的是为刚刚接触COM的程序员提供编程指南,并帮助他们理解COM的基本概念。

内容包括COM规范简介,重要的COM术语以及如何重用现有的COM组件。

本文不包括如何编写自己的COM对象和接口。

COM即组件对象模型,是Component Object Model 取前三个字母的缩写,这三个字母在当今Windows的世界中随处可见。

随时涌现出来的大把大把的新技术都以COM为基础。

各种文档中也充斥着诸如COM对象、接口、服务器之类的术语。

因此,对于一个程序员来说,不仅要掌握使用COM的方法,而且还要彻底熟悉COM的所有一切。

本文由浅入深描述COM的内在运行机制,教你如何使用第三方提供的COM 对象(以Windows 外壳组件Shell为例)。

读完本文后,你就能掌握如何使用Windows操作系统中内建的组件和第三方提供的COM对象。

本文假设你精通C++语言。

在例子代码中使用了一点MFC和ATL,如果你不熟悉MFC和ATL也没关系,本文会对这些代码进行完全透彻的解释。

本文包括以下几个部分:COM——到底是什么?——COM标准的要点介绍,它被设计用来解决什么问题基本元素的定义——COM术语以及这些术语的含义使用和处理COM对象——如何创建、使用和销毁COM对象基本接口——描述IUnknown基本接口及其方法掌握串的处理——在COM代码中如何处理串应用COM技术——例子代码,举例说明本文所讨论的所有概念处理HRESULT——HRESULT类型描述,如何监测错误及成功代码COM——到底是什么简单地说,COM是一种跨应用和语言共享二进制代码的方法。

与C++不同,它提倡源代码重用。

ATL便是一个很好的例证。

源码级重用虽然好,但只能用于C++。

它还带来了名字冲突的可能性,更不用说不断拷贝重用代码而导致工程膨胀和臃肿。

Windows使用DLLs在二进制级共享代码。

这也是Windows程序运行的关键——重用kernel32.dll, user32.dll等。

COM原理及代码实例

COM原理及代码实例

原理基本概念介绍1.什么是COM(Component Object Modal)COM(Component Object Modal)是Microsoft组件对象模型的简称。

是一个说明如何建立可动态交替更新组件的规范。

简单地说,COM是一种跨应用和语言共享二进制代码的方法。

与C++不同,它提倡源代码重用。

A TL便是一个很好的例证。

源码级重用虽然好,但只能用于C++。

它还带来了名字冲突的可能性,更不用说不断拷贝重用代码而导致工程膨胀和臃肿。

2 .COM组件COM组件是由以Win32动态链接库(DLL)或可执行文件(EXE)发布的代码所组成。

3.为什么要学习COM传统的软件开发模式:传统的软件应用程序发布以后,使用者想得到更完善的软件或者去掉其中的某些内容,只有等软件提供商发布新的版本以后,使用者的这一梦想才能得以实现。

使用COM组件以后:软件开发人员可以在软件版本发布以后修改或者去掉软件某个不需要部分。

也及应用程序在更高的层次上定制,使得软件更具灵活性、动态性。

是未来应用软件开发的趋势。

4.COM的前身是OLE(Object Linking and Embedding)对象链接与嵌入。

5.组件:如积木一样,具有“块”的概念,可以动态的将他们插入或卸出应用程序。

这就需要两个条件:第一,组件必须动态链接(不因自己的位置改变而改变自身形式);第二,组件必须隐藏内部实现细节(独立与具体编程语言,二进制形式发布)。

每个组件相当于一个黑盒子,对外提供的只是接口(函数)。

如果接口没有发生任何变化时,对组件的修改几乎不会影响应用程序的其它部分。

提供服务的组件称为服务器组件,使用服务的组件称为客户组件。

1.2.完整的COM组件的接口实现实例#include <iostream>#include <objbase.h>using namespace std;void trace(const char * pMsg){cout<<pMsg<<endl;}// 抽象接口1interface InteX{virtual void _stdcall Fx1() = 0;virtual void _stdcall Fx2() = 0;};// 抽象接口2interface InteY{virtual void _stdcall Fy1() = 0;virtual void _stdcall Fy2() = 0;};// 抽象接口实现class CompA:public InteX,public InteY {public://实现接口InteXvirtual void _stdcall Fx1(){cout<<"CompA::Fx1"<<endl;}virtual void _stdcall Fx2(){cout<<"CompA::Fx2"<<endl;}//实现接口InteYvirtual void _stdcall Fy1(){cout<<"CompA::Fy1"<<endl;}virtual void _stdcall Fy2(){cout<<"CompA::Fy2"<<endl;}};// 客户程序int main(){trace("客户:创建组件的一个实例。

COM原理及应用-1

COM原理及应用-1

COM基础知识收藏COM基础知识(1) COM组件实际上是一个C++类,而接口都是纯虚类。

组件从接口派生而来。

我们可以简单的用纯粹的C++的语法形式来描述COM是个什么东西:class IObject{public:virtual Function1(...) = 0;virtual Function2(...) = 0;....};class MyObject : public IObject{public:virtual Function1(...){...}virtual Function2(...){...}....};IObject就是我们常说的接口,MyObject就是所谓的COM组件。

切记接口都是纯虚类,它所包含的函数都是纯虚函数,而且它没有成员变量。

而COM 组件就是从这些纯虚类继承下来的派生类,它实现了这些虚函数,仅此而已。

从上面也可以看出,COM组件是以C++为基础的,COM中所有函数都是虚函数,都必须通过虚函数表VTable来调用,这一点是无比重要的,必需时刻牢记在心。

(2) COM组件有三个最基本的接口类,分别是IUnknown、IClassFactory、IDispatch。

COM规范规定任何组件、任何接口都必须从IUnknown继承,IUnknown 包含三个函数,分别是QueryInterface、AddRef、Release。

这三个函数是无比重要的,而且它们的排列顺序也是不可改变的。

QueryInterface用于查询组件实现的其它接口,也就是看看这个组件的父类中还有哪些接口类,AddRef 用于增加引用计数,Release用于减少引用计数。

引用计数也是COM中的一个非常重要的概念。

大体上可以这么理解,COM组件是个DLL,当客户程序要用它时就要把它装到内存里。

另一方面,一个组件也不是只给你一个人用的,可能会有很多个程序同时都要用到它。

但实际上DLL只装载了一次,即内存中只有一个COM组件,那COM组件由谁来释放?由客户程序吗?不可能,因为如果你释放了组件,那别人怎么用,所以只能由COM组件自己来负责。

COM编程技术基础

COM编程技术基础

COM编程技术基础前言所谓COM(Componet Object Model,组件对象模型),是一种说明如何建立可动态互变组件的规范,此规范提供了为保证能够互操作,客户和组件应遵循的一些二进制和网络标准。

通过这种标准将可以在任意两个组件之间进行通信而不用考虑其所处的操作环境是否相同、使用的开发语言是否一致以及是否运行于同一台计算机。

显然,在COM规范下将能够以高度灵活的编程手段来开发、维护应用程序。

可以将一个单独的复杂程序划分为多个独立的模块进行开发,这里的每一个独立模块都是一个自给自足的组件,可以采取不同的开发语言去设计每一个组件。

在运行时将这些组件通过接口组装起来以形成所需要的应用程序。

构成应用程序的每一个组件都可以在不影响其他组件的前提下被升级。

这里所说的组件是特指在二进制级别上进行集成和重用而能够被独立生产获得和配置的软件单元。

COM规范所描述的即是如何编写组件,遵循COM标准的任何一个组件都是可以被用来组合成应用程序的。

至于对组件采取的是何种编程语言则是无关紧要的,可以自由选取。

作为一个真正意义上的组件,应具备如下特征:1)实现了对开发语言的封装。

2)以二进制形式发布。

3)能够在不妨碍已有用户的情况下被升级。

4)在网络上的位置必须能够被透明的重新分配。

这些特征使COM组件具有很好的可重用性,这种可重用性与DLL一样都是建立在二进制基础上的代码重用。

但是COM在多个方面的表现均要比DLL的重用方式好的多。

例如,在DLL中存在的函数重名问题、各编译器对C++函数名称修饰的不兼容问题、路径问题以及与可执行程序的依赖性问题等在COM中通过使用虚函数表、查找注册表等手段均被很好的解决。

其实COM组件在发布形式上本身就包扩DLL,只不过通过制订复杂的COM 规范,使COM本身的机制改变了重用的方法,能够以一种新的方法来利用DLL并克服DLL 本身所固有的一些缺陷,从而实现了更高层次的重用。

客户程序在与COM组件进行交互时,只需知道与哪个COM对象进行交互即可而不必关心组件模块的具体名称和位置,即COM对象的位置对客户是透明的。

COM原理及代码实例

COM原理及代码实例

1什么是COM(Component Object Modal)?COM(Component Object Modal)是Microsoft组件对象模型的简称。

是一个说明如何建立可动态交替更新组件的规范。

2 COM组件COM组件是由以Win32动态链接库(DLL)或可执行文件(EXE)发布的代码所组成。

3为什么要学习COM传统的软件开发模式:传统的软件应用程序发布以后,使用者想得到更完善的软件或者去掉其中的某些内容,只有等软件提供商发布新的版本以后,使用者的这一梦想才能得以实现。

使用COM组件以后:软件开发人员可以在软件版本发布以后修改或者去掉软件某个不需要部分。

也及应用程序在更高的层次上定制,使得软件更具灵活性、动态性。

是未来应用软件开发的趋势。

4 COM的前身是OLE(Object Linking and Embedding)对象链接与嵌入。

5组件:如积木一样,具有“块”的概念,可以动态的将他们插入或卸出应用程序。

这就需要两个条件:第一,组件必须动态链接(不因自己的位置改变而改变自身形式);第二,组件必须隐藏内部实现细节(独立与具体编程语言,二进制形式发布)。

每个组件相当于一个黑盒子,对外提供的只是接口(函数)。

如果接口没有发生任何变化时,对组件的修改几乎不会影响应用程序的其它部分。

提供服务的组件称为服务器组件,使用服务的组件称为客户组件。

6 完整的COM组件的接口实现实例#include <iostream>#include <objbase.h>using namespace std;void trace(const char * pMsg){cout<<pMsg<<endl;}// 抽象接口1interface InteX{virtual void _stdcall Fx1() = 0;virtual void _stdcall Fx2() = 0;};// 抽象接口2interface InteY{virtual void _stdcall Fy1() = 0;virtual void _stdcall Fy2() = 0;};// 抽象接口实现class CompA:public InteX,public InteY {public://实现接口InteXvirtual void _stdcall Fx1(){cout<<"CompA::Fx1"<<endl;}virtual void _stdcall Fx2(){cout<<"CompA::Fx2"<<endl;}//实现接口InteYvirtual void _stdcall Fy1(){cout<<"CompA::Fy1"<<endl;}virtual void _stdcall Fy2(){cout<<"CompA::Fy2"<<endl;}};// 客户程序int main(){trace("客户:创建组件的一个实例。

组件技术的本质COM理论知识

组件技术的本质COM理论知识
边的阐述中,您就会对这个问题自然而然的知道答案。
在介绍COM(Component Object Model ,组件对象模型)的时候,我们会省略一些细节,因
为我要可以将COM的很多细节都写了出来的话,我想我们其码要谈很长时间,再者,作者
在此也不敢说自己已经可以完全的驾驭COM。但会尽力的在本篇文章和以后的文章中对CO
property Factory: TComObjectFactory read FFactory;
property RefCount: Integer read FRefCount;
property ServerExceptionHandler: IServerExceptionHandler
能,如function IUnknown._AddRef = ObjAddRef;是从_AddRef的引用。HResult 是一个
特殊的返回值,它是ISupportErrorInfo 的产物,用来标识函数调用的世功或是失败。
如下:
ISupportErrorInfo = interface(IUnknown)
以利用它来调用返回HResult的COM函数。
但到底什么是COM对象呢?说了这么多,似乎还没有进入正体,已下将对COM对象给于详
细的解释,COM对象就是上边的CoClass!为什么要这么说呢?其实COM就是实现了一组接
口给用户提供服务的载体,如示意图所示COM对象就是要用户指通过访问其实现的接口来
得到服务,那么COM对象有什么必要的因素?就是Interfaces(是一组,至少应该包括两
个Interface),Implementation Interface的CoClass,而COM Interface实际是一组虚拟

com组件基础笔记(一)

com组件基础笔记(一)

com组件基础笔记(⼀)在很久以前,就因为项⽬的需求,接触到了组件的概念,但是由于各种原因(主要还是⾃⼰太懒...)没有系统的学习和理解组件.进⼏天项⽬空闲下来,我魔兽世界也85了..所以安⼼的把组件的知识梳理⼀遍,当然只是很基础很基础的东西,⾥⾯还参杂了⼀些⾃⼰的理解,写下来,可以让⾃⼰以后复习,也希望⾼⼿能指点,我的主要参考资料是《com技术内幕》,csdn上有下载。

什么是com组件?什么是com技术?这些有许多解释,我个⼈的理解就是控件咯,类咯,dll咯,总之就是个⿊盒⼦,我不知道它是⽤啥实现的,只要给我接⼝,知道咋⽤就⾏了——这就是我理解的组件。

那么如何实现组件呢?我们可以⽤c++的虚类来理解接⼝.每个接⼝实现了许多函数,许多接⼝便组成了组件...bulabulabula所有的com接⼝都实现了IUnknown接⼝(接⼝中的函数都必须实现,java中是这样),该接⼝有三个⽅法:QueryInterface、AddRef、Release,com接⼝的前三个函数必定是这三个,下⾯介绍这三个函数的功能QueryInterface(const IID&iid,void**ppv):客户⽤来通过此函数来查询某个组件是否⽀持某个特定的接⼝,若⽀持则返回指向此接⼝的指针,否则返回错误代码;第⼀个参数表⽰“接⼝标识符”,标⽰接⼝所需的常量,另⼀个参数存放接⼝地址的指针;返回HRESULT可⽤相应的宏判断返回值的意义;当接⼝不被⽀持的时候*ppv应该为NULL,下⾯是⼀些代码和注释...#include <iostream>#include <objbase.h>using namespace std;void trace(const char* msg) { cout << msg << endl ;}// Interfacesinterface IX : IUnknown{virtual void __stdcall Fx() = 0 ;} ;interface IY : IUnknown{virtual void __stdcall Fy() = 0 ;} ;interface IZ : IUnknown{virtual void __stdcall Fz() = 0 ;} ;// Forward references for GUIDsextern const IID IID_IX ;extern const IID IID_IY ;extern const IID IID_IZ ;//// Component//class CA : public IX,public IY{//IUnknown implementationvirtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv) ;virtual ULONG __stdcall AddRef() { return 0 ;}virtual ULONG __stdcall Release() { return 0 ;}// Interface IX implementationvirtual void __stdcall Fx() { cout << "Fx" << endl ;}// Interface IY implementationvirtual void __stdcall Fy() { cout << "Fy" << endl ;}} ;HRESULT __stdcall CA::QueryInterface(const IID& iid, void** ppv)/*存ä?放¤?地Ì?址¡¤的Ì?指?针?void* 可¨¦以°?包㨹容¨Y任¨?意°a类¤¨¤型¨ª*/{if (iid == IID_IUnknown){trace("QueryInterface: Return pointer to IUnknown.") ;/*static_cast < type-id > ( expression ) ? ?该?运?算?符¤?把ã?expression转Áa换?为atype-id类¤¨¤型¨ª,ê?但Ì?没?有®D运?⾏D时º¡À类¤¨¤型¨ª检¨¬查¨¦来¤¡ä保À¡ê证¡è转Áa换?的Ì?安ã2全¨?性?。

COM原理概述

COM原理概述
第! )卷第(期 & ’ ’ %年 )月
成 都 信 息 工 程 学 院 学 报 = > ? @ 1 /A, B 0 @ C ; >> @ D E 0 ? F D 8 GAD @ A ?.1 8 D @8 0 , B @ / C G
E H I < ! )@ H < ( F 6 3 < & ’ ’ % J
5 > > }







院学Βιβλιοθήκη 报第F U卷称为 % 就可以定义类的对象 (% 每一个类也用 ! " # $ 来唯一标识, & ’ # $。有了类以后, () 对象) * + , + . /0 1 2 。 % + , + . 3 4 5 # " 0 6 0 , 2 0接口 客户通过对象暴露的接口来访问接口的方法, 例如要访问 # 则用 8 + , + . ;!7 + , + .接口的7 0 9 + : + -方法, 0 < 8 ( ) , 其中8 ( ) 。一个 % 客户程序可以在运行 9 + : + = > + , + .为# + , + .指针 # + , + ." + , + . () 对象可以实现多个接口, 8 8 时刻对 % 从% () 对象的接口进行查询, () 对象的任何一个接口都可以查询到其它的接口。% () 的每一个接 口都必须从# " 0 6 0 , 2 0接口继承。 # " 0 6 0 , 2 0接口提供了接口查询和对象生存期管理的功能。如果客户要对对 象进行操作, 则必须保证对象能一直存在于内存中; 如果客户对对象的操作已经完成, 则必须把对象从内存释放 掉, 以提高资源的利用率。 可以有效的控制对象的生存期。 # " 0 6 0 , 2 0接口引入了引用记数方法, # " 0 6 0 , 2 0接 口包含3个方法: , , , 方法 ? 方法 C ? 9 1 @ # 0 + 1 @ * B 1 C : : D 1 * D 1 . 1 E 1 9 1 @ # 0 + 1 @ * B 1用于查询 % () 对象的其它接口, : < A A 当对象被创建时, 引用记数开始从 > 增加。当调用 C : D 1 *和 D 1 . 1 E 1用于引用记数。引用记数是一个整数, : : @ 1 * 时, 对象的引用记数加F 。当调用 D 时, 对象的引用记数减 。当对象的引用记数为 时, 对象可以自己释 1 . 1 E 1 F > 放自己。 用一个矩形表示 % 对象所支持的接口用一个小圆圈表示, 在矩形和小圆圈之间用一条线相连, 这 () 对象, 样就能很好地表示对象和接口之间的关系。则* 。 + , + .对象可以表示为图3

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运行时库以及相关函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档