nKnown 接口等,下面再补充一些相关内容: COM 与 DCOM,COM+,OLE,ActiveX 的关系 , , , DCOM(分布式 COM)提供一种网络上访问其他机器的手段,是 COM 的
网络 化扩展,可以远程创建及调用.COM+是 Microsoft 对 COM 进行了重要的更新 后推出的技术,但它不简单等于 COM 的升级,COM+是向后兼容的,但在某些 程度上具有和 COM 不同的特性,比如无状态的,事务控制,安全控制等等. 以前的 OLE 是用来描述建立在 COM 体系结构基础上的一整套技术,现在 OLE 仅仅是指与对象连接及嵌入有关的技术;ActiveX 则用来描述建立在 COM 基础 上的非 COM 技术,它的重要内容是自动化(Automation),自动化允许一个应 用程序(称为自动化控制器)操纵另一个应用程序或库(称为 自动化服务器)的对象,或者把应用
程序元素暴露出来. 由此可见 COM 与以上的几种技术的关系,并且它们都是为了让对象能够跨开发 工具跨平台甚至跨网络的被使用. Delphi 下的接口
Delphi 中的接口概念类似 C++中的纯虚类,又由于 Delphi 的类是单继承模式 (C++是多继承的),即一个类只能有一个父类.接口在某种程度上 可以实现多继承.接口类的声明与一般类声明的不同是,它可以象多重继承那 样,类名 = class (接口类 1,接口类 2… ),然后被声明的接口类则重载继承类 的虚方法,来实现接口的功能. 以下是 IInterface,IUnknown,IDispatch 的声明,大家看出这几个重要接口之 间是什么样的联系了吗?任何一个 COM 对象的接口,最终都是从 IUnknown 继 承的,而 Automation 对象,则还要包含 IDispatch,后面 DCOM 部分我们会看 到
它的作用.
IInterface = interface [''''{00000000-0000-0000-C000-000000000046}''''] function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; end; IUnknown = IInterface; IDispatch = interface(IUnknown) [''''{00020400-0000-0000-C000-000000000046}''''] function GetTypeInfoCount(out Count: Integer): HResult; stdcall; function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall; function GetIDsOfNames(const IID: TGUID; Names: Pointer;NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall; function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall; end; 对照"DELPHI 下的 COM 编程技术"一文,可以明白 IInterface 中的定义,即接口 查询及引用记数,这也是访问和调用一个接口所必须的. QueryInterface 可以得到接口句柄 而 AddRef 与 Release 则负责登记调用次数 , . COM 和接口的关系又是什么呢?COM 通过接口进行组件,应用程序,客户和 服务器之间的通信.COM 对象需要
注册,而一个 GUID 则是作为识别接口的唯 一名字. 假如你创建了一个 COM 对象,它的声明类似 Txxxx= class(TComObject, Ixxxx) , 前 面 是 COM 对 象 的 基 类 , 后 面 这 个 接 口 的 声 明 则 是 : Ixxxx = interface(IUnknown) .所以说 IUnknown 是 Delphi 中 COM 对象接 口类的祖先.到这一步,我想大家对接口类的来历已经有初步了解了. 聚合
接口是 COM 实现的基础,接口也是可继承的,但是接口并没有实现自己,仅仅 只有声明.那么怎么使 COM 对象对接口的实现得到重用呢?答案就是聚合.聚 合就是一个包含对象(外部对象)创建一个被包含对象(内部对象),这样内部 对象的接口就暴露给外部对象. 简单来说,COM 对象被注册后,可以找到并调用接口.但接口不是仅仅有个定 义吗,它必然通过某种方式找到这个定义的实现,即接口的"实现类"的方法,这 样才最终通过外部的接口转入进行具体的操作,并通过接口返回执行结果. 进程内与进程外( 进程内与进程外(In-Process, Out-Process) ) 进程内的接