【问题标题】:How does Install Shield "COM Extract at Build" work?Install Shield "COM Extract at Build" 是如何工作的?
【发布时间】:2009-10-26 10:37:18
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    在目标键被覆盖到某个私有位置后,InstallShield 可以解析注册表结构并为其生成脚本。

    不过,这都是猜测,我不知道 InstallShield 实际做了什么,但我想我会在 InstallShield 的构建运行时从 RegMon 开始,看看我是否能辨别注册的去向,然后尝试发现它做错了什么。

    【讨论】:

      【解决方案2】:

      如果您想要一个详细的解释(或他允许提供的尽可能多的解释),您会想要转到 InstallShield 社区论坛并为 InstallShield 员工 MichalU 发布问题。如果您想大致了解这些东西是如何工作的,您可以查看 WiX 的源代码,因为 Heat 具有提取 com 信息的能力。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多