您的位置:首页 > 其它

免注册COM的使用方法

2012-08-20 22:36 357 查看
COM对象的传统创建方法,会依赖于注册表,所有应用程序都会依赖到同一个版本的COM。如果不同程序依赖的COM版本不同,而这个COM的版本兼容又没有做得很好的时候,就会出现DLL Hell问题。

微软在多年前就提供了一个Reg-free COM的方案,现在的VS也很好的集成了这个功能。

免注册COM的实现原理是把依赖到的COM类型与接口信息存储在本地的清单文件(.manifest)中,由它来代替注册表的角色,来指定COM文件路径、COM版本等信息。使用免注册COM不仅可以摆脱注册表的依赖,还可以精确的指定使用的COM版本、或者随安装包分发一个版本匹配的COM文件,指定只从本地目录读取,从而避免DLL Hell问题。

传统COM的创建过程:






免注册COM的创建过程:






清单文件格式如下,可以由VS生成:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<file name="IsolatedCOM.dll" hashalg="SHA1">
<comClass clsid="{61F14DDD-8F30-4130-BD6C-1728EB9323B8}" tlbid="{52475DC8-B071-46D2-9C84-5A6D3A4CFA2B}"></comClass>
<typelib tlbid="{52475DC8-B071-46D2-9C84-5A6D3A4CFA2B}" version="1.0" helpdir="" flags="HASDISKIMAGE"></typelib>
</file>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
</requestedPrivileges>
</security>
</trustInfo>
<comInterfaceExternalProxyStub name="IDemoInterface" iid="{CF9DC39E-B238-4B50-9B9F-8EEAB1A139AB}" tlbid="{52475DC8-B071-46D2-9C84-5A6D3A4CFA2B}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
</assembly>


在VS中使用的方式是在需要创建COM的项目中对Isolated COM选项进行设置,包括.tlb、.rgs文件的路径与文件名,可以按顺序添加多个:



这个免注册方案有一些限制:

1. Windows XP 及以后的操作系统(现在已经不是问题了)

2. 不支持out-of-process servers,只支持DLL。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: