Visual c++ 如何安装护罩;“在构建时提取COM”;工作

Visual c++ 如何安装护罩;“在构建时提取COM”;工作,visual-c++,com,installation,atl,installshield,Visual C++,Com,Installation,Atl,Installshield,我们的产品包含一个VC++ATL-in-proc-COM服务器,其中包含两个COM公开类——ClassA和ClassB。此COM服务器添加到Install Shield 2008安装程序包中,并为该组件设置“生成时提取COM”属性 组件以完全相同的方式公开ClassA和ClassB—每个组件都有一个.rgs文件,两个.rgs文件都被编译到组件资源中,并且为它们调用CAtlModule::UpdateRegistryFromResourceS() 但是,当我们在COM服务器上运行regsvr32时

我们的产品包含一个VC++ATL-in-proc-COM服务器,其中包含两个COM公开类——ClassA和ClassB。此COM服务器添加到Install Shield 2008安装程序包中,并为该组件设置“生成时提取COM”属性

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

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


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

我怀疑他们使用了
RegOverridePredefKey
(至少他们应该使用MSDN提示):

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


不过,这只是猜测,我不知道InstallShield实际上做了什么,但我想我应该从InstallShield的构建运行时开始,看看我是否能识别注册的位置,然后尝试找出它的错误所在。

如果你想得到详细的解释(或者尽可能多的解释)您可能希望转到InstallShield社区论坛,并向InstallShield员工MichalU发布一个问题。如果您想知道这些东西是如何工作的,您可以查看WiX的源代码,因为Heat能够提取com信息

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