我创作了一个通过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"' />
regsvr32.exe
。我注意到resgvr32.exe
的x64版本是在64位系统而不是32位版本上运行的。regsvr32.exe
在没有提升权限的情况下运行,因此COM注册失败并显示E_ACCESSDENIED
。对于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以提升的权限运行(在与主安装程序作业相同的安全上下文中),这些条件必须为真:
<Custom/>" must have
之前=&#34; InstallFinalize&#34; , and **not**
之后=&#34;&#34; any other values for
之前=&#34;&#34;`赢了& #39; t可靠工作,因为WIX或Windows Installer可能会重新安排操作(哇)。<CustomAction />
已将这些属性明确设置:
Execute="deferred"
Impersonate="off"
即使如此,我也不想使用我的帮助程序来正确解析32位regsvr32.exe
。有什么选择?
答案 0 :(得分:5)
如果你真的必须将File / @ SelfRegCost设置为1,我根本不建议使用自我注册,这不是使用Windows Installer执行此操作的正确方法。
更好的方法是提取注册表值并使用WiX编写它们 - 您也可以使用heat来生成值。
答案 1 :(得分:2)
这听起来好像会在以后引起很多问题。虽然听起来您决定使用此自行注册,但请阅读以下整篇文章:Self-Registration considered harmful。
在大型公司的应用程序包装中发现,在自行注册期间做“奇怪的事情”的软件真的不受欢迎。有时它足以抛弃整个软件。
如果您在应用程序运行之前需要完成管理员权限,则应该将其作为安装程序的一部分进行,而不是通过自行注册(请参阅上面链接帖子中的众多原因)。几乎任何其他方式都更好,包括使用自定义操作的命令行运行主application.exe以触发自定义注册步骤,然后提供实际执行操作的良好日志。您应该恢复COM服务器的正常COM注册和提取。
听听COM服务器的独特之处会很有趣吗?这是通常的许可问题吗?