2010-03-03 2 views
22

Nous avons reçu une action personnalisée qui fonctionne en ligne de commande pour travailler en tant que tel:Wix - CustomAction ExeCommand - Cacher la console

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

Le problème est, l'utilisateur voit une fenêtre de la console lors de l'exécution de la commande.

La ligne de commande requiert une élévation de l'UAC, mais ne nécessite aucune interaction de la part de l'utilisateur. Nous installons également le fichier avec l'installation, l'action personnalisée exécute After = "InstallFiles".

Comment empêcher l'utilisateur de voir la console?

Répondre

2

Si vous avez le code source du fichier EXE, voici ce que vous pouvez faire. Rendre le projet EXE Win32 Application projet au lieu de Console Application.

Si vous ne pouvez pas modifier le code source du fichier EXE, vous pouvez le faire par:

  1. Création d'une CustomAction DLL
  2. Appeler un CustomAction dans DLL (de WiX) pour exécuter le processus, par cacher la fenêtre de la console.
+0

Nous n'avons pas accès au code source du processus, sinon nous aurions écrit une action personnalisée. Est-ce le seul moyen? Cela semble être un paramètre incontournable que WiX devrait avoir. Pourquoi devrais-je écrire une action personnalisée pour démarrer un processus? – jonathanpeppers

6

Notez que si vous avez besoin d'une élévation UAC, vous devez vous assurer qu'il s'agit d'une autorité d'exécution différée. Voici l'exemple du manuel avec les arguments de ligne de commande ajoutés.

<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

Merci, nous le faisons déjà. – jonathanpeppers

+1

Cette solution risque de détruire votre base de registre. Je compile mes programmes d'installation à partir de la ligne de commande, et la ligne 'DllEntry = "CAQuietExec"' a mis mon registre dans un état irréparable en raison de l'installation correcte du programme d'installation, mais sans les fichiers nécessaires à la sortie. J'ai passé des heures à essayer de résoudre ce problème avant de finalement recréer ma machine virtuelle. J'aurais dû avoir des points de restauration, mais bien sûr je ne l'ai pas fait (les paramètres de base de ma VM étaient discutables). Ce temps perdu de mon temps avant que j'ai finalement abandonné. Faites attention! – Shadoninja

0

Il vous suffit d'ajouter la deuxième commande « exit » pour cmd.exe

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

Hope, il vous aide à

+0

Vous verriez toujours la fenêtre contextuelle de la console très rapidement. Ceci est très indésirable, ressemble à une mauvaise conception de l'interface utilisateur, et très "chop shop". – jonathanpeppers

+1

Wix a ce numéro depuis 2007e année. Le problème n'a pas encore été résolu. Utiliser cmd est une solution de contournement pour moi dans les petits programmes. Je n'ai pas utilisé Wix. –

+1

Eh bien, la réponse acceptée fonctionne. Avec pas de popup cmd laid. – jonathanpeppers

-1

Il y a un peu d'un problème de poulet et des oeufs en ce qu'un L'exécutable doit être marqué comme une application de console avant qu'il ne démarre, et si vous voulez lancer un tel exe sans que la console n'apparaisse, il faut que son processus soit créé avec les bons drapeaux. Si votre installateur ne peut pas fournir ces derniers, il est possible d'utiliser un troisième fichier .exe entre les deux. Par exemple, le programme d'installation de Keybase lance this small utility pour exécuter des applications de console persistantes en arrière-plan sans fenêtres noires clignotantes.

Questions connexes