visual tutorial toolset studio prime create installer wix windows-installer custom-action

installer - tutorial - wix visual studio 2012



WiX-CustomAction ExeCommand-Ocultar consola (4)

Hay un pequeño problema de gallina y huevo en que un ejecutable tiene que estar marcado como una aplicación de consola antes de que se inicie, y si desea iniciar un archivo de ese tipo sin que aparezca la consola, tiene que tener su proceso creado con el banderas de la derecha. Si su instalador no puede proporcionarlos, es posible usar un tercer .exe entre ellos. Por ejemplo, el instalador de Keybase lanza esta pequeña utilidad, llamada keybaserq.exe , para ejecutar aplicaciones de consola persistentes en segundo plano sin ventanas negras parpadeantes. Es de código abierto y puede ver cómo el instalador de Keybase lo utiliza , sin ventanas de consola parpadeantes.

Hemos conseguido una acción personalizada que ejecuta la línea de comandos para que funcione como tal:

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

El problema es que el usuario ve una consola emergente cuando se ejecuta el comando.

La línea de comando requiere una elevación de UAC, pero no debe requerir ninguna interacción del usuario. También instalamos el archivo con la configuración, la acción personalizada se ejecuta después de = "InstallFiles".

¿Cómo evitamos que el usuario vea la consola?


Si tiene el código fuente del archivo EXE, esto es lo que puede hacer. Haga el proyecto EXE Proyecto de la aplicación Win32 en lugar de la aplicación de consola .

Si no puede modificar el código fuente del archivo EXE, puede hacerlo de la siguiente manera:

  1. Creando una DLL CustomAction
  2. Llamando a CustomAction en DLL (desde WiX) para ejecutar el proceso, ocultando la ventana de la consola.

Solo tiene que agregar el segundo comando "exit" para cmd.exe

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

Esperanza te ayuda


Tenga en cuenta que si necesita una elevación de UAC, debe asegurarse de que se trata de una CA de ejecución diferida. Aquí está el ejemplo del manual con los argumentos de línea de comando agregados.

<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>