作为WIX安装程序的一部分运行regsvr32
我编写了一个COM组件,它是通过WIX生成的MSI分发的 COM组件具有相当复杂且非静态的注册逻辑,这意味着将注册信息直接嵌入Windows Installer WXS文件不是一个可行的选项-必须使用作为WIX安装程序的一部分运行regsvr32,wix,regsvr32,Wix,Regsvr32,我编写了一个COM组件,它是通过WIX生成的MSI分发的 COM组件具有相当复杂且非静态的注册逻辑,这意味着将注册信息直接嵌入Windows Installer WXS文件不是一个可行的选项-必须使用regsvr32进行注册-并且它是一个32位COM组件,因此,它必须在64位Windows上使用32位版本的regsvr32.exe,即%SystemRoot%\SysWow64\regsvr32.exe,或在x86 Windows上使用%SystemRoot%\System32\regsvr32.
regsvr32
进行注册-并且它是一个32位COM组件,因此,它必须在64位Windows上使用32位版本的regsvr32.exe
,即%SystemRoot%\SysWow64\regsvr32.exe
,或在x86 Windows上使用%SystemRoot%\System32\regsvr32.exe
我注意到使用此WXS XML的WIX存在两个问题:
<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
。我注意到64位系统上运行的是x64版本的resgvr32.exe
,而不是32位版本regsvr32.exe
在没有提升权限的情况下运行,因此COM注册失败,并且E_ACCESSDENIED
[WindowsFolder]\SysWOW64\regsvr32.exe
对regsvr32.exe可执行文件的路径进行硬编码,那么它就可以工作,但在真正的32位计算机上,如果SysWOW64
不存在,这将无法工作
两个人。我在网上读到,将After=“InstallFinalize”更改为After=“RemoveExistingProducts”将导致它以提升的权限运行,但这只会给我带来错误,说明
RemoveExistingProducts`是一个未解析的符号名
如何解决这两个问题
更新
(在与这个问题斗争了两个小时后,我确信WIX的作者是H.p.Lovecraft的亲密关系)
我已经解决了第一个问题,编写了自己的中间步骤程序,它是一个32位可执行文件,因此它将始终在WOW上下文下运行,因此它将可靠地调用32位regsvr32.exe
程序
我发现第二个问题的问题是:要使CustomAction以提升的权限运行(在与主安装程序作业相同的安全上下文中),这些条件必须为真:
必须在=“InstallFinalize”之前具有
,并且**not**
在=“”之前的任何其他值都不能可靠地工作,因为WIX或Windows Installer可能会重新安排操作(wut)
已明确设置这些属性:
Execute=“deferred”
Impersonate=“off”
即使如此,我也不想使用我的助手程序来正确解析32位的regsvr32.exe
。有哪些选项?我不建议使用自注册。如果您确实必须将File/@SelfRegCost设置为1,那么使用Windows Installer进行自注册并不是正确的方法
更好的方法是提取注册表值并使用WiX写入它们-您也可以使用heat生成值。这听起来像是以后会给您带来很多问题的事情。尽管听起来您决心使用这种自注册,请阅读整篇文章
当在大公司的应用程序包装中发现在自我注册过程中做“奇怪事情”的软件时,人们真的不赞成。有时,这足以成为扔掉整个软件的理由
如果您在应用程序运行之前需要使用管理员权限完成一些工作,那么您应该作为安装程序的一部分来完成,但不能通过自我注册(请参阅上面链接文章中的大量原因)。这几乎比任何其他方式都好,包括使用自定义操作中的命令行运行主应用程序.exe,以触发自定义注册步骤,然后提供实际执行情况的良好日志。并且,您应该恢复COM服务器的正常COM注册和提取
听听您的COM服务器的独特之处会很有趣吗?这是常见的许可问题吗?看看WiX SelfRegModules的内容。Windows Installer知道如何在没有regsvr32的情况下调用自注册。请参阅SelfReg表文档。我跟踪了您的更新。我的msi安装了应用程序,但没有注册dll,当我转到unins时这是卸载操作的相关详细日志输出:我甚至手动注册了dll(成功)但是卸载操作仍然失败,同样的事情也被记录了下来。你是对的-在仔细研究了这个问题之后,我推断在WIX中静态注册最终是最好的方法。虽然我没有使用heat
,但是-我手工写下了密钥,到目前为止它工作得很好。