一个COM对象就是一个实现了若干个接口(interface)的类(class),且这个类要是TComObject的子类。
多个COM对象写在一个DLL或EXE里,这个DLL或EXE就是一个COM服务器是。
注册COM服务器时也同时把COM服务器中的所有COM对象注册。
例如:
TMyComObject就是一个COM对象,实质上是一个类,只是这个类是TComObject的子类,TMyComObject实现了IMyInt1和IMyInt2两个接口。
在接口中只有方法,没有数据域,且方法是没有实现的,即是只有声明。为了实现接口中的方法需要定义一个类,这个类以多重继承的方式继承要实现的接口。
一个接口有一个唯一的ID叫IID,一个类也有一个唯一的ID叫CLSID,IID和CLSID都是GUID,只是叫法不同而已。
type
IMyInt1 = interface
[接口的IID]
procedure Method1;
end;
IMyInt2 = interface
[接口的IID]
procedure Method2;
end;
TMyComObject = class(TComObject, IMyInt1, IMyInt2)
[类的CLSID]
procedure Method1;
procedure Method2;
end;
TMyComObject.Method1;
begin
ShowMessage('我实现了IMyInt1接口的Method1方法');
end;
TMyComObject.Method2;
begin
ShowMessage('我实现了IMyInt2接口的Method2方法');
end;
上述的COM对象TMyComObject是在一个DLL或EXE中的,这个DLL或EXE就是一个COM服务器,COM服务器也有一个自己的唯一的GUID,用于区分其它COM服务器。
当然这个COM服务器中也可以存在多个COM对象,这就看你的应用需要。
最后要注意的是:
COM对象中的“对象”一词与面向对象中的“对象”是不同的概念,不要把两者搞乱。
“接口”这一词也可能会使你以为是程序的什么接口,当然这样想也没错,接口实际上是一种声明形式,声明了一组相关的方法,这些方法还有待实现。
COM对象只是TComObject的子类。
还有的是ActiveX组件其实也是一个COM对象,ActiveX组件通常是放在一个OCX或DLL文件中的,这个OCX或DLL也是一个COM服务器,同样这里面又可以有多个ActiveX组件。因此ActiveX技术是基于COM技术的,这样就不难理解OLE之类的东西了,它也是基于COM的。
COM技术是Windows中的组成部分,也是许多其它技术的基础,是跨进程、跨计算机的一种进程通信技术。是1992年Microsoft创立的技术标准。