COM技术初探1

合集下载

COM技术

COM技术

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

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

什么是ATLATL是ActiveX Template Library的缩写,它是一套C++模板库。

使用ATL能够快速地开发出高效、简洁的代码,同时对COM组件的开发提供最大限度的代码自动生成以及可视化支持。

COM的开发方法在ATL产生以前,开发COM组件的方法主要有两种:一是使用COMSDK直接开发COM组件,另一种方式是通过MFC提供的COM支持来实现。

直接使用COMSDK开发COM组件是最基本也是最灵活的方式。

通过使用Microsoft提供的开发包,我们可以直接编写COM程序。

但是,这种开发方式的难度和工作量都很大,一方面,要求开发者对于COM的技术原理具有比较深入的了解;另一方面,直接使用COMSDK 要求开发人员自己去实现COM应用的每一个细节,完成大量的重复性工作。

这样做的结果是,不仅降低了工作效率,同时也使开发人员不得不把许多精力投入到与应用需求本身无关的技术细节中。

虽然这种开发方式对于某些特殊的应用很有必要,但这种编程方式并不符合组件化程序设计方法所倡导的可重用性,因此,直接采用COMSDK不是一种理想的开发方式。

使用MFC提供的COM支持开发COM应用可以说在使用COMSDK基础上提高了自动化程度,缩短了开发时间。

MFC采用面向对象的方式将COM的基本功能封装在若干MFC的C++类中,开发者通过继承这些类得到COM支持功能。

为了使派生类方便地获得COM对象的各种特性,MFC中有许多预定义宏,这些宏的功能主要是实现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技术及OPC技术

COM技术及OPC技术



virtual HRESULT STDMETHODCALLTYPE Cancel(

/* [in] */ DWORD dwTransactionID) = 0;


};
OPC与COM间关系
❖ OPC(OLE for process control)是建立在微软 公司OLE/COM技术基础上。
❖ COM技术的出现为简单地实现控制设备和控制管 理系统之间的数据交换提供了技术基础。但如果 不提供一个工业标准化的COM接口,各个控制设 备厂家开发的COM组件之间的相互连接仍然是不 可能的。
❖ // 像上面一样创建COM对象,然后, ❖ if ( SUCCEEDED ( hr ) ) ❖{ ❖ //通知COM对象不再使用它 ❖ m_IOPCServer ->Release(); ❖} ❖ 应用程序对COM库进行初始化之后,可以调用COM库提供的各种服务,
在调用过程中必然要消耗COM库管理的资源。因此,COM程序在完成 COM库服务之后,通常在程序退出之前,终止COM库服务函数,以便 释放COM库所维护的资源。COM库的终止函数为: ❖ void CoUninitialize(void); ❖ 凡是调用CoInitialize函数返回S_OK的进程或者程序模块,都一定要调 用对应的CoUninitialize函数以保证COM库资源的有效利用。
接口的定义、结构与分类
❖ COM对于接口的定义和接口的实现作了严格的区分。通过 下面的IUnknown接口可以知道,在接口中只有接口方法的 描述,而没有实现。
❖ COM接口的名字以字母I打头。其中IUnknown接口最重要, 因为所有其它接口都是从IUnknown接口直接或间接继承而 来的。

COMDCOM技术简介

COMDCOM技术简介
• 每个COM对象都支持Iunknown接口,每 个COM接口也包括Iunknown接口,它用 作COM中所有通信的起点
• AddRef • Release • QueryInterface
引用计数
• COM采用引用计数技术来解决内存管理 的问题,COM对象通过引用计数来决定 是否继续生存下去。
接口查询
COM run time
COM run time
Security provider
RIPnCprocepSsreoscvuidrietyr RPC
Protocol stack LPC Protocol stack
Component
Local
DCOM networkprotocol
Remote
灵活的平安策略
M
HTTP
M
Queued
Client Machine
Server Machine
COM Object
COM核心效劳
• Security • Lifecycle Management • Type Information
(Interface Repository) • Monikers (Naming) • Automation (Dynamic
COM对象创立实例
main() { IAS15Demo* pInt; CoInitialize(NULL); CoCreateInstance(CLSID_AS15Demo, NULL, CLSCTX_SERVER, IID_IAS15Demo, &pInt); pInt->DoSomething(); …
Client Process
In-Process
Local Server Process

COM组件技术在电子商务系统中的应用

COM组件技术在电子商务系统中的应用

COM组件技术在电子商务系统中的应用引言电子商务系统已经成为现代商业的重要组成部分。

随着科技的进步和互联网的普及,越来越多的企业选择使用电子商务系统来进行在线销售和交易。

在开发和构建电子商务系统时,选择合适的技术和工具非常关键。

COM组件技术是一种常用的技术,其在电子商务系统中的应用也非常广泛。

本文将探讨COM组件技术在电子商务系统中的应用,并分析其优势和挑战。

COM组件技术概述COM(Component Object Model)是一种面向对象的二进制接口标准,旨在实现不同软件组件之间的互操作性。

COM组件可以通过定义和实现接口来提供特定功能,并通过接口方法进行交互。

COM组件可以用于各种软件开发和集成的场景,并且在Windows操作系统中得到广泛支持。

COM组件技术在电子商务系统中的应用1. 产品管理和库存控制电子商务系统需要管理大量的产品信息和库存数据。

通过使用COM组件技术,可以开发可重用的组件来处理产品管理和库存控制的功能。

这些组件可以提供添加、编辑和删除产品信息的接口,同时还可以实现库存的实时更新和管理。

通过将这些组件集成到电子商务系统中,可以实现高效的产品管理和库存控制。

2. 支付和交易处理电子商务系统的核心功能之一是支付和交易处理。

COM组件技术可以提供安全可靠的支付和交易处理功能。

通过使用COM组件技术,可以实现与第三方支付网关的集成,并提供方便的支付接口。

这些组件可以处理支付请求、验证交易信息,并生成支付确认和交易记录。

通过使用COM组件技术,电子商务系统可以实现快速、安全和准确的支付和交易处理。

3. 订单管理和物流追踪电子商务系统需要管理和追踪大量的订单和物流信息。

通过使用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是⼀种⾯向对象的组件模型,⽀持继承、数据的封装等。

C++学习笔记——COM技术的概念

C++学习笔记——COM技术的概念

C++学习笔记——COM 技术的概念//COM 方法概述1、COM 是开发软件组件的一种方法。

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

2、与单模应用程序相比,自定义组件可以在运行时刻同其他的组件连接起来以构成某个应用程序。

在需要对应用程序进行修改或改进时,只需要将构成此应用程序的组件中的某个用新的版本替换掉即可。

3、使用组件的种种优点直接来源于可以将它们动态的插入或卸出应用。

为了实现这种功能,所有的组件必须满足两个条件:第一,组件必须动态链接;第二,它们必须隐藏(或封装)其内部实现细节。

动态链接对于组件而言是一个至关重要的要求,而消息隐藏则是动态链接的一个必要条件。

//IUnknown 接口4、IUnknown 接口定义:IUnKnown 是一个接口。

所有COM 接口都继承IUnKnown 。

IUnknown 接口定义包含在Win32 SDK 的unknwn.h 中。

//IUnKnown 的定义interface IUnKnown{virtual HRESULT __stdcall QueryInterface(const IID& iid,void **ppv)=0; virtual ULONG __stdcall AddRef()=0;virtual ULONG __stdcall Release()=0;}作用:COM 定义的每一个接口都必须从IUnknown 继承过来,其原因在于IUnknown接口提供了两个非常重要的特性:生存期控制和接口查询。

客户程序只能通过接口与COM对象进行通信,虽然客户程序可以不管对象内部的实现细节,但它要控制对象的存在与否。

如果客户还要继续对对象进行操作,则它必须保证对象能一直存在于内存中;如果客户对对象的操作已经完成,以后也不在需要该对象了,则它必须及时的把对象释放掉,以提高资源的利用率。

IUnknown接口是所有COM接口的根。

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

/document/viewdoc/?id=915
2010/4/20
w
页码,7/15(W)
注意:所有具有 out 属性的参数都需要是指针类型。
1.3 IUnkown 接口
在整个例子除了 IUnkown 这个东西,其他应该不会感到陌生吧! COM 要求 ( 最基本的要求 ) 所有的接口都需要从 IUnknown 接口直接或间接继承,所 以 IUnknown 接口有 " 万恶之源 " 之称。 IUnkown 接口定义了三个方法。 HRESULT QueryInterface([in] REFIID riid,[out] void **ppv); ULONG AddRef(); ULONG Release(); 其中 AddReft() 和 Release() 负责对象引用计数用的,而 QueryInterface() 方法是用于查询所实现接口用的。每当 COM 组件被引用一次就应调用 一次 AddRef() 方法。而当客户端在释放 COM 组件的某个接口时就需要调用 Release() 方法。 这里所讲的请在下面的例子仔细体会。
三. 纯手工创建一个COM组件 1. 从建工程到实现注册 1.1 创建一个类型为win32 dll工程 1.2 定义接口文件 1.3 增加注册功能 1.3.1 增加一 个MathCOM.def文件 1.3.2 DllRegisterServer()和DllUnregisterServer() 1.4 MathCOM.cpp文件 1.5 小结 2. 实现ISmipleMath,IAdvancedMath接口和DllGetClassObject() 2.1 实现ISmipleMath和IAdvancedMath接口 2.2 COM组件调入大致过程 2.3 DllGetClassObject()实现 2.4 客户端 2.5 小结 3. 类厂 附录 A 我对dll的一点认识
/document/viewdoc/?id=915
2010/4/20
w
页码,8/15(W)
{ 0x7c8027ea, 0xa4ed, 0x467c, { 0xb1, 0x7e, 0x1b, 0x51, 0xce, 0x74, 0xaf, 0x57 } }; //{CA3B37EA-E44A-49b8-9729-6E9222CAE84F} static const GUID IID_IAdvancedMath = { 0xca3b37ea, 0xe44a, 0x49b8, { 0x97, 0x29, 0x6e, 0x92, 0x22, 0xca, 0xe8, 0x4f } }; interface ISimpleMath : public IUnknown { public: virtual int Add(int nOp1, int nOp2) = 0; virtual int Subtract(int nOp1, int nOp2) = 0; virtual int Multiply(int nOp1, int nOp2) = 0; virtual int Divide(int nOp1, int nOp2) = 0; }; interface IAdvancedMath : public IUnknown { public: virtual int Factorial(int nOp1) = 0; virtual int Fabonacci(int nOp1) = 0; }; #endif 此文件首先 #include <unknwn.h> 将 IUnknown 接口定义文件包括进来。 接下来定义了两个接口, GUID ( Globally Unique Identifier 全局唯一标识符)它能保证时间及空间上的唯一。 ISmipleMath 接口里定义了四个方法,而 IAdvancedMath 接口里定义了二个方法。这些方法都是虚函数,而整个 ISmipleMath 与 IAdvancedMath 抽象类就作为二进制的接口。
一、 COM 是一个更好的 C++ 1 、 COM 是什么
Don Box 说 "COM IS LOVE" 。 COM 的全称是 Component Object Model 组件对象模型。
2 、从 C++ 到 DLL 再到 COM 2.1 C++
如某一软件厂商发布一个类库 (CMath 四则运算 ) ,此时类库的可执行代码将成为客户应用中不可分割的一部分。假设此类库的所产生的机器码在目 标可执行文件中占有 4MB 的空间。当三个应用程序都使用 CMath 库时,那么每个可执行文件都包含 4MB 的类库代码 ( 见图 1.1) 。当三个应用程序共 同运行时,他们将会占用 12MB 的虚拟内存。问题还远不于此。一旦类库厂商发现 CMath 类库有一个缺陷后,发布一个新的类库,此时需要要求所 有运用此类库的应用程序。此外别无他法了。
ห้องสมุดไป่ตู้
图 1.2 CMath 引入库
2.3 COM
" 简单地把 C++ 类定义从 dll 中引出来 " 这种方案并不能提供合理的二进制组件结构。因为 C++ 类那既是接口也是实现。这里需要把接口从实现中分 离出来才能提供二进制组件结构。此时需要有二个 C++ 类,一个作为接口类另一个作为实现类。让我们开始 COM 之旅吧。
/document/viewdoc/?id=915
2010/4/20
w
页码,4/15(W)
图 1.1 CMath 的三个客户
2.2 DLL
解决上面问题的一个技术是将 CMath 类做成动态链接库 (DLL , Dynamic Link Library) 的形式封装起来 。 在使用这项技术的时候, CMath 的所有方法都将被加到 CMath dll 的引出表 (export list) 中,而且链接器将会产生一个引入库 (import library) 。 这个库暴露了 CMath 的方法成员的符号 。当客户链接引入库时,有一些存根会被引入到可执行文件中,它在运行时通知装载器动态装载 CMath Dll。 当 CMath 位于 dll 中时,他的运行模型见图 1.2
/document/viewdoc/?id=915
2010/4/20
w
页码,3/15(W)
一. 没有lib的dll 1.1 建一个没有lib的dll 1.2 调试没有lib的dll 二. 带有lib的dll 2.1 创建一个带有lib的dll 2.2 调试带有引用但没有头文件的dll 三. 带有头文件的dll 3.1 创建一个带有引出信息头文件的dll 3.2 调试带有头文件的dll 四. 小结
我们一般下面的宏来判断方法是否成功:
#define SUCCEEDED(hr)(long(hr)>=0) #define FAILED(hr)(long(hr)<0)
1.2 初识 IDL
/document/viewdoc/?id=915
2010/4/20
w
2 、一个比较简单的 COM
此例子共有四个文件组成: 文件名 Interface.h Math.h 和 Math.cpp Simple.cpp 主函数文件
2.1 interface. h 文件
说明 接口类定义文件 实现类文件 这里用来当作 COM 的客户端
#ifndef INTERFACE_H #define INTERFACE_H #include <unknwn.h> //{7C8027EA-A4ED-467c-B17E-1B51CE74AF57} static const GUID IID_ISimpleMath =
二、 COM 基础 1 、 CO M 基本知 识 1.1 返回值 HRESULT
/document/viewdoc/?id=915
2010/4/20
w
页码,5/15(W)
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 code
w
页码,1/15(W)
::首页 >> 文档中心 >> 在线杂志 >> COM技术(COM/DCOM/COM+)
[ 在线杂志 第 26期 ]
[ 原创文档 本文适合中级读者 已阅读 108307 次 ]
文档
COM 技术初探(一) 作者 : venture
相关文档
最新文档