分享

Delphi中不进行组件注册而直接调用COM对象

 quasiceo 2013-12-01

Delphi中不进行组件注册而直接调用COM对象

时间:2011-9-3 15:43:43 点击: 284

  核心提示:在Windows下,可以用系统提供的regsvr32工具注册和卸载COM组件: 注册:regsvr32 文件名 卸载:regsvr32 /u 文件名COM组件一般存在于动态链接库中,库文件扩展名为dl...

在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组件了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多