您现在的位置:首页 >> API >> API >> 内容

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

时间:2011/9/3 15:43:43 点击:

  核心提示:在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相关评论
发表我的评论
  • 大名:
  • 内容:
本类推荐
  • 没有
本类固顶
  • 没有
  • 盒子文章(www.2ccc.com) © 2022 版权所有 All Rights Reserved.
  • 沪ICP备05001939号