惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
博客园 - Franky
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
量子位
博客园 - 聂微东
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
V
Visual Studio Blog
雷峰网
雷峰网
T
Tailwind CSS Blog
宝玉的分享
宝玉的分享
Blog — PlanetScale
Blog — PlanetScale
有赞技术团队
有赞技术团队
博客园 - 叶小钗
Microsoft Azure Blog
Microsoft Azure Blog
T
The Blog of Author Tim Ferriss
U
Unit 42
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
小众软件
小众软件
阮一峰的网络日志
阮一峰的网络日志
Y
Y Combinator Blog

博客园 - 飞天舞者

微服务学习之旅 - 构建一个helloworld的Micro service. Windows Azure上的大数据服务: HDInsight的介绍 介绍Windows Azure HDInsight服务的Hadoop Storm的视频 Windows Azure Service Bus Topics实现系统松散耦合 Windows Azure Service Bus Notification Hub推送通知 使用Microsoft Azure云平台中的Service Bus 中继 Intanet环境下的WCF服务。 SharePoint 2013的REST编程基础 什么是SharePoint? Windows的SEH机理简要介绍 如何调试由于heap corruption导致的程序崩溃的简单示例 利用定制行为扩展WCF之-利用MessageInsepctor behaviourExtension扩展WCF行为(自定义消息头) (转载)如何在WCF实现impersonnate客户端的功能 COM中的error handling机制及示例(ISupportEfforInfo,ICreateErrorInfo,IErrorInfo) 如何实现DCOM或者COM+的远程调用 转载推荐:COM中不同字符类型相互转换,例如char*, BSTR, CString等等 一种强行指定dll assembly读取其相应*.dll.config配置文件的方法(又名:如何创建.net 的DCOM) [软件调试学习笔记]防止栈缓冲区溢出的基于Cookie的安全检查机制 [软件调试学习笔记]WinDbg演示IA-32 CPU下的Windows 分页机制下的地址转换过程 Debug入门之旅-StackoverFlow exception的调试
关于COM的Reg-Free(免注册)技术简介及实例讲解。
飞天舞者 · 2009-06-07 · via 博客园 - 飞天舞者

       我们都知道,在传统的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技术)