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

在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值