COM聚合的实现的处理技巧
COM+系列——COM+事务处理

End If
Exit Sub
errnumber:
If Not Conn Is Nothing Then
If Conn.State = 1 Then
Conn.Close
End If
Set Conn = Nothing
End If
objCtx.SetAbort '事务失败回滚
On Error GoTo errhander
Set obj = CreateObject("TestComTrans.Class1")
Call obj.Add
MsgBox "事务成功"
Exit Sub
errhander:
MsgBox Err.Source + Err.Description, vbOKOnly, Err.Number
修改Class1的属性MTSTransactionMode为2-RequireTransaction,这一步很重要。
也可以不用选择,按照默认的设置,后面在COM+容器中设置事务。
引用”Microsoft Activex Data Object 2.7 Library”对象库和”COM+ Services Type Library”
如果组件中没有设置事务属性,那么这时也可以在COM+管理器中设置。
第三步:测试
我们打开vb新建一个标准exe工程,添加一个按钮即可
使用后期绑定来测试
代码如下:
Option Explicit
Private Sub Command1_Click()
Dim obj As Object
中间件实验指导书+包括rpc+com+corba等技术

《中间件技术》实验指导书西南交通大学软件学院2007年3月目录实验一RPC客户与服务器 (1)一、实验目的 (1)二、实验环境 (1)三、实验原理 (1)四、实验内容及步骤 (1)内容: (1)步骤: (1)五、实验注意事项 (1)六、实验报告要求 (1)七、思考题 (2)实验二动态链接库 (2)一、实验目的 (2)二、实验环境 (2)三、实验原理 (2)四、实验内容及步骤 (3)1、创建DLL文件 (3)2、调用DLL (3)五、实验注意事项 (3)六、实验报告要求 (3)七、思考题 (4)实验三COM组件 (4)一、实验目的 (4)二、实验环境 (4)三、实验原理 (4)四、实验内容及步骤 (4)简单Com实现步骤: (4)客户端实现步骤: (5)五、实验注意事项 (5)六、实验报告要求 (5)七、思考题 (5)实验四包容 (5)一、实验目的 (5)二、实验环境 (6)三、实验原理 (6)四、实验内容及步骤 (6)内容 (6)步骤 (6)五、实验注意事项 (6)六、实验报告要求 (6)七、思考题 (7)实验五聚合 (7)一、实验目的 (7)二、实验环境 (7)三、实验原理 (7)四、实验内容及步骤 (8)内容 (8)步骤 (8)五、实验注意事项 (8)六、实验报告要求 (8)七、思考题 (8)实验六CORBA (9)一、实验目的 (9)二、实验环境 (9)三、实验原理 (9)四、实验内容及步骤 (9)五、实验注意事项 (10)六、实验报告要求 (10)七、思考题 (10)实验七RMI (10)一、实验目的 (10)二、实验环境 (10)三、实验原理 (10)四、实验内容及步骤 (11)编写Java RMI的步骤主要包括以下几步 (11)编译和运行该RMI系统主要步骤有: (11)五、实验注意事项 (11)六、实验报告要求 (11)七、思考题 (11)实验八EJB (12)一、实验目的 (12)二、实验环境 (12)三、实验原理 (12)四、实验内容及步骤 (12)1、在eclipse下使用myeclipse创建EJB服务器端程序 (12)2、eclipse下启动JBOSS和发布EJB (13)3、客户端程序 (13)五、实验注意事项 (13)六、实验报告要求 (13)七、思考题 (13)实验一RPC客户与服务器一、实验目的通过编写RPC的客户服务程序,并调用相应的函数,掌握RPC的原理和编写RPC程序的基本方法。
COM接口协议 (3)

COM接口协议协议名称:COM接口协议一、引言COM(Component Object Model)接口协议是一种用于在不同软件组件之间进行通信和交互的标准协议。
本协议旨在规范COM接口的定义和使用,确保不同组件之间的互操作性和兼容性。
二、定义1. COM接口:COM接口是一组方法和属性的集合,用于定义组件之间的通信规范。
每一个COM接口都有一个惟一的标识符(Interface Identifier)用于标识该接口。
2. COM组件:COM组件是一种可重用的软件模块,可以通过COM接口与其他组件进行通信。
每一个COM组件都有一个惟一的标识符(Class Identifier)用于标识该组件。
三、接口定义1. 接口标识符(Interface Identifier):每一个COM接口都应具有一个惟一的标识符,用于标识该接口。
标识符采用UUID(Universally Unique Identifier)格式,由32个十六进制数字和4个破折号组成。
2. 接口方法(Interface Methods):接口方法定义了组件之间进行通信和交互的具体操作。
每一个接口方法都应具有惟一的名称、参数列表和返回值。
3. 接口属性(Interface Properties):接口属性定义了组件的状态和特性。
每一个接口属性都应具有惟一的名称、数据类型和访问权限。
四、接口使用1. 接口绑定(Interface Binding):组件在使用COM接口之前,需要通过接口绑定的方式获取接口的实例。
接口绑定可以通过编程语言提供的COM库或者COM对象创建函数来实现。
2. 接口调用(Interface Invocation):一旦获取了接口的实例,组件可以通过调用接口方法来实现与其他组件的通信和交互。
接口调用需要传递方法的参数,并处理返回值。
3. 接口释放(Interface Release):当组件再也不需要使用接口时,应该及时释放接口的实例,以避免资源泄漏和内存泄漏问题。
构件对象模型COM

COM基础
功能: (1)实现客户方与服务器方COM应用的创建过程 (2)COM通过注册表查找本地服务器(即EXE程序)
以及程序名与CLSID的转换 (3)提供标准的内存控制方法
DCOM的实现提供了分布式环境下的通信机制
在操作系统层次 以DLL文件的形式存在
6
(5) COM特性
COM基础
•语言无关性
构件引用记数
对象1
对象2
对象引用记数
对象引用记数
接口
接口引用记数
接口
接口引用记数
接口
接口引用记数
接口
接口引用记数
18
(3)接口查询
COM基础
一个COM对象(构件)可以实现多个接口 使用QueryInterface查询某个构件是否支持某个特定的接口
• QueryInterface的使用
void foo(Iunknown * pI){
内存管理函数:
CoTaskMemAlloc CoTaskMemRealloc CoTaskMemFree CoGerMalloc
COM基础
31
(3) 类厂(Class Factory)
COM基础
能够创建其他构件的构件 (构件厂) 其本身也是一个COM对象 支持一个特殊的接口 IClassFacroty 每一个COM对象类应该有一个相应的类厂对象
•数据库 OLE DB/ADO 以 COM 的方式 为数据访问提供一致的接口
•Internet ActiveX包含了所有基于COM的Internet相关技术
•COM+ 增加MTS等服务
8
2 COM接口
COM基础
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库的三种方法

COM组件三个最基本的接口类//VC6中使用COM库的三种方法COM组件有三个最基本的接口类,分别是IUnknown、IClassFactory、IDispatch。
COM规范规定任何组件、任何接口都必须从IUnknown继承,IUnknown包含三个函数,分别是QueryInterface、AddRef、Release。
这三个函数是无比重要的,而且它们的排列顺序也是不可改变的。
QueryInterface用于查询组件实现的其它接口,说白了也就是看看这个组件的父类中还有哪些接口类,AddRef用于增加引用计数,Release用于减少引用计数。
引用计数也是COM中的一个非常重要的概念。
大体上简单的说来可以这么理解,COM组件是个DLL,当客户程序要用它时就要把它装到内存里。
另一方面,一个组件也不是只给你一个人用的,可能会有很多个程序同时都要用到它。
但实际上DLL只装载了一次,即内存中只有一个COM组件,那COM组件由谁来释放?由客户程序吗?不可能,因为如果你释放了组件,那别人怎么用,所以只能由COM组件自己来负责。
所以出现了引用计数的概念,COM维持一个计数,记录当前有多少人在用它,每多一次调用计数就加一,少一个客户用它就减一,当最后一个客户释放它的时侯,COM知道已经没有人用它了,它的使用已经结束了,那它就把它自己给释放了。
引用计数是COM编程里非常容易出错的一个地方,但所幸VC的各种各样的类库里已经基本上把AddRef的调用给隐含了,在我的印象里,我编程的时侯还从来没有调用过AddRef,我们只需在适当的时侯调用Release。
至少有两个时侯要记住调用Release,第一个是调用了QueryInterface以后,第二个是调用了任何得到一个接口的指针的函数以后,记住多查MSDN 以确定某个函数内部是否调用了AddRef,如果是的话那调用Release的责任就要归你了。
IUnknown的这三个函数的实现非常规范但也非常烦琐,容易出错,所幸的事我们可能永远也不需要自己来实现它们。
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相关技术

组件A 组件B
组件C
组件E
组件D
4
2.2 COM技术的体系结构
COM定义
COM(Component Object Model,即组件对象模 型)是软件对象组件互相通信的一种方式,它 是一种二进制和网络标准,允许任意两个组件 互相通信,而不管它们是在什么计算机上运行 (只要计算机是相连的),不管各计算机运行 的是什么操作系统(只要该操作系统支持COM), 也不管该组件是用什么语言编写的。
30
实现引用计数
一个COM组件可以实现多个COM对象,并且每个COM对 象又可以支持多个COM接口,这种层次结构为实现引 用计数提供了多种选择方案。
COM组件一级实现引用计数。
设置一个针对整个组件全局的引用计数。 计数分辨率太粗。
利用成员变量,为每个COM对象设置一个引用计数。 组件程序应保持一份有效对象的纪录。 三级计数控制。 计数分辨率太细。
14
COM库
COM标准的实现部分是COM库,包括一些核心的系统级代 码,使得对象和客户之间可通过接口在二进制代码级进 行交互,以.dll文件的形式存在。 COM库在OS层实现,一个OS只有一个COM库实现。 COM库可以保证所有的组件按照统一的方式进行交互操作, 而不需编写为进行COM通信所必需的大量基础代码,直接 利用COM库提供的API进行编程,加快开发速度。
第二章 COM相关技术
内容: COM技术的发展 COM技术的体系结构 COM技术中接口 COM类工厂机制 DCOM技术 COM+技术 .NET框架 知识点: COM结构 COM组件 COM对象 COM库 COM接口 COM类厂
1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
COM聚合的实现:
在com聚合和包容的区别中已经阐述了他们的不同,正是由于这些不同,导致COM包容不需要特殊处理,因为包容不仅继承了外部组件的接口,同时继承了内部组件的接口,所以在IID_xxx接口查询的时候,通过对外部THIS指针的转换,可以返回不同的接口,不存在查询不到的接口。
而聚合不同由于存在两个不同的IUNKOWN接口,所以在用内部接口查询外部接口的时候会查询不到,违背了“如果一个接口可以查询到,那么用其他任何接口都可被查询到的原则”。
解决这个问题是通过以下技巧:
问题:
1、通过外部组件接口可以访问内部组件的接口,m_pIY->QueryInterface();
2、问题在于通过内部组件的接口不能访问外部组件,关键原因还在于内部组件没有外部组
件的IUNKOWN指针。
解决办法:
1、所以让内部组件拥有外部组件的IUNKOWN接口就行了,
CoCreateInstance(IUNKOWN* ..)函数的第一个参数就是要聚合用的,如果聚合的话,就传递给内部接口一个外部组件的IUNKOWN指针,这样内部就可以访问外部的接口了。
2、。