com接口

COM接口类型

妖精的绣舞 提交于 2019-12-07 09:52:38
COM技术内幕:调度接口与自动化笔记—————— 自定义接口:custom interface (vtbl接口/常规COM接口) 使用自定义接口时,由接口定义的那些方法都被定义在一个vtable中。对于vtable来说,只有那些方法入口才是有用的。 方法的顺序被定义在接口中。低级的vtbl接口可给C++程序员提供对组件进行有效聚合所需要的额外信息 调度接口:diapatch interface 脚本客户端不能处理自定义接口,它们只能使用调度接口。一个调度接口是一个    IDispatch接口的实现,它可以被脚本客户端理解,所以在编译时不需要知道接口的内存布局。 从方法名获得其ID,以及通过ID调用方法的这些映射机制是需要花时间的。而且除了这种映射机制,还有数据转换的过程。 Invoke仅接受一个参数,这个参数内包含的参数需要通过转换才能用来调用目标方法。 IDispatch::Invoke开销与参数调整的开销导致对于进程内组件效率远低于低级接口(100倍)对于进程外组件(2.5倍)远程组件(~1) 双重接口:dual interface 自定义接口可以提供最佳的性能,而调度接口可以被脚本客户端调用。为了两全其美,微软设计出了双重接口。双重接口从IDispatch接口派生,但是添加了一些新的方法到vtable中

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

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(

7.MFC实现简单的COM

亡梦爱人 提交于 2019-12-07 04:36:56
之前文章都是使用COM SDK来开发COM,实际中,因为COM开发涉及到各种重复、繁琐的细节,微软在两个C++类库MFC和ATL中实现了对COM开发的支持。MFC和ATL大大减少了COM的开发工作量,本文讲MFC开发简单的COM,下文讲ATL开发简单的COM。 1.建立COM工程 建立一个MFC工程,选择DLL,如下 勾选[自动化] 点击完成,查看生成的代码,发现MFC框架已经帮我们做的事情有 1. 实现如下四个标准的COM加载和导出函数 DllCanUnloadNow DllGetClassObject DllRegisterServer DllUnregisterServer 2. 包含一个.idl命名的文件,可以通过编写IDL实现代码自动生成,在这里还是讲手动生成MFC代码,下一节ATL讲通过编写IDL实现COM 2.实现COM 本文实现如下COM,ICat和IDog接口分别实现自己的方法SayHello. a.嵌套类原理 和之前使用C++虚函数实现COM原理不同,MFC对COM的实现,基于嵌套类,简单示例如下: class CAnimalObj { public: class XCat { public: AddRef Release QueryInterface SayHello } m_xlocalCat; class XDog { public: AddRef

用MFC写一个COM组件

↘锁芯ラ 提交于 2019-12-07 04:36:37
一:新建组件工程 工程名称COM 二:选择 动态链接库使用共享MFC DLL 和自动复选框 三:直接确定 四:查看自动生成代码信息 一个CCOMApp类,有成员函数CCOMApp和InitInstance函数 全局函数DllCanUnloadNow、DllGetClassObject、DllRegisterServer和全局变量theApp. 此处可能是没有实现DllUnregisterServer的原因,在注册组件后使用Regsvr32 -u com.dll卸载 组件时会失败。 五:添加COM对象类 添加一个新类CMyFirstComObj,从CCmdTarget继承,步骤如图 六:定义接口 七:接口文件为interface.h 八:接口代码如图: 两个方法 九:实现接口 添加代码如下图 定义一个接口,代码如下: MFC的COM使用的内部类的方法实现接口。 代码添加完成后编译生成DLL文件为COM.dll 十:转到COM.dll文件目录注册COM组件 十一:提示注册成功 十二:查看注册表添加信息 十三:客户端使用组件代码: 十四:运行测试程序 效果如下 使用MFC编写组件和调用的过程大致如上。以后继续学习。。。。。。。。。。。。。。。 来源: CSDN 作者: 俩蛋之父 链接: https://blog.csdn.net/fin86889003/article/details

MFC使用ADO连接SQLServer数据库

。_饼干妹妹 提交于 2019-12-05 17:05:32
VC用ADO访问数据库全攻略,介绍了VC用ADO来访问数据库的各个对象及各方法,很经典,也很实用,很值得一看。 正文 一、ADO概述 ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口。ADO 使您能够编写应用程序以通过 OLE. DB 提供者访问和操作数据库服务器中的数据。ADO 最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。ADO 在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性能的接口。之所以称为 ADO,是用了一个比较熟悉的暗喻,OLE 自动化接口。 OLE DB是一组”组件对象模型”(COM) 接口,是新的数据库低层接口,它封装了ODBC的功能,并以统一的方式访问存储在不同信息源中的数据。OLE DB是Microsoft UDA(Universal Data Access)策略的技术基础。OLE DB 为任何数据源提供了高性能的访问,这些数据源包括关系和非关系数据库、电子邮件和文件系统、文本和图形、自定义业务对象等等。也就是说,OLE DB 并不局限于 ISAM、Jet 甚至关系数据源,它能够处理任何类型的数据,而不考虑它们的格式和存储方法。在实际应用中,这种多样性意味着可以访问驻留在 Excel 电子数据表、文本文件、电子邮件