我正在安装包含一些COM服务器的Active X控件。我在Build选项中使用InstallShield的COM Extract来生成注册表信息。这会导致Registry和Class表中的大量条目。 (使用Wix提取的信息几乎相同)。
看起来我的COM服务器正确安装,除了InprocServer32密钥中名为“InprocServer32”的附加值,如下所示:
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功能的内部名称。密钥未在Registry表中列出,因此必须由Class表生成。
我遇到的问题只发生在Windows Server 2008中。似乎尝试使用COM服务器的应用程序无法从(默认)值中找到.ocx文件的路径,而是找到了InprocServer32值。这会导致应用程序启动MSI,然后让MSI陷入看似infinte循环的状态。
我想知道这是否是Windows Server 2008中的已知问题,或者是否有办法阻止msiexec生成额外的值。
答案 0 :(得分:1)
我无法帮助你诊断发生了什么,我只是嘟a一下这一切意味着什么。这是针对DLL Hell的对策。它应该保护您的应用程序免受可能覆盖您的COM服务器注册表项的某种其他安装程序。特别是(默认)键,它为您的服务器DLL提供位置。
从伪造的InprocServer32值开始,应用程序可以自动检测Default键是否被覆盖,并再次自动启动MSI以修复损坏。这就是你所看到的。
我完全不喜欢这个功能,它只是在爆炸时已经很难排除故障的另一个失败点。它是一个无用的功能,它假定其他安装程序不使用完全相同的反措施。这将在10年前奏效。
不知道你要做些什么来解决这个特殊的失败。其他然后只是将这个cr * p放入其中并让服务器自己进行SelfReg。 不起作用时,至少你可以使用它。
答案 1 :(得分:0)
我读过这篇文章,看看它是否有助于你达到目标:
RobMen's Recommendation: Do not advertise COM information in MSI
您可能希望在Build中关闭InstallShield的COM Extract,而是在相关组件上执行一次性COM提取。然后,您可以进入“组件高级”部分,并手动操作注册表/ com表信息,使其符合您的预期。
如果您使用WiX,另一个工作流程/技巧是使用Heat在您的COM服务器周围构建MSI或MSM。然后使用InstallShield以直接模式编辑MSI / MSM,并使用注册表视图将注册表项/值导出到.REG文件。然后将.REG文件导入真实安装项目中的Component。