我们的产品包含一个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如何发现要对注册表进行哪些更改?我们应该检查什么来检测问题的根源?
答案 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数据。