2010-03-03 111 views
22

我们已经得到运行命令行自定义操作这样工作:维克斯 - CustomAction ExeCommand - 隐藏控制台

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

的问题是,用户将看到一个弹出式控制台命令运行时。

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

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

回答

2

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

如果您不能修改EXE文件的源代码,你可以这样做:

  1. 创建一个CustomAction DLL
  2. 调用的DLL(从维克斯)一个CustomAction执行过程中,隐藏控制台窗口。
+0

我们无法访问该流程的源代码,否则我们会写一个自定义操作。这是唯一的方法吗?这看起来像是WiX应该具备的一个简单的设置。为什么我必须编写一个自定义操作来启动一个流程? – jonathanpeppers 2010-03-03 17:22:23

6

请注意,如果您确实需要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> 
+0

谢谢,我们已经在做这个。 – jonathanpeppers 2010-03-04 14:06:53

+1

此解决方案有破坏注册表的风险。我从命令行编译我的安装程序,'DllEntry ='CAQuietExec''这一行使我的注册表处于不可修复的状态,因为安装程序安装正常,但没有出口所需的文件。在最终重新创建虚拟机之前,我花了好几个小时试图解决这个问题我应该有恢复点,但我当然没有(我的虚拟机的基本设置值得怀疑)。在我终于放弃之前,这浪费了我的时间。小心! – Shadoninja 2015-10-06 18:04:13

0

你只需要添加第二个命令“退出”,为CMD.EXE

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

希望,它可以帮助你

+0

你仍然可以看到控制台弹出的真实。这是非常不可取的,看起来像可怜的UI设计,而且非常“扒店”。 – jonathanpeppers 2012-07-04 23:54:22

+1

威克斯自2007年以来就有这个问题。这个问题还没有解决。在小程序中使用cmd正在为我工​​作。我用过不使用Wix。 – 2012-07-05 10:55:47

+1

那么,接受的答案作品。没有丑陋的cmd弹出。 – jonathanpeppers 2012-07-05 13:00:59

-1

有一个有点鸡和蛋的问题在于,可执行文件必须在启动之前标记为控制台应用程序,并且如果要在不弹出控制台的情况下启动此类exe,则必须使用正确的标志创建其进程。如果您的安装程序无法提供这些文件,则可以在其间使用第三个.exe文件。例如,Keybase安装程序将启动this small utility以在后台运行持久控制台应用程序,而不会显示闪烁的黑色窗口。