Install Shield“COM Extract at Build”如何工作?

时间:2009-10-26 10:37:18

标签: visual-c++ com installer atl installshield

我们的产品包含一个VC ++ ATL进程内COM服务器,它有两个暴露于COM的类 - ClassA和ClassB。此COM服务器已添加到Install Shield 2008安装程序包中,并为该组件设置了“COM Extract at Build”属性。

ClassA和ClassB以完全相同的方式由组件公开 - 每个都有一个.rgs文件,两个.rgs文件都被编译到组件资源中,并且为它们两者调用CAtlModule :: UpdateRegistryFromResourceS()。 p>

但是当我们在COM服务器上运行regsvr32时,两个类都正确地暴露给注册表,但是当我们运行安装包时,Install Shield只暴露其中一个类。

Install Shield如何发现要对注册表进行哪些更改?我们应该检查什么来检测问题的根源?

2 个答案:

答案 0 :(得分:2)

我怀疑他们使用RegOverridePredefKey(至少MSDN提示他们应该这样做): http://msdn.microsoft.com/en-us/library/ms724901(VS.85).aspx

在将目标密钥重写到某个私有位置后,InstallShield可以解析注册表结构并为其生成脚本。

这是所有猜想,但是,我不知道InstallShield实际上做了什么,但我认为我会在InstallShield的构建运行时从RegMon开始,看看我是否可以识别注册的位置,以及然后试着发现它做错了什么。

答案 1 :(得分:1)

如果您想要详细解释(或者他可以提供的话),您可以转到InstallShield社区论坛并为InstallShield员工MichalU发布问题。如果你想知道这些东西是如何工作的,你可以查看WiX的源代码,因为Heat有能力提取com信息。

如果构建中的COM提取给您带来麻烦,您可以将其关闭并静态插入COM数据。