COM组件编程基础
- 格式:ppt
- 大小:3.49 MB
- 文档页数:78
基于VB的COM编程入门教程第一节COM简介"世上无难事,只要肯登攀",所以你要有信心成为一个COM程序员,而且你一定能。
事实上,我们每次设置文本编程控件的Text属性时,就已经在使用COM,同样在DAO 数据控件运行MoveNext方法时,甚至在使用VB控制字时,也都是在使用COM。
那么,什么是COM呢?首先,COM是一种通信的方式。
例如,就像我们的电视遥控一样。
当我们按下某个频道按钮时,电视频道立马切换;而当我们按下开关按钮时,电视立即关闭等等。
其实,我们并不关心它们是怎样工作的,我们只知道按下按钮就能产生某个动作就可以了。
程序的原理也是一样的。
当改变文本编程控件的Text属性时,我们并不知道其中的原理,也许系统内部会调用几十个API函数也说不定?但对于用户来说,则只关心文本编程控件中显示的文本就可以了。
其次,COM是一种重用代码的方式。
使用COM的最大好处是一旦建立COM的通信方式后,可以方便地在任何地方使用多次。
例如,当用户创建一个用于显示日期和时间的COM组件后,就可用于任何程序中的任何地方。
不仅VB应用程序、Excel程序可以访问,而且C++应用程序也可以访问它。
所以,COM组件的代码可重用性是最主要的。
再次,COM是基于实际对象的。
用COM创建的大多数组件是基于实际对象的,这就意味着一旦组件被创建,其使用是相当容易的。
试想一下,如果我们在计算机系统中再添加一个用户,又有哪种添加方式如Customer.Add那样简单,是添加数据处理代码包、算法,还是向应用程序添加较大的数据库DLL?很显然,COM就支持这种简单操作。
所以,COM是一种通信方式、一种代码重用方式以及基于实际对象的。
本教程的以后部分中将简单讨论COM和VB的相关内容,这包括类的创建,以及如何将类转换成一个实际对象。
虽然,这里的内容太过简单,但却是以后COM编程的基础。
第二节类的建立在本节中,我们来实践一下。
COM编程⼀、COM组件基础1.程序的编写⽅式 1) ⾯向过程的结构化编程 ⾃顶向下的编程⽅式(流程图) 2) ⾯向对象的编程 以对象或以类为中⼼,更符合⼈的思维习惯,通过模拟现实情况完成软件的编写。
(类图) 3) ⾯向组件的编程 将⼀些功能直接封装成可以执⾏的⼆进制模块,类似于搭积⽊的⽅式。
更适合⼤型项⽬,功能需求频繁发⽣变更的项⽬的开发,功能的复⽤,复⽤性更⾼的。
2. 组件及组件的特点 组件就是可以执⾏的⼆进制代码,可以为系统,软件或者其他组件提供相应的功能。
特点:1. ⼆进制代码,可以执⾏2. 动态加载和卸载3. 和具体的编程语⾔⽆关3. 组件的标准 COM提供可组件编写的彼标准,任何开发的语⾔编写组件时。
都要遵循这个标准。
⼆、COM接⼝1.接⼝Win API –Win32应⽤程序编程接⼝(函数库) C语⾔接⼝就是函数、 C++语⾔,接⼝就是类的公有函数集合 DLL的接⼝就是它所输出的那些函数 COM接⼝就是⼀组纯虚函数集合,是⼀个包含⼀个函数指针数组的内存结构,每个数组元素包含的是⼀个由组件所实现的函数的地址。
2.C++接⼝的实现 1.定义纯虚函数,不能有任何成员变量和⾮纯虚函数 2.基于纯虚类,派⽣实现类 3.添加创建对象的函数,并使⽤接⼝返回创建的对象 引⼊c++接⼝之后,当功能的提供者发⽣变化时,功能的使⽤者代码不⽤修改,两者之间的耦合性降低了。
Dll接⼝的实现 功能的提供者放到动态库中和功能的使⽤者分开两个不⽤的⼯程 1.创建Win32 dll的⼯程 2.添加头⽂件XXX.h,在⽂件中添加接⼝的定义 3.在⼯程的实现⽂件中添加实现类以及创建对象的函数1. 导出创建对象的函数,通过添加def⽂件导出该函数Dll 接⼝的使⽤ 调出导出函数的步骤:1. 加载动态库,LoadLibrary获得句柄。
2. 获取导出函数的函数地址,GetProcAddress3. 调⽤导出函数,创建对象,返回接⼝。
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全¨?性?。
C#创建COM组件本⽂详细阐述如何⽤C#创建COM组件,并能⽤VC6.0等调⽤。
附:本⽂适⽤任何VS系列⼯具。
在⽤C#创建COM组件时,⼀定要记住以下⼏点:1。
所要导出的类必须为公有;2。
所有属性、⽅法也必须为公有;3。
要导出的属性、⽅法必须⽤接⼝⽅式;如果没有在接⼝中声明,即使该⽅法(属性)为公有,也不能正常导出到COM。
但他们可以被别的.NET程序所使⽤;4。
所有的事件也必须⽤接⼝⽅式;现在开始正题:⼀、新建⼀个Visual C#⼯程(习惯这种叫法了,现在应该叫解决⽅案),选择类型“类库”;就叫MyCom吧。
⼆、编写导出接⼝。
为了⼤家理解⽅便,仅以⼀加法操作举例。
如下:[Guid("154BD6A6-5AB8-4d7d-A343-0A68AB79470B")]public interface MyCom_Interface{[DispId(1)]int Add(int a, int b);}Guid为全局唯⼀标识,可以⽤VS2008的命令提⽰符中输⼊:⽤guidgen⼯具(系统⾃带)可以产⽣guid,在⼏个复选框选择最后⼀个Registry Format,点击New Guid,然后COPY就⾏了(以下如有guid的字符串,可⽤同样操作产⽣)[DispId(1)]为函数的标识。
如果有多个函数可相应的在函数前⾯加[DispId(2)], [DispId(3)]…三、创建事件接⼝。
[Guid("D11FEA37-AC57-4d39-9522-E49C4F9826BB"),InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]public interface MyCom_Events{}Guid同⼆,不多说InterfaceType表⽰向COM公开的⽅式,这⾥选择为以调度的⽅式向COM公开。
四、创建具体类:[Guid("2E3C7BAD-1051-4622-9C4C-215182C6BF58"),ClassInterface(ClassInterfaceType.None),ComSourceInterfaces(typeof(MyCom_Events))]public class Class1 : MyCom_Interface{public int Add(int a, int b){return a + b;}}⾄此,代码完毕。
编写⼀个简单的COM组件参考⽹站:(1)⽤MIDL编写.idl⽂件//将以下代码保存成 IXIYIZ.idl ⽂件//在命令⾏上进⾏编译,编译命令://midl IXIYIZ.idl//⽣成 IXIYIZ.h ,dlldata.c, IXIYIZ.h, IXIYIZ_p.c//其中 IXIYIZ.h,IXIYIZ.h ⽂件是我们⽬前所需要的import "unknwn.idl";[object,uuid(7F67119B-1E09-4d4f-B472-2106CCAE3275)]interface IX: IUnknown{[local]void __stdcall Fx();};[object,uuid(A667947B-714A-4bde-B2DD-C090928D62FF)]interface IY: IUnknown{[local]void __stdcall Fy();};[object,uuid(AA80F229-0809-4c69-B8AA-BB6F58DBC304)]interface IZ: IUnknown{[local]void __stdcall Fz();};(2)编写组件类的头⽂件// 将以下代码保存成 CA.h// 注意将(1)中⽣成的 IXIYIZ.h 头⽂件包含进来#include<iostream>#include"IXIYIZ.h"using namespace std;class CA : public IX, public IY{HRESULT __stdcall QueryInterface(const IID& iid, void ** ppv); ULONG __stdcall AddRef(){return 0;}ULONG __stdcall Release(){return 0;}void __stdcall Fx(){cout<<"Fx"<<endl;}void __stdcall Fy(){cout<<"Fy"<<endl;}};extern "C" __declspec(dllexport) IUnknown* __cdecl CreateInstance();(3)编写组件类的实现⽂件//将以下代码保存成 CA.cpp//3.1编译 IXIYIZ_i.c,编译命令://cl /c IXIYIZ_i.c ⽣成 IXIYIZ_i.obj ⽂件//3.2编译 CA.h ⽂件,编译命令://cl /c /GX CA.cpp ⽣成 CA.obj ⽂件//3.3链接上⾯两个⽂件,⽣成组件DLL,编译命令://link /dll CA.obj IXIYIZ_i.obj ⽣成 CA.lib 和 CA.dll//3.4将 IXIYIZ_i.obj 整合到 CA.lib ⽂件中,命令:// lib CA.lib IXIYIZ_i.obj#include"CA.h"HRESULT __stdcall CA::QueryInterface(const IID& iid, void ** ppv){if(iid == IID_IUnknown){cout<<"QueryInterface:Return pointer to IUnknown."<<endl;*ppv = static_cast<IX *>(this);}else if(iid == IID_IX){cout<<"QueryInterface:Return pointer to IX."<<endl;*ppv = static_cast<IX *>(this);}else if(iid == IID_IY){cout<<"QueryInterface:Return pointer to IY."<<endl;*ppv = static_cast<IY *>(this);}else{cout<<"QueryInterface:Interface not supported."<<endl;*ppv = NULL;return E_NOINTERFACE;}reinterpret_cast<IUnknown*>(*ppv)->AddRef();return S_OK;}extern "C" __declspec(dllexport) IUnknown* __cdecl CreateInstance() {IUnknown *pI = static_cast<IX*>(new CA);pI->AddRef();return pI;}(4) 编写客户端,对(3)⽣成的组件(CA.dll)进⾏测试。
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组件需要将编译后的二进制文件复制到目标应用程序的目录,并在应用程序中进行配置。
C++COM编程-COM编程⼊门实践1. COM编程基础COM是⼀种规范,⽽不是实现。
当使⽤C++来实现时,COM组件就是⼀个C++类,⽽COM接⼝就是继承⾄IUnknown的纯虚类,COM组件就是实现相应COM接⼝的C++类。
COM规范规定,任何组件或接⼝都必须从IUnknown接⼝中继承⽽来。
IUnknown定义了3个重要函数,分别是QueryInterface、AddRef和Release。
其中,QueryInterface负责组件对象上的接⼝查询,AddRef⽤于增加引⽤计数,Release⽤于减少引⽤计数。
引⽤计数是COM中的⼀个⾮常重要的概念,它很好地解决了组件对象地⽣命周期问题,即COM组件何时被销毁,以及谁来销毁地问题。
除了IUnknown接⼝外,还有另外⼀个重要地接⼝,即IClassFactory。
COM组件实际上是⼀个C++类,对于组件地外部使⽤者来说,这个类名⼀般不可知,那么如何创建这个类地的例?由谁来创建?COM规范规定,每个组件都必须实现⼀个与之对应的类⼯⼚(Class Factory)。
类⼯⼚也是⼀个COM组件,它实现了IClassFactory接⼝。
在IClassFactory的接⼝函数CreateInstance中,才能使⽤new操作⽣成⼀个COM组件类对象实例。
COM组件有3种类型:①进程内组件(CLSCTX_INPROC_SERVER)②本地进程组件(CLSCTX_LOCAL_SERVER)③远程组件(CLSCTX_REMOTE_SERVER)在接⼝成员函数中,字符串变量必须⽤Unicode字符指针,这是COM规范的要求。
2. COM组件开发实现⼀个COM组件,需要完成以下⼯作:COM组件接⼝COM组件实现类COM组件创建⼯⼚COM组件注册与取消注册本⽂以⼀个例⼦作为说明,COM组件提供了⼀个SayHello的接⼝函数,将“Hello COM”打印输出。
2.1 创建COM组件接⼝COM组件接⼝是⼀个继承IUnknown的抽象类:1// IComTest.h2#pragma once3 #include <Unknwn.h>4// interface id,COM组件接⼝唯⼀标识5static const WCHAR* IID_IComTestStr = L"{213D1B15-9BBA-414A-BAB6-CA5B6CEF0006}";6static const GUID IID_IComTest = { 0x213D1B15, 0x9BBA, 0x414A, { 0xBA, 0xB6, 0xCA, 0x5B, 0x6C, 0xEF, 0x00, 0x06 } }; 7class IComTest :public IUnknown8 {9public:10virtual int _stdcall SayHello() = 0;11 };2.2 创建COM组件实现类COM组件类是⼀个实现了相应COM组件接⼝的C++类,注意:⼀个COM组件可以同时实现多个COM接⼝。
COM组件对象模型基础COM组件对象模型COM组件对象模型是为了创建⼀种独⽴于任何编程语⾔的对象。
COM对象提供统⼀的接⼝,在不同的编程环境中通过调⽤COM对象特定接⼝的⽅法来完成特定的任务。
⼀般有三种⽅式编写COM组件:COM SDK,MFC,ATLCOM组件分类⼀个DLL(进程内组件)。
⽅法与客户进程在同⼀地址空间下,可直接访问到。
⼀个本地运⾏的EXE(进程外组件,本地服务器)。
⽅法与客户进程在同⼀机器的不同地址空间中,通过LPC(本地过程调⽤)访问。
⼀个远程机器上运⾏的EXE(进程外组件,远程服务器)。
⽅法与客户进程在不同机器上,通过RPC(远程过程调⽤)。
COM对象和接⼝⼀个COM组件可以含有多个COM对象,⼀个COM对象可以含有多个接⼝,⼀个接⼝可以含有多个⽅法。
为了在COM组件中唯⼀标识⼀个COM对象类,每⼀个COM对象类都有⼀个特定的标识符(CLSID),这个标识符是⼀个128位的数值。
同样对于不同的接⼝⽽⾔也有⼀个标识符(IID),也是⼀个128位的数值。
IUnknown接⼝//IUnknown接⼝的⽅法QueryInterface //返回指向另⼀个接⼝的指针AddRef //增加对象的引⽤计数Release //减少对象的引⽤计数每⼀个COM对象应该了IUnknown接⼝,⽽且为了通过对象任意⼀个接⼝指针都能调⽤其他接⼝,需要所有的接⼝处理实现⾃⼰的特定的⽅法外,还都要实现以上三种⽅法(每⼀个接⼝都继承IUnknown接⼝)。
HRESULT QueryInterface(){return (指定接⼝类*)this;}如果使⽤MFC实现COM,因为其采⽤多继承,⽽接⼝类的⽅法都是写成虚函数,COM对象类继承众多接⼝类会含有多个虚表(vtable),所以QueryInterFace返回的对应接⼝类的指针时需要强制类型转换(将this指针偏移到指定接⼝类的vtable处),这样就不会出错误调⽤到其他接⼝的⽅法。
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组件。
C#编写COM组件1、新建⼀个类库项⽬2、将Class1.cs改为我们想要的名字问是否同时给类改名,确定3、修改Properties⽬录下⾯的AssemblyInfo.csComVisible属性设置为True4、项⽬菜单->MyLib属性找到“⽣成”选项卡往下看,找到“为 COM Interop 注册”勾上5、继续往下,找到“签名”选项卡勾上“为程序集签名”在下⾯的下拉框⾥⾯选择“ <新建...>”6、在弹出的对话框⾥⾯,输⼊MyLib。
或者随便取个名字去掉使⽤密码保护⽂件的选项7、开始编码,任何⼀个公开的类,必须有⼀个 I开通的接⼝定义using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;namespace MyLib { [ComVisible(true)] [Guid("2CBD3D76-35F1-4f9d-9C1B-9DBFEE412F76")] public interface IMyClass { void Initialize(); void Dispose(); int Add(int x, int y); } [ComVisible(true)] [Guid("EA2F140A-108F-47ae-BBD5-83EEE646CC0D")] [ProgId("MyLib.MyClass")] public class MyClass : IMyClass { public void Initialize() { //nothing todo } public void Dispose() { //nothing todo } public int Add(int x, int y) { return x + y; } }}8、GUID属性⾥⾯的那个字符串,在“⼯具”菜单下⾯,“创建 GUID”选择 Registry Format,然后复制注意在[Guid("....... 这个⾥⾯要去掉GUID前后的花括号9、编译它在命令提⽰符下⾯,进⼊Dll所在的⽬录⽤ gacutil /i MyLib.dll 将这个DLL加⼊的全局缓存⾥然后⽤ regasm MyLib.dll 注册这个dll10、在javsScript⾥⾯试试.。
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在二进制级共享代码。
实验1. 编写COM组件并调用实验内容在VS2010环境中,使用C#语言编写一个简单的COM组件,然后在 中调用COM组件。
实验目的◆掌握COM组件的编写◆学会调用COM组件环境要求VS2010实验指导(一)C#编写COM组件步骤1:创建C#类库,名称为CLCOMTestInCSharp,如下图:注意:如果在win7下,VS2010要以管理员的身份运行步骤2:在“解决方案资源管理器”中,类“Class1.cs”更名为“CAdd.cs”,并在弹出的对话框选项中选择“是”。
如下图:步骤3:添加接口“IAdd”,并使类“CAdd”继承接口“IAdd”,代码如下:步骤4:在文档最上方添加命名空间“using System.Runtime.InteropServices ”的引用语句。
步骤5:通过菜单“工具”、“创建GUID”创建GUID,如下图:步骤6:“IAdd”接口上方使用该GUID步骤7:同样的方法在类“CAdd”的上方再生成添加一个GUID步骤8:完整代码如下:步骤9:打开“解决方案资源管理器”,打开“AssemblyInfo.cs”,将[assembly: ComVisible(false)]设为true。
步骤10:右击该类库项目,选择“属性”“生成”,将“为COM互操作注册”选中。
如图:步骤11:右击项目,“生成”。
将生成“CLCOMTestInCSharp.dll”、“CLCOMTestInCSharp.tlb”、“CLCOMTestInCSharp.pdb”三个文件(二)中调用C#编写的COM组件步骤1:使用创建“Windows窗体应用程序”项目,命名为“COMTest”。
如下图:步骤2:在窗体上添加一个Button,并将其Text属性设为“使用 调用C#创建的COM组件”步骤3:将“CLCOMTestInCSharp.dll”复制到程序目录,添加引用,选择“浏览”,如下图:步骤4:双击“Button”按钮,添加如下代码:步骤5:执行程序,结果如下图所示:实验报告●简述: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对象的位置对客户是透明的。
考试⼤计算机等级站整理收集: 名词解释: OLE: (Object linking and embedding对象的链接与嵌⼊) 使得服务器模块和客户模块通过标准的接⼝进⾏通讯。
两个模块可以在同⼀台计算机或位于不同的计算机上,位置对⽤户来说是⽆关紧要的。
服务器模块实现了⼀组接⼝,客户模块通过这组接⼝进⾏通讯。
COM: (Component object modal组件对象模型) 实现了OLE的功能,具体可完成⼀下功能: l 编写供多种语⾔使⽤的代码; 多种语⾔:指的是建⽴好的COM组件不在乎访问它的编程语⾔,任何⼀种编程语⾔只要知道COM组件的接⼝,访问是都能完成同样的功能。
l 创建ActiveX控件; l 通过OLE Automation操纵其他应⽤程序; 如:Microsoft Excel的OLE编程接⼝,创建对象后,任何⼀种程序都可以实现对Excel的操作。
l 与其他计算机上的应⽤程序通讯; 实际为COM接⼝与接⼝之间的通讯,因其实现了不同语⾔、不同计算机的⽅式,所以实现不同计算机上应⽤程序的通讯也就⼗分容易。
COM模块: COM的模块指独⽴的应⽤程序(EXE)或者动态连接库(DLL),在实现COM时,采⽤DLL⽅式要⽐较容易⼀些。
因为:应⽤程序在加载时在内存中都是独⽴的地址控件,⽽DLL加载后可以驻留内存。
当多个客户端调⽤COM时,如果采⽤EXE形式,就会有多个EXE被加载,⽽且COM处理客户端的访问时,也必须在不同的地址空间来回切换,⼤费周张。
⽽DLL 形式永远只有⼀个驻留内存,COM只要在相同的内存空间中寻找执⾏代码即可。
逐步深⼊:DLL我们都已经写了很多,通常我们写的DLL都是定义的⼀些⽅法或是过程来实现特定的操作,当然定义的出⼝(Exports)也就是这些⽅法或是过程。
现在我们来写⼀个出⼝为⼀个类的DLL来展开我们COM编写的学习。
准备⼯作: 打开Delphi,选择File\New\Others,选择DLL Wizard⾃动创建⼀个DLL⼯程,选择File\New\Unit新建⼀个单元,全部保存。
实验1. 编写COM组件并调用实验内容在VS2010环境中,使用C#语言编写一个简单的COM组件,然后在 中调用COM组件。
实验目的◆掌握COM组件的编写◆学会调用COM组件环境要求VS2010实验指导(一)C#编写COM组件步骤1:创建C#类库,名称为CLCOMTestInCSharp,如下图:注意:如果在win7下,VS2010要以管理员的身份运行步骤2:在“解决方案资源管理器”中,类“Class1.cs”更名为“CAdd.cs”,并在弹出的对话框选项中选择“是”。
如下图:步骤3:添加接口“IAdd”,并使类“CAdd”继承接口“IAdd”,代码如下:步骤4:在文档最上方添加命名空间“using System.Runtime.InteropServices ”的引用语句。
步骤5:通过菜单“工具”、“创建GUID”创建GUID,如下图:步骤6:“IAdd”接口上方使用该GUID步骤7:同样的方法在类“CAdd”的上方再生成添加一个GUID步骤8:完整代码如下:步骤9:打开“解决方案资源管理器”,打开“AssemblyInfo.cs”,将[assembly: ComVisible(false)]设为true。
步骤10:右击该类库项目,选择“属性”“生成”,将“为COM互操作注册”选中。
如图:步骤11:右击项目,“生成”。
将生成“CLCOMTestInCSharp.dll”、“CLCOMTestInCSharp.tlb”、“CLCOMTestInCSharp.pdb”三个文件(二)中调用C#编写的COM组件步骤1:使用创建“Windows窗体应用程序”项目,命名为“COMTest”。
如下图:步骤2:在窗体上添加一个Button,并将其Text属性设为“使用 调用C#创建的COM组件”步骤3:将“CLCOMTestInCSharp.dll”复制到程序目录,添加引用,选择“浏览”,如下图:步骤4:双击“Button”按钮,添加如下代码:步骤5:执行程序,结果如下图所示:实验报告●简述: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++。
它还带来了名字冲突的可能性,更不用说不断拷贝重用代码而导致工程膨胀和臃肿。
使用DLLs在二进制级共享代码。
这也是Windows程序运行的关键——重用kernel32.dll, user32.dll等。
com规范COM规范(1000字)一、概述COM(Component Object Model)是一种软件组件编程规范,用于构建、组织和互联可重用的软件组件。
COM是由微软公司提出的一种面向对象的编程模型,被广泛应用于Windows操作系统和其他相关平台。
COM规范通过定义一组标准接口和规则,使得软件组件可以在不同的编程语言和不同的硬件平台上互操作。
COM规范的基础是接口(Interface)的概念,通过接口的定义和实现,可以实现组件间的交互和通信。
二、COM的基本原则1. 二进制兼容性:COM组件的二进制接口在不同的版本之间保持兼容性,使得新版本的组件可以无缝替换老版本的组件。
2. 接口基础:COM组件的关键是接口,接口定义了组件外部可见的方法、属性和事件。
3. 组件标识:每个COM组件都有一个唯一的标识符(GUID),用于在系统中唯一标识该组件。
4. 注册表:COM组件的注册信息存储在Windows的注册表中,通过注册表可以实现组件的动态加载和访问。
5. 生命周期管理:COM组件有明确的生命周期概念,包括创建、销毁和释放资源等阶段。
三、COM的应用1. 桌面应用开发:COM规范为Windows桌面应用开发提供了丰富的组件库,开发者可以使用COM组件实现各种功能,如图形界面、文件操作、网络通信等。
2. 服务器应用开发:COM规范为服务器应用开发提供了高性能和可扩展的组件模型,开发者可以使用COM组件实现Web 服务、数据库访问、消息队列等功能。
3. 嵌入式应用开发:COM规范为嵌入式应用开发提供了轻量级的组件模型,开发者可以使用COM组件实现各种硬件设备的控制和管理。
四、COM组件的开发流程1. 接口设计:根据需求定义COM组件的接口,包括方法、属性和事件等。
2. 实现接口:根据接口定义编写组件的实现代码,包括方法和属性的具体实现逻辑。
3. 注册组件:将组件的注册信息写入注册表,使得系统中的应用程序可以动态加载和访问组件。