在WIX安装程序中运行regsvr32

5
我编写了一个COM组件,通过WIX生成的MSI文件进行分发。
该COM组件具有相当复杂和非静态的注册逻辑,这意味着直接将注册信息嵌入Windows Installer WXS文件中不是可行的选择 - 必须使用regsvr32进行注册 - 并且它是一个32位的COM组件,因此必须使用32位版本的regsvr32.exe - 在64位Windows上是%SystemRoot%\SysWow64\regsvr32.exe,在x86 Windows上是%SystemRoot%\System32\regsvr32.exe。
我注意到在这个WXS XML中存在两个问题:
<InstallExecuteSequence>
    <Custom Action="COMRegister"   After="InstallFinalize">NOT Installed</Custom>
    <Custom Action="COMUnregister" After="InstallInitialize">Installed</Custom>
</InstallExecuteSequence>

<CustomAction Id="COMRegister"   Directory="APPLICATIONROOTDIRECTORY" ExeCommand='regsvr32.exe /s "[APPLICATIONROOTDIRECTORY]Component.dll"' />
<CustomAction Id="COMUnregister" Directory="APPLICATIONROOTDIRECTORY" ExeCommand='regsvr32.exe /s /u "[APPLICATIONROOTDIRECTORY]Component.dll"' />
  1. 错误的regsvr32.exe被调用。我注意到64位系统上运行了x64版本的resgvr32.exe而不是32位版本。
  2. regsvr32.exe没有以提升的权限运行,因此COM注册失败并出现E_ACCESSDENIED

对于第一个问题,如果我使用[WindowsFolder]\SysWOW64\regsvr32.exe硬编码路径到regsvr32.exe可执行文件,则可以解决该问题,但在真正的32位机器上无法运行,因为SysWow64不存在。

对于第二个问题,我在网上看到将After="InstallFinalize"更改为After="RemoveExistingProducts"会导致以提升的权限运行,但实际上只会产生关于RemoveExistingProducts未解决符号名称的错误。

如何解决这两个问题?

更新

(在与这个问题斗争了2个小时之后,我相信WIX的作者是H.P. Lovecraft的近亲)

我通过编写自己的中间步骤程序来解决第一个问题,它是一个32位可执行文件,因此它将始终在WOW上下文下运行,因此将可靠地调用32位的regsvr32.exe程序。

我发现第二个问题的原因是这些条件:为了使CustomAction以提升的权限运行(在与主安装程序作业相同的安全上下文中),必须满足以下条件:

  1. <Custom/>必须具有Before="InstallFinalize",而不是After=""。任何其他值都不能可靠地工作,因为WIX或Windows Installer可能会重新排列操作(奇怪)。
  2. <CustomAction />必须明确设置以下属性:
    • Execute="deferred"
    • Impersonate="off"

即使如此,我仍希望不必使用我的辅助程序来正确解决32位的regsvr32.exe。有哪些选项?


1
看看 WiX SelfRegModules 的东西。Windows Installer 知道如何调用自注册而不需要 regsvr32。请参阅 SelfReg 表文档。 - PhilDW
我按照您的更新进行了操作。我的MSI安装了应用程序,但没有注册DLL文件,当我尝试卸载时失败了。以下是卸载操作的详细日志输出:http://justpaste.it/plc7我甚至手动成功注册了DLL文件,但卸载操作仍然失败,并记录了相同的错误信息。 - Skystrider
2个回答

6

我不建议使用自注册,这不是使用Windows Installer的正确方式。如果您一定要使用自注册,请将File / @SelfRegCost设置为1。

更好的方法是提取注册表值并使用WiX编写它们 - 您还可以使用heat生成这些值。


你是对的 - 经过仔细研究,我推断在WIX中使用静态注册是最终的最佳方法。尽管我没有使用 heat,但我手动编写了密钥,到目前为止它一直运行良好。 - Dai

3
这听起来会在以后给你带来很多问题。尽管你似乎已决定使用自注册,请阅读这篇完整的帖子自注册被认为是有害的
当企业应用程序打包中发现自注册行为时,这些软件非常不受欢迎。有时这已经足够理由抛弃整个软件。
如果您需要使用管理员权限完成某些任务才能运行应用程序,您应该将其作为安装程序的一部分完成,而不是通过自注册(请参见上面链接帖子中的众多原因)。几乎任何其他方式都比自注册更好,包括在自定义操作中使用主要的application.exe运行一个命令行来触发自定义注册步骤,然后提供一个记录实际已完成工作的良好日志。并且您应该恢复普通COM注册和提取COM服务器。
了解一下您的COM服务器有哪些特殊之处可能会很有趣,请问是否是通常的许可问题?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接