2010-08-31 17 views
1

我正在安装包含一些COM服务器的Active X控件。我在Build中使用InstallShield的COM Extract选项来生成注册表信息。这导致注册表和类表中的条目很多。 (使用Wix提取的信息几乎相同)。类表生成InprocServer32值问题

看来,正确安装除了在InprocServer32项,看起来像这个名为“InprocServer32的”附加价值我的COM服务器:已

HKCR\CLSID\{MY-COM-GUID}\InprocServer32 
    (Default) = C:\Path-to-my\file.ocx 
    InprocServer32 = 8tYCAGak)9S9&~swl.$?MyFeatureName>*&N$B'fk?As1x2J653?' 

唯一想我可以从额外的价值做出来是MyFeatureName,它是包含.ocx文件的MSI功能的内部名称。密钥没有在注册表中列出,所以它必须由Class表生成。

我遇到的问题只发生在Windows Server 2008中。似乎尝试使用COM服务器的应用程序无法从(默认)值中找到.ocx文件的路径,而是发现InprocServer32值。这会导致应用程序启动MSI,然后让MSI陷入似乎是无限循环的状态。

我想知道这是Windows Server 2008中的一个已知问题,或者是否有办法阻止msiexec生成的额外值。

回答

0

我读这篇文章,看看它是否有助于你得到你想要为:

RobMen's Recommendation: Do not advertise COM information in MSI

您可能要在构建关闭的InstallShield的COM提取物,而是做一个一次性COM对有问题的组件进行提取。然后,您可以进入“组件高级”部分,然后手动操作注册表/通讯组信息,使其成为您希望的方式。

如果您使用WiX,另一个工作流程/技巧是使用Heat在您的COM服务器周围构建MSI或MSM。然后使用InstallShield以直接模式编辑MSI/MSM,并使用注册表视图将注册表项/值导出到.REG文件。然后将.REG文件导入您的真实安装项目中的组件。

1

我无法帮助您诊断发生了什么事,我只是嘟a一下这一切意味着什么。这是针对DLL地狱的一种反制措施。它应该保护您的应用程序免受某种可能会覆盖您的COM服务器注册表项的其他安装程序的影响。具体来说就是给你的服务器DLL提供位置的(默认)键。

从虚假的InprocServer32值中,应用程序可以自动检测到默认密钥被覆盖并自动启动MSI以修复损坏。这是你看到发生的事情。

我完全不喜欢这个功能,它只是一个故障点,当它爆炸时很难排除故障。这是一个无用的功能,它假定其他安装程序不使用完全相同的对策。这在10年前就能奏效。

不知道你会怎样解决这个特定的故障。其他然后只是踢这个cr * p,让服务器只SelfReg自己。当不起作用时,至少你会有一些工作。

+0

SelfReg实际上是您安装时可以做的最糟糕的事情。它有各种令人讨厌的副作用,包括你可能最初不会想到的副作用。;) 克里斯指出的我的建议是避免COM广告。 – 2010-09-02 14:12:59

+0

@Rob - 来自regfree COM的短小,有什么选项#3? – 2010-09-02 14:54:25

+0

汉斯,把注册放在你的MSI注册表中。 WiX工具集有一些很好的元素可以帮助您在没有太多代码的情况下执行此操作(Class,TypeLib,ProgId等元素)。 – 2010-09-09 17:16:09