Jdigital la réponse de points de Raymond Chen blog, ce qui explique pourquoi vous ne pouvez pas avoir une application qui est à la fois un programme de console et non de la console*
programme: L'OS a besoin de savoir avant que le programme commence à courir sous-système à utiliser. Une fois que le programme a commencé en cours d'exécution, il est trop tard pour revenir en arrière et demander à l'autre mode.
Cade la réponse de points pour un article à propos de l'exécution d'un .Net WinForms application avec une console. Il utilise la technique de l'appel d' AttachConsole
après le démarrage du programme en cours d'exécution. Cela a pour effet d'autoriser le programme à écrire de nouveau à la console de la fenêtre de l'invite de commande qui a démarré le programme. Mais les commentaires dans cet article le point de ce que je considère être une erreur fatale: Le processus de l'enfant ne contrôle pas vraiment la console. La console continue accepter l'entrée sur le nom du processus père et le processus parent ne sait pas qu'il faut attendre que l'enfant à la fin de course avant d'utiliser la console pour d'autres choses.
Chen article pointe vers un article de Junfeng Zhang qui explique un couple de d'autres techniques.
Le premier est ce que devenv utilise. Il fonctionne par le fait d'avoir deux programmes. L'un est devenv.exequi est l'interface graphique principale du programme, et l'autre est devenv.comqui gère en mode console tâches, mais si elle est utilisée dans un non-console-de la même manière, il transmet ses tâches à devenv.exe et les sorties. La technique repose sur le Win32 règle de com fichiers choisis à l'avance exe fichiers lorsque vous tapez une commande sans l'extension de fichier.
Il y a plus simple variation sur ce que Windows Script Host. Il fournit deux choses complètement distinctes binaires, wscript.exe et cscript.exe. De même, Java fournit java.exe pour les programmes de la console et javaw.exe pour les non-programmes de la console.
Junfeng la deuxième technique est ce que ildasm utilise. Il cite le processus qui ildasm'auteur est allé à travers quand le faire fonctionner dans les deux modes. En fin de compte, voici ce que l'on fait:
- Le programme est marqué comme une console en mode binaire, de sorte qu'il commence toujours avec une console. Cela permet l'entrée et la sortie de redirection à travailler comme d'habitude.
- Si le programme n'a pas de console en mode paramètres de ligne de commande, il se lance lui-même.
Il ne suffit pas de simplement appeler FreeConsole
de faire la première instance de cesser d'être un programme en mode console. C'est parce que le processus qui a démarré le programme, cmd.exe, "sait" qu'il a commencé une console en mode programme et est en attente de l'arrêt du programme en cours d'exécution. Appelant FreeConsole
ferait ildasm arrêter à l'aide de la console, mais ça ne ferait pas le parent processus de démarrage à l'aide de la console.
Donc, la première instance redémarre de lui-même (avec un supplément de paramètre de ligne de commande, je suppose). Lorsque vous appelez CreateProcess
, il y a deux indicateurs différents pour essayer, DETACHED_PROCESS
et CREATE_NEW_CONSOLE
, soit de ce qui fera en sorte que la deuxième instance de ne pas être attaché à la mère de la console. Après cela, la première instance peut résilier et de permettre à l'invite de commande pour reprendre les commandes de traitement.
Les effets secondaires de cette technique est que lorsque vous démarrez le programme à partir d'une interface graphique, il y aura toujours une console. Il clignote momentanément sur l'écran, puis disparaissent.
La partie en Junfeng de l'article sur l'utilisation de editbin de modifier le programme en mode console de pavillon est un leurre, je pense. Votre compilateur ou de l'environnement de développement doit fournir un réglage ou une option pour contrôler le type de binaire, il crée. Il devrait y avoir aucun besoin de modifier quoi que ce soit par la suite.
La ligne de fond, alors, est que vous pouvez avoir deux fichiers binaires, ou vous pouvez avoir un scintillement momentané d'une fenêtre de console. Une fois que vous décidez ce qui est le moindre mal, vous avez votre choix de mises en œuvre.
*
Je dis non de la console au lieu de GUI parce que sinon, c'est une fausse dichotomie. Juste parce qu'un programme n'a pas de console ne veut pas dire qu'il a une interface graphique. Une application de service est un premier exemple. Aussi, un programme peut avoir une console et windows.