将regsvr32作为WIX安装程序的一部分运行

Dai*_*Dai 4 regsvr32 wix

我编写了一个通过WIX生成的MSI分发的COM组件.

COM组件具有相当复杂和非静态的注册逻辑,这意味着直接在Windows Installer WXS文件中嵌入注册信息不是一个可行的选项 - 注册必须使用regsvr32- 并且它是一个32位的COM组件,所以它必须使用32位版本regsvr32.exe- %SystemRoot%\SysWow64\regsvr32.exe在64位Windows或%SystemRoot%\System32\regsvr32.exex86 Windows上.

我注意到WIX与这个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"' />
Run Code Online (Sandbox Code Playgroud)
  1. regsvr32.exe引用了错误.我注意到x64版本resgvr32.exe是在64位系统而不是32位版本上运行的.
  2. regsvr32.exe在没有提升权限的情况下运行,因此COM注册失败E_ACCESSDENIED.

对于1.它可以工作,如果我硬编码regsvr32.exe可执行文件的路径使用[WindowsFolder]\SysWOW64\regsvr32.exe,但这SysWow64不适用于不存在的真正的32位机器.

对于2.我在线阅读更改After="InstallFinalize" toAfter ="RemoveExistingProducts" would cause it to run with elevated permissions, however instead this just gives me errors aboutRemoveExistingProducts`是一个未解析的符号名称.

我该如何解决这两个问题?

更新

(在过去2小时内遇到这个问题后,我确信WIX的作者是HP Lovecraft的亲密关系)

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

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

  1. <Custom/>" must haveBefore ="InstallFinalize" , and **not**After ="" any other values forBefore =""`将无法可靠地工作,因为WIX或Windows Installer可能会重新排列操作(wut).
  2. <CustomAction />明确设置这些属性:
    • Execute="deferred"
    • Impersonate="off"

即使如此,我也不想使用我的帮助程序来正确解析32位regsvr32.exe.有什么选择?

Nei*_*eil 5

如果你真的必须将File/@ SelfRegCost设置为1,我不建议使用自我注册,这不是使用Windows Installer执行此操作的正确方法.

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