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

时间:2014-09-24 08:26:05

标签: wix regsvr32

我创作了一个通过WIX生成的MSI分发的COM组件。

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

我注意到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"' />
  1. 正在调用错误的regsvr32.exe。我注意到resgvr32.exe的x64版本是在64位系统而不是32位版本上运行的。
  2. regsvr32.exe在没有提升权限的情况下运行,因此COM注册失败并显示E_ACCESSDENIED
  3. 对于1.如果我使用[WindowsFolder]\SysWOW64\regsvr32.exe对使用SysWow64的regsvr32.exe可执行文件的路径进行硬编码,则它可以正常工作,但这不适用于真正的32位机器,其中After="InstallFinalize" to没有&#39}存在。

    For 2.我在线阅读更改would cause it to run with elevated permissions, however instead this just gives me errors about After =&#34; RemoveExistingProducts&#34; regsvr32.exe RemoveExistingProducts`是未解析的符号名称。

    如何解决这两个问题?

    更新

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

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

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

    1. <Custom/>" must have之前=&#34; InstallFinalize&#34; , and **not**之后=&#34;&#34; any other values for之前=&#34;&#34;`赢了& #39; t可靠工作,因为WIX或Windows Installer可能会重新安排操作(哇)。
    2. <CustomAction />已将这些属性明确设置
      • Execute="deferred"
      • Impersonate="off"
    3. 即使如此,我也不想使用我的帮助程序来正确解析32位regsvr32.exe。有什么选择?

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

这听起来好像会在以后引起很多问题。虽然听起来您决定使用此自行注册,但请阅读以下整篇文章Self-Registration considered harmful

在大型公司的应用程序包装中发现,在自行注册期间做“奇怪的事情”的软件真的不受欢迎。有时它足以抛弃整个软件。

如果您在应用程序运行之前需要完成管理员权限,则应该将其作为安装程序的一部分进行,而不是通过自行注册(请参阅上面链接帖子中的众多原因)。几乎任何其他方式都更好,包括使用自定义操作的命令行运行主application.exe以触发自定义注册步骤,然后提供实际执行操作的良好日志。您应该恢复COM服务器的正常COM注册和提取。

听听COM服务器的独特之处会很有趣吗?这是通常的许可问题吗?