COM技术
- 格式:doc
- 大小:54.00 KB
- 文档页数:8
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运行时库以及相关函数。
OPC通讯与COM技术原理具体来说,OPC通讯的原理包括以下几个方面:技术:COM技术是OPC通讯的基础,它提供了一种通用的组件模型,使得不同类型的组件可以在同一个环境中协同工作。
COM技术通过提供标准的接口和协议,支持组件之间的互操作性。
2.OPC服务器:OPC服务器是提供实时数据服务的应用程序,它可以是硬件设备的驱动程序、数据采集软件、数据库等。
OPC服务器通过COM接口向客户端提供数据读取和写入的功能。
3.OPC客户端:OPC客户端是数据的使用者,它可以是数据监控、数据处理、控制系统等应用程序。
OPC客户端通过COM接口与OPC服务器进行通讯,读取和写入数据,实现数据的采集、处理和控制。
4.OPC数据对象:OPC通讯中的基本单位是数据对象,它表示一个数据项或一组相关的数据项。
数据对象包括标识符、数据类型、访问属性等信息。
客户端通过标识符来指定要访问的数据对象。
5.OPC数据访问:OPC通讯可以实现数据的读取和写入。
客户端通过COM接口向服务器发送读取或写入请求,并接收服务器返回的数据或响应。
数据的读取和写入通过COM接口传输,可以是同步方式或异步方式。
6. OPC数据传输:OPC通讯可以使用不同的传输协议来实现数据的传输,例如DCOM(分布式COM)、OPC DA(Data Access)等。
DCOM是COM技术在分布式环境中的扩展,可以在网络上进行数据传输。
OPC DA是一种基于COM的数据访问协议,用于实时数据的读取和写入。
总的来说,OPC通讯通过COM技术实现客户端和服务器之间的数据交互。
客户端通过COM接口向OPC服务器发送读取或写入请求,并接收服务器返回的数据或响应。
OPC通讯可以使用不同的传输协议来实现数据的传输,如DCOM、OPCDA等。
OPC通讯的原理为工业控制系统提供了一种标准的数据交互方式,实现了不同设备和应用程序之间的数据集成和互操作性。
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是一种软件开发技术与语言和平台无关,关于如何建立组件和通过组件建构应用程序的一种规范。
(特点:灵活,动态性,易于定制。
)ATL是active template library 活动模板库,他是一个C++框架,提高组件对象模型软件开发的效率。
组件:组件是一些小的可执行的2进制程序,将单个的应用程序分为多个独立的模块,即组件,方便日后应用程序的更新。
一个组件通一个微型应用程序类似是已经编译,链接打包好了的,直接使用。
使用组件的优点,定制应用程序,组件库,分布式组件。
组件的直接优点来自于动态的插入或卸出应用程序,组件动态链接,实现细节隐藏。
Com组件是以win32 动态链接库dll和可执行文件exe形式发布的可执行代码。
#include “objbase.h”在头文件objbase.h中定义#define interface struct_stdcall 标记的函数将使用标准的函数调用,即这些函数在返回到调用之间将参数从栈中删除。
2 接口Com中接口就是一切,组件只要支持同组件的接口,程序任然可以继续工作。
链接组件的接口在应用程序中起决定性作用。
只要保持接口不变,组件可以任意替换。
对于com来说接口是一个包含一个函数指针数组的内存结构,每一个数组元素包含的是组件所实现的函数的地址。
接口都是抽象类。
对于com来说,接口就是此内存结构。
Com接口使用c++ 抽象类实现,一个com组件可以提供多个接口。
一个c++类可以通过多继承来实现一个可以提供多个接口的组件。
Com接口的不变性一旦发布永远不变,组件的升级只是增加新的接口,多重继承3.QueryInterfaceCom所需要的接口都需要个函数,这三个函数分别是接口vtbl中的前三个。
接口查询客户通过IUnknown 接口来查询组件的其他接口。
Interface IUnknown{virtual HURESULT _stdcall QueryInterface(const IID&iid,void **ppv)=0;virtual ULONG _stdcall AddRef()=0; //增加计数值通过引用计数来控制何时将组件从内存中删除virtual ULONG _stdcall Release()=0;};所有的接口都是从IUnknown继承过来的定义IUnKnown的头文件unknwn.hIUnknown 指针的获取,IUnknown * CreatInstence()IUnknown * CreateInstance(){IUnknown * pI= static_cast<IX*>(new CA);pI->AddRef();rerurn pI;}RESULT _stdcall QueryInstance (const IID&iid,void **ppv)Com通过GUID 来识别组件的类别CLSID,接口的类别IIDProgID,通过注册表和CLSID相关联。
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组件需要将编译后的二进制文件复制到目标应用程序的目录,并在应用程序中进行配置。
COM组件技术在电子商务系统中的应用引言电子商务系统已经成为现代商业的重要组成部分。
随着科技的进步和互联网的普及,越来越多的企业选择使用电子商务系统来进行在线销售和交易。
在开发和构建电子商务系统时,选择合适的技术和工具非常关键。
COM组件技术是一种常用的技术,其在电子商务系统中的应用也非常广泛。
本文将探讨COM组件技术在电子商务系统中的应用,并分析其优势和挑战。
COM组件技术概述COM(Component Object Model)是一种面向对象的二进制接口标准,旨在实现不同软件组件之间的互操作性。
COM组件可以通过定义和实现接口来提供特定功能,并通过接口方法进行交互。
COM组件可以用于各种软件开发和集成的场景,并且在Windows操作系统中得到广泛支持。
COM组件技术在电子商务系统中的应用1. 产品管理和库存控制电子商务系统需要管理大量的产品信息和库存数据。
通过使用COM组件技术,可以开发可重用的组件来处理产品管理和库存控制的功能。
这些组件可以提供添加、编辑和删除产品信息的接口,同时还可以实现库存的实时更新和管理。
通过将这些组件集成到电子商务系统中,可以实现高效的产品管理和库存控制。
2. 支付和交易处理电子商务系统的核心功能之一是支付和交易处理。
COM组件技术可以提供安全可靠的支付和交易处理功能。
通过使用COM组件技术,可以实现与第三方支付网关的集成,并提供方便的支付接口。
这些组件可以处理支付请求、验证交易信息,并生成支付确认和交易记录。
通过使用COM组件技术,电子商务系统可以实现快速、安全和准确的支付和交易处理。
3. 订单管理和物流追踪电子商务系统需要管理和追踪大量的订单和物流信息。
通过使用COM组件技术,可以开发可重用的组件来处理订单管理和物流追踪的功能。
这些组件可以提供创建、编辑和取消订单的接口,同时还可以实现订单状态的实时更新和物流信息的跟踪。
通过将这些组件集成到电子商务系统中,可以实现高效的订单管理和物流追踪。
COM培训教程COM(Component Object Model)是一种面向对象的API(Application Programming Interface),最初由微软公司提出。
它允许软件开发人员通过标准接口来实现模块化的设计,使得不同软件之间可以互相通信和互相合作。
因此,COM的应用范围非常广泛,从操作系统到企业级应用程序,再到桌面应用程序和Web应用程序,都可以使用COM来实现。
尽管COM的范围如此广泛,但它的学习曲线是相当陡峭的。
为了成为一名合格的COM开发人员,你需要掌握一些核心的概念和技术。
以下是一些与COM相关的培训教程,可帮助你入门:1. COM基础知识:了解COM的基本概念和体系结构。
这些基础知识包括COM对象,接口,类,组件等。
你需要掌握如何定义和实现COM接口,如何注册COM组件,并理解COM 对象的生命周期。
2. COM组件开发:学习如何编写COM组件。
这涉及到使用COM接口、类和对象模型、COM+和MFC等。
这些教程通常介绍COM组件的编写和测试方法、COM对象的创建和释放方法以及组件的注册和部署。
3. COM高级编程:继续学习COM开发的更高级和复杂的技术。
这包括使用ATL(Active Template Library)和OLE Automation等。
ATL是一种用于快速开发COM组件的C++模板库,而OLE Automation是一种可以使非COM应用程序与COM 组件进行交互的技术。
4. COM应用程序开发:学习如何使用COM来构建应用程序,如Office、Visual Studio和Internet Explorer等。
这些教程主要讲解如何使用COM来调用其他应用程序中的COM组件,以及如何使用COM进行跨平台通信。
5. COM安全:学习如何保护COM组件免受恶意软件攻击。
这些教程通常会探讨如何使用COM+和Windows身份验证等技术来保护你的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(Component Object Model)是一种面向对象的软件组件技术,用于实现不同软件之间的通信和交互。
它提供了一种标准的接口和协议,使得不同的软件组件可以相互调用和使用,并且能够跨平台、跨语言地进行通信。
COM技术的基本原理包括以下几个方面:
1. 接口标准化:COM定义了一套标准的接口规范,包括接口的定义、方法的参数和返回值等。
通过遵循这些标准规范,不同的软件组件可以互相调用和使用。
2. 面向对象编程:COM采用面向对象的编程方法,将软件功能划分为多个独立的组件,并通过接口来定义组件之间的交互方式。
每个组件都有自己的接口和实现,可以被其他组件调用和使用。
3. 接口指针:在COM中,组件之间的通信是通过接口指针来实现的。
每个组件都实现了一组接口,其他组件可以通过获取该组件的接口指针来调用其提供的功能。
接口指针提供了一种灵活而高效的方式来实现组件之间的通信。
4. 对象注册和查找:在COM中,使用注册表来记录和管理所有的组件信息。
当一个组件被创建时,它会在注册表中注册自己的信息,其他组件可以通过查询注册表来查找并获取需要的组件。
5. 生命周期管理:COM提供了一套完整的生命周期管理机制,包括组件的创建、销毁和引用计数等。
通过引用计数,COM
可以自动管理组件的使用和释放,确保组件在不再被使用时能够被及时回收。
通过以上的原理,COM技术实现了不同软件之间的高效通信
和交互,为软件开发和集成提供了一种灵活而可靠的解决方案。
无论是在操作系统内部,还是在不同平台和语言之间,COM
都发挥着重要的作用,成为了一种广泛应用的软件组件技术。
COM技术介绍(全部)一、COM介绍1、定义(Component Object Model)COM是微软公司的最高级的,包罗万象的二进制通讯规范(也就是说是大家都要遵守的合同)。
用于软件组件间跨进程,跨机器,和操作系统进行交互操作。
COM是透明位置的。
它可以在EXE,DLL或者远程机器上使用。
OLE是一个主要与用户界面相关的高级功能的集合。
COM和OLE 的概念界限原本就不清晰,总是容易混淆。
2、历史OLE(Object Linking & Embedding )是1991年首次出现的(是WINDOWS3.1自带的)。
OLE最初的含义是对象链接和嵌入。
当时用DDE(动态数据交换)作为底层通讯协议。
1993,COM首次出现。
微软推出OLE2.0,开始用COM代替DDE作为底层通讯协议。
这也是COM第一个重要的用途。
1996年,大多数开发人员开始编写32位的WIN95应用程序。
他们发现,OLE使用COM的方式是一种非常好的设计软件的方法。
开发人员开始使用类似的方法编写自己的对象和界面。
另外,操作系统也开始要求使用COM技术编程,如编写WIN95用户界面。
这些即不是OLE,也不是AUTOMATION,那么他到底是什么呢?这个属于大多数人倾向于使用COM。
3、发展1996年,微软推出NT4.0,DCOM首次出现,作为NT的一部分。
它实现了将COM在分布式系统中的应用。
1997年开始流行ATL。
COM作为一种技术规范,最早是由C语言来实现的,但是实现起来比较复杂。
出现VC以后,又对COM进行了预制和封装,大大简化COM应用的开发。
这就是ATL(Active Template Library)。
4、现状我们经常见到的用途:使用外来控件。
特别是在网页上使用ACTIVEX控件。
ADOWORD/EXCEL的应用。
(两者交叉使用,在应用程序中调用)二、概念接口:可以理解为一个抽象的类。
OBJCET(component),相当与组件。
com入门视频教程Com(Component Object Model,组件对象模型)是微软公司提出的一种面向对象的软件组件技术。
它是一种基于二进制对象的构建和部署模型,用于实现不同软件之间的交互与通信。
Com的基本概念是组件,组件是一种独立的软件实体,可以被其他软件调用和使用。
一个组件可以包含多个接口,每个接口定义了一组相关的方法和属性。
这种面向接口的设计使得不同组件之间可以进行灵活的调用和交互。
Com将软件开发和软件复用的概念推到了一个新的高度,使得开发人员可以更加高效地开发和利用组件。
Com的基本原理是对象之间的协作。
当一个组件需要调用另一个组件的功能时,它可以通过调用该组件的接口方法来实现。
在这个过程中,Com提供了一种透明的机制来处理对象之间的通信和数据传递。
Com的通信过程是通过接口指针来进行的,每个组件都有一个唯一的接口指针,通过它可以访问另一个组件的方法和属性。
Com的优势在于提供了一种统一的编程模型,使不同语言和平台的软件可以无缝地集成和交互。
Com可以被用于开发各种类型的应用程序,包括桌面应用程序、Web应用程序、服务器端应用程序等。
它可以用于解决各种软件开发的问题,如组件复用、系统集成、异构系统之间的数据交换等。
弄懂Com的概念和原理是理解和掌握Com编程的关键。
对于初学者来说,可以通过观看Com入门视频教程来快速入门。
这些教程通常会介绍Com的基本概念、原理和应用场景,并通过实际的示例来演示Com编程的步骤和技巧。
在观看Com入门视频教程时,可以先了解Com的基本概念和术语,如组件、接口、对象等。
然后可以学习如何创建和使用Com组件,包括组件的注册和调用方式。
接着可以学习如何使用Com接口来进行对象的互相调用和通信。
最后可以学习Com的高级特性和技巧,如组件的线程安全性、错误处理、事件处理等。
通过观看Com入门视频教程,可以快速掌握Com编程的基本知识和技能。
这不仅可以帮助开发者更好地理解和应用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接口的根。
COM技术及其应用的开题报告题目:COM技术及其应用一、选题背景:COM(Component Object Model)是一种面向对象、分布式的软件组件技术,它能够跨语言、跨操作系统和跨网络传输,并且具有高度的复用性、可扩展性和互操作性,被广泛应用于各种软件系统的设计和开发中。
COM技术的应用领域非常广泛,例如:支持OLE(Object Linking and Embedding)客户端/服务器应用程序的开发、创建基于COM的ActiveX控件、编写COM组件以支持Office应用程序等等。
COM技术的高度复用性、可扩展性和互操作性在软件开发领域中具有重要的地位。
然而,COM技术本身也具有复杂性和难度,在使用中需要进行深入的学习和理解。
二、选题目的:本文旨在深入探讨COM技术的原理和应用,介绍COM组件模型、COM接口、COM对象、COM注册表等基本概念,以及COM技术在Windows平台上的实现细节和应用实例。
通过对COM技术的学习和了解,可以提高软件开发人员的技术水平和开发效率,为软件开发提供有力的技术支持和指导。
三、预期内容:1. COM技术的基本概念和基础知识2. COM组件模型和COM接口的原理和应用3. COM对象的创建、销毁和调用方法4. COM注册表的管理和应用5. ActiveX控件的开发和应用实例6. COM技术在Office应用程序中的应用实例四、研究方法:本文将采用文献资料调研和案例分析相结合的研究方法,对COM技术的基础知识、原理和应用实例进行系统性的研究和分析。
通过实际案例的分析和实验验证,深入掌握COM技术的实际应用。
五、论文结构:第一章:绪论第二章:COM技术的基础知识和原理第三章:COM组件模型和COM接口的应用第四章:COM对象的创建、销毁和调用方法第五章:COM注册表的管理和应用第六章:ActiveX控件的开发和应用实例第七章:COM技术在Office应用程序中的应用实例第八章:总结与展望六、研究意义:本文对COM技术的应用与研究,可以提高软件开发人员的技术水平,并为研究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对象的特性。
选择ATL还是MFC对于程序员来说,还有一个区别就是ATL要求你懂得更多的COM知识,这样你才能直接使用ATL来编写COM组件或者控件,而MFC甚至不要求你知道COM是个什么东西就能写出一个ActiveX控件来了。
此外,如果你编写的控件有GUI(图形用户界面)的话,你最好使用MFC;如果根本不需要GUI,那最好使用ATL编写,当然你也可以选择MFC来编写不可见的控件,但是开销比ATL大,而执行效率却小于ATL;但是有时候这种差别所带来影响可以忽略掉的话,那么我建议你还是用MFC来写,唯一的理由是它开发起来更简单,易于调试。
利用MFC创建COM 组件(1)首先创建一个MFC 动态链接库工程,工程名称是ComByMfc(2)在向导的给出个选项中,注意选中Automation 复选框选择它来允许程序操作其他程序,也会将该程序显露给其他Automation用户端。
(3)按Finish 完成工程的创建,生成的主要代码如下所示:BOOL CComByMfcApp::InitInstance(){// Register all OLE server (factories) as running. This enables the// OLE libraries to create objects from other applications.COleObjectFactory::RegisterAll();return TRUE;}/////////////////////////////////////////////////////////////////////////////// Special entry points required for inproc serversSTDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* p{AFX_MANAGE_STATE(AfxGetStaticModuleState());return AfxDllGetClassObject(rclsid, riid, ppv);}STDAPI DllCanUnloadNow(void){AFX_MANAGE_STATE(AfxGetStaticModuleState());return AfxDllCanUnloadNow();}// by exporting DllRegisterServer, you can use regsvr.exeSTDAPI DllRegisterServer(void){AFX_MANAGE_STATE(AfxGetStaticModuleState());COleObjectFactory::UpdateRegistryAll();return S_OK;}(4)利用ClassWizard 增加一个类CPlusServer,该类从CCmdTarget 继承选择Creatable by type ID,以下是选择说明:Click the Automation option to expose this class to Automation clients. If you click Creatable by type ID, you can specify a Type ID for this automation object. The automation client will create an object of this class using the Type ID.这里的ComByMfc.PlusServer,就是组件的ProgID,后面在调用的时候会用到。
这一步生成的类实现了IDispatch 接口,并且生成了一个类厂具备了一个强大的基础。
代码如下:// PlusServer.h : header file///////////////////////////////////////////////////////////////////////////////// CPlusServer command targetclass CPlusServer : public CCmdTarget{DECLARE_DYNCREATE(CPlusServer)CPlusServer(); // protected constructor used by dynamic creation// Attributespublic:// Operationspublic:// Overrides // ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CPlusServer)public:virtual void OnFinalRelease();//}}AFX_VIRTUAL// Implementationprotected:virtual ~CPlusServer();// Generated message map functions//{{AFX_MSG(CPlusServer)// NOTE - the ClassWizard will add and remove member functions here. //}}AFX_MSGDECLARE_MESSAGE_MAP()DECLARE_OLECREATE(CPlusServer)// Generated OLE dispatch map functions//{{AFX_DISPATCH(CPlusServer)// NOTE - the ClassWizard will add and remove member functions here. //}}AFX_DISPATCHDECLARE_DISPATCH_MAP()DECLARE_INTERFACE_MAP()};// PlusServer.cpp : implementation file//#include "stdafx.h"#include "ComByMfc.h"#include "PlusServer.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CPlusServerIMPLEMENT_DYNCREATE(CPlusServer, CCmdTarget)CPlusServer::CPlusServer(){EnableAutomation();// To keep the application running as long as an OLE automation// object is active, the constructor calls AfxOleLockApp.AfxOleLockApp();}CPlusServer::~CPlusServer(){// To terminate the application when all objects created with// with OLE automation, the destructor calls AfxOleUnlockApp.AfxOleUnlockApp();}void CPlusServer::OnFinalRelease(){// When the last reference for an automation object is released// OnFinalRelease is called. The base class will automatically// deletes the object. Add additional cleanup required for your// object before calling the base class.CCmdTarget::OnFinalRelease();}BEGIN_MESSAGE_MAP(CPlusServer, CCmdTarget)//{{AFX_MSG_MAP(CPlusServer)// NOTE - the ClassWizard will add and remove mapping macros here.//}}AFX_MSG_MAPEND_MESSAGE_MAP()BEGIN_DISPATCH_MAP(CPlusServer, CCmdTarget)//{{AFX_DISPATCH_MAP(CPlusServer)// NOTE - the ClassWizard will add and remove mapping macros here.//}}AFX_DISPATCH_MAPEND_DISPATCH_MAP()// Note: we add support for IID_IPlusServer to support typesafe binding// from VBA. This IID must match the GUID that is attached to the // dispinterface in the .ODL file.// {228C6810-DF12-4BC6-9B53-6058551B6225}static const IID IID_IPlusServer ={ 0x228c6810, 0xdf12, 0x4bc6, { 0x9b, 0x53, 0x60, 0x58, 0x55, 0x1b, 0x62, 0x25 } };BEGIN_INTERFACE_MAP(CPlusServer, CCmdTarget)INTERFACE_PART(CPlusServer, IID_IPlusServer, Dispatch)END_INTERFACE_MAP()// {54A404F4-5B23-40B3-9ABF-99E1025CC931}IMPLEMENT_OLECREATE(CPlusServer, "ComByMfc.PlusServer", 0x54a404f4, 0x5b23,0x40b3, 0x9a, 0xbf, 0x99, 0xe1, 0x2, 0x5c, 0xc9, 0x31)/////////////////////////////////////////////////////////////////////////////// CPlusServer message handlers(5)利用ClassWizard 为类的IDispatch 增加一个Plus 方法,完成两个数值相加并且返回结果。