关于COM的Reg-Free(免注册)技术简介及实例讲解。

       我们都知道,在传统的COM技术中,当客户端调用COM时,该客户端必须首先通过regsvr32.exe在服务器上注册,否则会得到80040154(Class not registered)这样normal的 错误代码。

      那么,是否说COM一定要事先注册才能被客户端调用呢?答案:不是。本文介绍了一种免注册(Reg-Free)的COM调用技术。 

      关于Reg-Free技术的参考文章,可以点击一下链接,在此不再赘述。

http://msdn.microsoft.com/en-us/magazine/cc188708.aspx

Registration-Free Activation of COM Components: A Walkthrough

http://msdn.microsoft.com/en-us/library/ms973913.aspx

      下面简要总结一下采用Reg-Free COM 的runtime基本原理和要求:

1.客户端必须存在一个用来描述其程序所要装载的COM dll的文件清单(即*.exe.manifest文件)。假设客户端文件为clientapplication,则其manifest必须为clientapplication.exe.manifest。

2.COM dll文件必须放置于在clientapplication所在文件或者其子文件夹下,否则在runtime无法装载该COM dll而出现80070154的错误。

3.有关COM dll的清单文件,通过comdll.*.manifest来进行描述。

以下是一个client程序的manifest文件(文件名:client.exe.manifest)。在<dependency>section里面,表明需要引用的assembly为COMV1.sxs。其实COMV1.sxs是一个不存在的虚礼文件。

<? xml version = " 1.0 "  encoding = " UTF-8 "  standalone = " yes " ?>
< assembly xmlns = " urn:schemas-microsoft-com:asm.v1 "  manifestVersion = " 1.0 " >

< assemblyIdentity
  type
= " win32 "
  name
= " client "
  version
= " 1.0.0.0 "   />
  
< dependency >
          
< dependentAssembly >
              
< assemblyIdentity
                  type
= " win32 "
                  name
= " COMV1.sxs "
                  version
= " 1.0.0.0 "   />
          
</ dependentAssembly >
  
</ dependency >
</ assembly >

 

然后,以下是对以上用到的COMV1.sxs虚拟文件的manifest文件(文件名:COMV1.sxs.manifest) 

<? xml version = " 1.0 "  encoding = " UTF-8 "  standalone = " yes " ?>
< assembly xmlns = " urn:schemas-microsoft-com:asm.v1 "  manifestVersion = " 1.0 " >

< assemblyIdentity
    type
= " win32 "
    name
= " COMV1.sxs "
    version
= " 1.0.0.0 "   />

< file name = " COMV1.dll " >

< comClass clsid = " {FCC1AA77-6E90-4CCC-9ACF-CB65C5629190} "  
      threadingModel
= " Apartment "  
      tlbid
= " {77D83C74-1B9F-4DC0-822B-CF02C66A7F94} "   />

</ file >

< comInterfaceExternalProxyStub
    name
= " ISimpleClass "
    iid
= " {9CDBEF0B-6DA9-49E3-AA85-FF75AA479BCF} "
    proxyStubClsid32
= " {00020424-0000-0000-C000-000000000046} "
    baseInterface
= " {00000000-0000-0000-C000-000000000046} "
    tlbid
= " {77D83C74-1B9F-4DC0-822B-CF02C66A7F94} "   />

</ assembly >




 

当然,对于以上manifest文件的生成,我们可以采用第三方工具或者VS.net工具来生成。

关于Reg-Free用到的manifest文件生成工具及实例,可点击以下链接:

 

http://www.codeproject.com/KB/COM/regsvr42.aspx

因此,总的来说,利用Reg-Free技术来调用COM,客户端代码不需要做任何修改,只是需要将COM注册的方式由regsvr32.exe工具,改变成为读取配置文件的方式。

关于该篇文章示例所需源代码及配置文件,点击此处下载(本文代码只为展现该Reg-Free技术)

 

转载于:https://www.cnblogs.com/Winston/archive/2009/06/07/1498000.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值