我编写了一个通过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)
regsvr32.exe引用了错误.我注意到x64版本resgvr32.exe是在64位系统而不是32位版本上运行的.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以提升的权限运行(嗯,在与主安装程序作业相同的安全上下文中),这些条件必须为真:
<Custom/>" must haveBefore ="InstallFinalize" , and **not**After ="" any other values forBefore =""`将无法可靠地工作,因为WIX或Windows Installer可能会重新排列操作(wut).<CustomAction />已明确设置这些属性:
Execute="deferred"Impersonate="off"即使如此,我也不想使用我的帮助程序来正确解析32位regsvr32.exe.有什么选择?
如果你真的必须将File/@ SelfRegCost设置为1,我不建议使用自我注册,这不是使用Windows Installer执行此操作的正确方法.
更好的方法是提取注册表值并使用WiX编写它们 - 您还可以使用heat来生成值.
| 归档时间: |
|
| 查看次数: |
4124 次 |
| 最近记录: |