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
Installation WiX-自定义操作执行命令-隐藏控制台_Installation_Wix_Windows Installer_Custom Action - Fatal编程技术网

Installation WiX-自定义操作执行命令-隐藏控制台

Installation WiX-自定义操作执行命令-隐藏控制台,installation,wix,windows-installer,custom-action,Installation,Wix,Windows Installer,Custom Action,我们已经获得了一个自定义操作,该操作运行命令行来进行如下操作: <CustomAction Id="OurAction" FileKey="OurInstalledExe.exe" ExeCommand="our command line args" Execute="deferred" Return="check" /> 问题是,当命令运行时,用户会看到控制台

我们已经获得了一个自定义操作,该操作运行命令行来进行如下操作:

<CustomAction Id="OurAction" 
              FileKey="OurInstalledExe.exe"
              ExeCommand="our command line args" 
              Execute="deferred" 
              Return="check" />

问题是,当命令运行时,用户会看到控制台弹出窗口

命令行需要UAC提升,但不需要任何用户交互。我们还使用安装程序安装该文件,自定义操作在=“InstallFiles”之后运行


如何防止用户看到控制台?

如果您有EXE文件的源代码,您可以这样做。使EXE项目成为Win32应用程序项目,而不是控制台应用程序

如果无法修改EXE文件的源代码,可以通过以下方式进行修改:

  • 创建自定义操作DLL
  • 通过隐藏控制台窗口,调用DLL中的CustomAction(从WiX)来执行进程

  • 请注意,如果确实需要UAC提升,则需要确保它是延迟执行CA。下面是添加了命令行参数的手册示例

    <CustomAction Id="QtExecDeferredExampleWithProperty_Cmd" Property="QtExecDeferredExampleWithProperty"
                  Value="&quot;[#MyExecutable.exe]&quot; /arguments" Execute="immediate"/>
    <CustomAction Id="QtExecDeferredExampleWithProperty" BinaryKey="WixCA" DllEntry="CAQuietExec"
                  Execute="deferred" Return="check" Impersonate="no"/>
    .
    .
    .
    <InstallExecuteSequence>
        <Custom Action="QtExecDeferredExampleWithProperty_Cmd" After="CostFinalize"/>
        <Custom Action="QtExecDeferredExampleWithProperty" After="TheActionYouWantItAfter"/>
    </InstallExecuteSequence>
    
    
    .
    .
    .
    
    您只需为cmd.exe添加第二个命令“exit”

    ExeCommand="[SystemFolder]cmd.exe /C start MyExe.exe &amp; exit"
    

    希望,它能帮助您

    在可执行文件启动前必须标记为控制台应用程序这一点上有点鸡毛蒜皮的问题,如果您想在不弹出控制台的情况下启动此类可执行文件,则必须使用正确的标志创建其进程。如果您的安装程序无法提供这些,则可以在两者之间使用第三个.exe。例如,Keybase安装程序启动,以便在后台运行不闪烁黑色窗口的持久控制台应用程序。它是开源的,您可以看到-没有闪烁的控制台窗口。

    我们无法访问进程的源代码,否则我们将编写自定义操作。这是唯一的办法吗?这似乎是WiX应该拥有的一个不需要动脑筋的设置。为什么我必须编写一个自定义操作来启动一个进程?你仍然可以很快看到控制台弹出窗口。这是非常不受欢迎的,似乎是糟糕的UI设计,而且非常“刻板”。Wix从2007年起就出现了这个问题。这个问题还没有解决。使用cmd是我在小程序中的一种变通方法。我使用了不使用Wix。因为接受答案对我不起作用,但我的解决方案对我来说没问题。您问题的标题是“WiX-CustomAction执行命令-隐藏控制台”。我在解决问题之前花了太多时间。为什么你认为我只为你负责?有太多的人需要帮助。我没有创建新的分支,所以我在这里回答。此解决方案可能会破坏您的注册表。我正在从命令行编译我的安装程序,“DllEntry=“CAQuietExec””行将我的注册表置于无法修复的状态,因为安装程序安装良好,但在退出时没有所需的文件。我花了几个小时试图修复这个问题,最后才重新创建我的虚拟机。我应该有恢复点,但我当然没有(我的虚拟机的基本设置有问题)。在我最终放弃之前,这浪费了我几个小时的时间。小心!