关于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技术)

 

posted on 2009-06-07 22:12  飞天舞者  阅读(4291)  评论(0编辑  收藏  举报

导航

For more information about me, feel free email to me winston.he@hotmail.com