Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
作为WIX安装程序的一部分运行regsvr32_Wix_Regsvr32 - Fatal编程技术网

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

作为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.

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

COM组件具有相当复杂且非静态的注册逻辑,这意味着将注册信息直接嵌入Windows Installer WXS文件不是一个可行的选项-必须使用
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
  • 1。如果我使用
    [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
    ,但是-我手工写下了密钥,到目前为止它工作得很好。