COM组件(Component)与接口(Interface)
许式伟 (版权声明)
2007-3-12
在前文,我预告了我将开始介绍WINX对自动化(Automation)的支持。首先我打算解释一下自动化(Automation)相关的概念。
我们会分为3个篇幅介绍:
- COM基础:COM组件(Component)与接口(Interface)
- 变体(Variant)与IDispatch(Dispatch调用)
- 自动化(Automation)、OA(Office Automation)、二次开发接口(应用程序开发接口,API)与类型库(TypeLib)
这是第一篇。
COM组件(Component)直观理解就是一个类,但这不是严谨的定义。原因有二:
- 有的语言(例如C语言)没有类,但是它可以实现COM组件。
- COM组件(Component)通常是一个类,但是它也可能是用多个类来实现。但是对于组件的客户而言,它是一个类,还是多个类进行实现,它不知道,也不关心。关于用多个类实现COM组件的详细内容,您可以了解一下COM组件中的“嵌套类实现COM接口(如MFC喜欢的,ATL则倾向于用多重继承)”、“聚合(AGGREGATION)”方面的内容。
COM组件(Component)是一种基于二进制对象协议的概念。也可以理解为,这是一个二进制意义上的“类”。一个COM组件,对外暴露的不是一组方法(Method),而是一组接口(Interface)。
接口(Interface)这个概念被广泛用运,一般意义上说是指“类的规格(契约)”。从COM意义上理解的接口(Interface),指的是一种和目前vtbl机制相容的二进制协议,并且vtbl的前三项与IUnknown接口相容(从继承角度上来讲,可以理解为要求从IUnknown继承,但只是这样理解而已)。例如,你可以定义如下接口:
interfaceIFoo:IUnknown
{
virtualvoid __stdcallfooA()=0;
virtualint__stdcall fooB(intarg1,intarg2)=0;
};
但是你也可以不这样写,而是这样纯C风格的:
structIFooVtbl
{
HRESULT(__stdcall*QueryInterface)(void*pThis,constGUID*iid,void**ppv);
ULONG(__stdcall*AddRef)(void*pThis);
ULONG(__stdcall*Release)(void*pThis);
void(__stdcall*fooA)(void*pThis);
int(__stdcall*fooB)(void*pThis,intarg1,intarg2);
};
structIFoo
{
structIFooVtbl*vptr;
};
QueryInterface是COM组件(Component)的核心部分,有了它,才使得组件有了发展升级的可能。我们知道,COM中接口(Interface)有一个GUID(全球唯一标识符)与其对应,理论上说,一旦一个接口被发布,那么它就不应该被修改,以便旧的客户可以升级使用到新版本的COM组件。要升级你的组件,你应该这样:
interfaceIFoo2:IFoo
{
virtualHRESULT__stdcallnewFoo()=0;
};
客户需要用到IFoo2中的功能时,就需要用QueryInterface切换到IFoo2:
IFoo*pFoo;
...
IFoo2*pFoo2;
HRESULThr=pFoo->QueryInterafce(IID_IFoo2,(void**)&pFoo2);
if(SUCCEEDED(hr))
{
//usepFoo2...
pFoo2->Release();
}
而IUnknown中的AddRef、Release,则用于管理COM组件的生命周期。对于它我在《C++内存管理变革》中也聊过,这里不多解释。
分享到:
相关推荐
贝加莱B&R工业自动化软件使用手册(基础篇)
基于pytest自动化测试框架API:接口层/驱动层,根据接口文档编写对应的维护单接口API,提供给测试用例层调用common:公共方法层,用于放置一些公共方法,如统一加密方法、时间格式转换等utils:配置层,用于放置一些...
Automation_Python:自动化Python
RSC Automation Technics:窄幅织物的自动化解决方案.pdf
包含数据通信网络基础、网络参考模型、网络层协议及IP编制、以太网交换基础、VLNA原理与配置、生成树、以太网链路聚合与交换机堆叠集群、IP路由...网技术、网络管理与运维、IPv6基础、网络编程与自动化等相关方面习题...
RSC Automation Technics:窄幅织物的自动化解决方案.rar
自动化接口 家庭自动化界面。 这是家庭自动化的接口。
automation-script:自动化脚本
哪里买(这个Pimoroni自动化HAT: ://shop.pimoroni.com/products/automation-hat Pimoroni Automation HAT Mini: ://shop.pimoroni.com/products/automation-hat-mini [已停产] Pimoroni Automation pH
自动化开关平台 提供用于自动化目的的可配置开关的平台。 可以创建该平台以在HomeKit规则中提供延时响应或模拟安全系统。 状态 为什么我们需要这个插件? 该平台提供了基于软件的,可选的持久性开关,以创建DIY ...
1:使用Code UI Automation来录制手工操作UI的动作,让VS根据这些操作自动生成测试代码; 2:新建WINFORM项目(也即黑盒工具),在这个WINFORM项目调用这些自动生成的代码;
这两种接口是:自动化接口(Automation interface);自定义接口(Custom interface)。自动化接口通常是为基于脚本编程语言而定义的标准接口,可以使用VisualBasic、Delphi、PowerBuilder等编程语言开发OPC服务器的...
基于C#UI Automation自动化测试自动化测试示例工程包括15个按钮示例:打开程序,关闭程序,编辑文本,点击按钮,展开列表,遍历控件等
Automation_Interview:添加了自动化测试
software test automation effective use of test execution 自动化测试
just enough software test automation 软件测试自动化 Daniel J. Mosley
OPC Automation接口手册 This specification is an interface for developers of OPC clients and OPC Data Access Servers. The specification is a result of an analysis and design process to develop a ...
办公自动化系统(Office Automation System)作为当今社会企事业单位管理信息化创建的重要组成部分,第一代办公自动化的处理内容以数据为主,进而发展进步到以信息为主要处理内容的第二代办公自动化,现在已经发展为以...