在Windows下,可以用系统提供的regsvr32工具注册和卸载COM组件:
注册:regsvr32 文件名
卸载:regsvr32 /u 文件名
COM组件一般存在于动态链接库中,库文件扩展名为dll,ocx,ax(音频和视频的Filter)等。必须导出以下4个函数:
function DllGetClassObject(const CLSID, IID: TGUID; var Obj): HResult; stdcall;
function DllCanUnloadNow: HResult; stdcall;
function DllRegisterServer: HResult; stdcall;
function DllUnregisterServer: HResult; stdcall;
regsvr32就是调用组件库导出的DllRegisterServer函数来注册组件,调用DllUnregisterServer来卸载组件的,实际上注册就是在系统注册表里写入一些信息,卸载时删除这些信息。
大部分程序写作者都是采用注册ActiveX控件的方式来使用COM组件的,这样确实方便,但是如果运行程序的机器上没有注册该组件,程序就会因找不到组件而自动退出。实际上,不注册照样是可以使用COM组件的。这就是要用到组件库导出的DllGetClassObject了,COM对象是由类工厂(ClassFactory)创建的,每个COM类有其各自的类工厂。DllGetClassObject函数就是用来获取CLSID标志的类的类工厂接口(IClassFactory)的,IClassFactory的GUID为
const
IID_ICLASSFACTORY:System.TGUID = '{00000001-0000-0000-C000-000000000046}';
得到了IClassFactory接口后,就可以调用接口的CreateInstance方法来获得实现具体功能的COM对象的接口了:
function CreateInstance(const unkOuter: IUnknown; const iid: TIID; out obj): HResult; stdcall;
unkOuter参数跟COM聚合(Aggression)有关,如果没有用到聚合,可以传递0指针。iid为所要获得的接口的GUID,如果调用成功,输出参数obj就指向类工厂生成的接口,可以调用它的方法来使用COM组件了。