com组件

com组件、对象、接口

爷,独闯天下 提交于 2019-12-07 09:49:28
1、com(component object model)组件对象模型。 特点:语言无关、可以重用 应用:DirectX、OLE DB、ADO OLE是com的应用。 2、 一个com组件包括多个com对象,一个com对象实现多个接口。 3、com对象类似于c++中的类,包含属性和方法。在c++中,可以用类来定义com对象。 com组件对客户来说是透明的。 GUID用于标识com组件。 com接口:二进制特性,每个接口必须从IUnknown继承而来。 4、 IUnknown的定义: interface IUnknown { HRESULT QueryInterface( [in] REFIID iid, [out] void **ppv); ULONG AddRef(); ULONG Release(); } 输入参数iid为接口标识符:IID。 输出参数ppv为查询得到的结果接口指针。 IUnknown包含三个函数,分别是 QueryInterface、AddRef、Release。这三个函数是无比重要的,而且它们的排列顺序也是不可改变的。 QueryInetrface:查询com对象的其他接口指针 AddRef和Release用于对引用计数进行操作。 引用计数:每个com对象都记录 一个“引用计数“的数值,该数值记录了有多少个指针在使用com对象

COM组件的接口和对象

拟墨画扇 提交于 2019-12-07 09:48:33
一、 前言 在COM规范中,最基本的两个要素就是对象与接口,因为COM就是由这两者来共同实现的。COM对象在组件中是被封装起来的,客户代码只能通过接口来访问COM对象并享受其服务,由于客户与COM直接打交道的是COM接口,所以COM接口是COM最关键的要素。COM规范的核心内容就是对接口的定义,甚至可以说“在COM中接口就是一切”。组件与组件之间、组件与客户之间都要通过接口进行交互。接口成员函数将负责为客户或其他组件提供服务。与标识COM对象的CLSID类似,每一个COM接口也使用一个GUID来进行标识,该标识也被称为IID(interface identifier,接口标识符)。 二、 COM接口 COM接口通常是一组以函数的逻辑集合,继承IUnKnown接口。COM对象可以提供多个COM接口,每个接口提供不同的服务,因此COM接口与COM对象一样,都是用GUID来标识的,客户通过GUID来获取接口指针,再通过接口指针获取对应的服务。 COM接口实际限定了组件与使用该组件的客户程序或其他组件所能进行的交互方式,任何一个具备相同接口的组件都可对此组件进行相对于其他组件透明的替换。只要接口不发生变化,就可以在不影响整个由组件构成的系统的情况下自由的更换组件。通常在程序设计阶段需要将接口设计的尽可能完美,以减少在开发阶段对COM接口的更改。尽管如此,在实际应用中是很难做到这一点的

IDL接口描述语言和COM接口COM组件

此生再无相见时 提交于 2019-12-07 09:48:04
接口描述语言(Interface description language,缩写 IDL ) c++写的接口,只能c++和c识别,为了接口的通用性,让所有的语言都通用的定义使用接口 引入IDL,使用IDL定义接口以后,用MIDL编译为c++可用的接口定义 接口描述语言 - IDL(Interface Definition Language ) 1 IDL和MIDL IDL - 定义接口的一种语言,与开发 语言无关. MIDL.EXE - 可以将IDL语言定义接口, 编译成C++语言的接口定义 2 IDL的基础 IDL接口定义方式: 在项目中添加**.idl文件,在文件中: 1导入idl import "XXXX.idl" 2定义属性 [ attribute ] 3定义接口 interface A : interface_base { } 编译后生成三个文件 **_h.h 接口头文件 **_i.cpp 接口GUID **_p.cpp 远程调用相关,代理层 2.1 Import 导入IDL文件,相当于C++的 #include 2.2 使用"[]"定义区域,属性描述 关键字,描述接口GUID等信息 1) object - 后续是对象 2) uuid - 定义对象GUID 3) helpstring - 帮助信息 4) version - 版本 5) point_default -

在VC++6.0中用MFC进行COM编程

放肆的年华 提交于 2019-12-07 04:43:07
首先应当明确,MFC中是通过嵌套类而不是多重继承来实现COM接口的,通过接口映射机制将接口和实现该接口的嵌套类关联起来;MFC中提供一套简明的宏来实现嵌套类的定义.其次,MFC通过CCmdTarget类实现了IUnknown接口。   本文首先描述创建一个COM服务器的步骤和核心代码.然后说明客户程序关键代码。   此COM服务器实现一个TimeLogServer组件,为简明起见,此组件只有一个接口ITimeLog,通过ITimeLog的方法OutputLog可以将日志文本输出至日志文件。   创建一个MFC DLL工程,选择支持Automation(当然本程序不一定是自动化服务器,在这里这样做好处在于自动实现了几个必要的输出函数如DllGetClassObject,DllRegisterServer等,否则要自己写)    第一节 COM服务器    一. 声明组件和接口   1.写一个GUIDs.h,在GUIDs.h中声明组件和接口的GUID //声明组件GUID {A433E701-E45E-11d3-97B5-52544CBA7F28} //DEFINE_GUID(CLSID_TimeLogServer, //0xa433e701, 0xe45e, 0x11d3, 0x97, 0xb5, 0x52, 0x54, 0x4c, 0xba, 0x7f, 0x28); static

COM组件的编写与注册

落花浮王杯 提交于 2019-12-07 04:42:36
前言 “ 组件对象模型 (英语: C omponent O bject M odel,缩写 COM )是 微软 的一套 软件组件 的 二进制接口 标准。这使得跨编程语言的 进程间通信 、动态对象创建成为可能。” 以上是维基百科对COM组件的定义,简单来说,C++编写的COM组件可以在C#、Delphi语言中使用,COM组件可以实现跨语言的操作,在COM中也分进程间和进程外通信,COM/DCOM 组件可以在DLL 或EXE 文档中实现。 一、在 DLL 中实现的COM/DCOM组件称为 In-Process Server,因为这些组件是加载到使用它们的客户端应用程序执行程序内存之中。因此当应用程序调用COM/DCOM 组件的服务时,就和一般的程序或函数调用一样,非常快速。 二、在EXE 中实现的COM/DCOM组件是执行在它自己的执行程序之中,因此这种 COM/DCOM组件称为Out-Process Server。当客户端应用程序调用在独立的执行程序中的 COM/DCOM 组件时必须穿越不同的执行程序,因为 Out-Process Server 在执行时会比In-Process Server 慢许多。 工作过程中,遇到一个32位的DLL文件,需要在64位环境下使用,所以使用制作com组件的方式,供64位环境调用。 使用C++制作COM组件,在visual studio2013环境下:

VC使用MFC进行COM编程

与世无争的帅哥 提交于 2019-12-07 04:42:06
首先应当明确,MFC中是通过嵌套类而不是多重继承来实现COM接口的,通过接口映射机制将接口和实现该接口的嵌套类关联起来;MFC中提供一套简明的宏来实现嵌套类的定义.其次,MFC通过CCmdTarget类实现了IUnknown接口。   本文首先描述创建一个COM服务器的步骤和核心代码.然后说明客户程序关键代码。   此COM服务器实现一个TimeLogServer组件,为简明起见,此组件只有一个接口ITimeLog,通过ITimeLog的方法OutputLog可以将日志文本输出至日志文件。   创建一个MFC DLL工程,选择支持Automation(当然本程序不一定是自动化服务器,在这里这样做好处在于自动实现了几个必要的输出函数如DllGetClassObject,DllRegisterServer等,否则要自己写)    第一节 COM服务器    一. 声明组件和接口   1.写一个GUIDs.h,在GUIDs.h中声明组件和接口的GUID //声明组件GUID {A433E701-E45E-11d3-97B5-52544CBA7F28} //DEFINE_GUID(CLSID_TimeLogServer, //0xa433e701, 0xe45e, 0x11d3, 0x97, 0xb5, 0x52, 0x54, 0x4c, 0xba, 0x7f, 0x28); static

MFC与ATL在COM组件开发中的差异和优劣

我与影子孤独终老i 提交于 2019-12-07 04:38:00
很多年前,微软提供了COM组件对象模型。 随后,提供了COM SDK。 后来,又在MFC中,增加了COM开发的支持。 再后来,又提供了ATL类库,对COM开发提供了更强大的支持。 本文从使用MFC和ATL开发COM组件的角度,来分析比较两者的差异和优劣。 MFC代码部分 首先,需要继承一个基类,并声明成动态创建类(RuntimeClass)。 //.h class CComMFCDemo : public CCmdTarget { DECLARE_DYNCREATE ( CComMFCDemo ) }; //.cpp IMPLEMENT_DYNCREATE ( CComMFCDemo , CCmdTarget ) 然后,声明并实现COM功能函数。 //.h class CComMFCDemo : public CCmdTarget { BSTR Greeting(BSTR name); long Add( long val1, long val2); long Sub( long val1, long val2); }; //.cpp BSTR CComMFCDemo::Greeting(BSTR name) { CComBSTR tmp( "Welcome, " ); tmp.Append(name); return tmp; } long CComMFCDemo::Add(

COM组件开发(五)——使用MFC开发COM组件

孤人 提交于 2019-12-07 04:37:42
使用MFC创建一个进程内组件 这里使用的VS2008,新建一个MFC DLL项目,项目名称为“MFCCOM”,点击“确定”后进入MFC DLL向导,如下图所示: DLL类型选择“使用共享的MFC DLL的规则DLL”,附加功能勾选“自动化”(自动化是一种支持弱类型语言调用的特性),然后点击“完成”即可,生成的项目文件目录如下图: 生成的项目里包含了一个DLL的应用类和几个导出函数的定义,还有def文件和idl文件的生成。 为了开发COM,需要定义自己所需的COM对象类,这可以使用类向导来完成。通过点击菜单的“项目”——》“添加类”,选择“MFC类”,点击添加: 这里基类选择CCmdTarget,并勾选了自动化,这样这个类就是一个支持IDispatch接口的COM类了。 之后,只需添加项目自身的接口函数到类中即可,而且每个接口函数必须是以STDMETHODIMP作为返回值。 例如: STDMETHODIMP Test(BSTR* result); 来源: CSDN 作者: fishforever 链接: https://blog.csdn.net/q5806622/article/details/43954633

使用MFC实现进程内COM组件的步骤

≡放荡痞女 提交于 2019-12-07 04:37:32
MFC 实现 COM 组件的几个步骤: 创建 MFC dll 项目选择自动化选项( Automation ); // 自动生成 MFC_COM 代码框架。 使用 ClassWizard 创建继承于 CCmdTarget 的功能类。 在功能类的头文件使用组宏 BEGIN_INTERFACE_PART(…) 定义内嵌实现接口类。 使用 DECLARE_INTERFACE_MAP() 和 DECLARE_OLECREATE 宏声明接口映射表和 COM 对象工厂。 为各类接口定义 IID 的值,使用 BEGIN_INTERFACE_MAP 等组宏定义接口映表的值。 使用宏 DECLARE_OLECREATE 定义 COM 对象工厂。 定义内嵌类的实现 来源: CSDN 作者: coolx-w 链接: https://blog.csdn.net/mycoolx/article/details/6453750

MFC开发之UI COM组件

痞子三分冷 提交于 2019-12-07 04:37:08
前几天有一个UI COM组件的需求,查了一些相关资料,完整的梳理了一遍,下面遍将梳理的内容分享。 1.新建项目 2.下一步 3.设置项目属性 4.添加对话框 5.设置对话框属性 ,并添加一个测试按钮 Boder:None Control:True ID:IDD_MAIN_VIEW Style:Child System Menu:False Visible:True 6.在空白处双击,为控件添加类 7.项目-》类向导 在GViewCtrl.h中添加#include “ViewDlg.h” 8.实现OnCreate 9.实现OnSize 10.编译项目,成功编译 11.注册GView.ocx(目前编译的为32位的) 搜索框搜索cmd.exe,找到后右键以管理员的身份打开。 注册:regsvr32 "F:\MyCode\COM\Release\x86\GView.ocx" 注销:regsvr32 -u "F:\MyCode\COM\Release\x86\GView.ocx" 12.成功注册后,则可以使用注册好的32位COM组件 13.编译注册的64位的COM组件 1. 编译 64 位的 COM 组件; 2. 同时编译 32 位的 COM 组件; 3. 先注册 32 位的 COM 组件; 4. 再注册 64 位的 COM 组件; 5. 使用时,设计时加载的是 32 位 COM 组件,若需