Différence entre l'application Windows et la console


39

Quelles différences y a-t-il entre les applications Windows et la console?

Lors de la création d'un nouveau projet dans Visual C++, il demande de choisir l'un des éléments ci-dessus.

62

La seule différence est qu'une application de console engendre toujours une console si elle n'est pas démarrée à partir d'une console (ou si la console est activement supprimée au démarrage). Par contre, une application Windows ne génère pas de console. Il peut toujours attacher à une console existante ou en créer un nouveau en utilisant AllocConsole.

Cela rend les applications Windows mieux adaptées aux applications GUI ou aux applications d'arrière-plan, car vous ne souhaitez généralement pas qu'une fenêtre de terminal soit créée pour celles-ci. Sur une note plus technique, la seule différence entre une console et un exécutable Windows est un octet dans l'en-tête PE du fichier exe. Le basculement manuel de cet octet (par exemple, à l'aide d'un éditeur hexadécimal) convertit le type d'application. C'est un hack bien publié qui est utilisé pour créer des applications console dans VB6 (où ce type d'application n'était pas explicitement supporté).

Pour déterminer et modifier le type de sous-système d'une application, vous devez lire des parties de l'en-tête PE. L'adresse des données du sous-système n'est pas fixée, car elle fait partie de l'en-tête de fichier facultatif dont la position est déterminée par une adresse stockée dans l'en-tête du fichier DOS (dans le membre e_lfanew). Cette adresse pointe vers l'enregistrement _IMAGE_NT_HEADERS qui, à son tour, inclut la structure IMAGE_OPTIONAL_HEADER32. Cela a un int161) membre appelé Subsystem. La valeur du membre est 2 pour une application Windows et 3 pour une application console. D'autres sous-systèmes existent (en particulier, POSIX et le noyau). J'ai écrit une petite application VB6 pour changer le sous-système d'une application, qui peut être téléchargée de ActiveVB comme code source.

Le format PE n'est pas très bien documenté mais ce document peut servir d'introduction: Peering Inside the PE: A Tour of the Win32 Portable Executable File Format.


1) Cela ne contredit pas vraiment mon affirmation selon laquelle un seul octet est différent: de ce membre de l'octet le plus significatif est toujours 0. Seuls les moins de changements d'octets significatifs.

  0

Merci Konrad - :-) grand 22 févr.. 092009-02-22 13:24:33

  0

@Rakesh, vous devrait accepter sa solution si vous l'aimez, c'est le petit V à côté de la réponse. 22 févr.. 092009-02-22 13:27:07

  0

@Olafur, pourriez-vous s'il vous plaît me dire quelle est la signification de la valeur «4» juste au-dessus du petit V à côté de la réponse? 22 févr.. 092009-02-22 13:29:21

  0

c'est le nombre de "Up votes" - 4 personnes (5 maintenant) ont voté en faveur de cette réponse. 22 févr.. 092009-02-22 13:36:16

  0

qu'est-ce que «2» à côté de la question posée? 22 févr.. 092009-02-22 13:39:15

  0

N'y a-t-il pas aussi des différences dans les DLL référencées? 22 févr.. 092009-02-22 13:40:13

  0

@Rakesh - Nombre de mises à jour pour votre question 22 févr.. 092009-02-22 13:40:39

  0

@SoapBox: voir la mise à jour de la réponse. L'adresse n'est pas fixe, elle doit être calculée. J'ai posté un lien vers du code VB6 pour lire ces données. L'article MSDN montre également comment faire cela. 22 févr.. 092009-02-22 16:15:27

  0

Mon père remplaçait simplement l'éditeur de liens par un programme personnalisé qui modifiait la ligne de commande de l'éditeur de liens dans le fichier approprié, puis exécutait l'éditeur de liens réel. Le résultat final est le même que de basculer l'octet dans l'exécutable, bien sûr :) 31 mai. 132013-05-31 05:10:53


1

application de la console fonctionne à partir d'une ligne de commande Windows (Démarrer/Exécuter/cmd)

Une application de fenêtre est réglé de sorte que vous pouvez programmer une application graphique qui fonctionne dans l'environnement Windows.


15

Outre la différence mentionnée par Konrad, la console et les applications Windows se comportent différemment lorsqu'il est appelé de manière interactive à partir de l'invite de commande:

Lorsque vous démarrez une application console, l'invite de commande ne retourne pas avant la sortie de l'application de la console. Lorsque vous démarrez une application Windows, la commande renvoie immédiatement.

Cela n'est pas vrai pour les fichiers batch; ils attendent toujours jusqu'à la fin de l'application. (Vous pouvez toujours utiliser la commande start pour démarrer une application sans attendre.


2

La différence réside dans la façon dont les applications sont bloquées. Lorsque vous utilisez le modèle de console, vous avez un talon qui se déclenche dans une console. Si vous utilisez déjà une console, elle ignore l'appel pour en créer une.

De même, une application Windows est conçue avec un formulaire par défaut. Si vous souhaitez l'effacer, vous pouvez créer une application Windows Forms sans forme qui est essentiellement une application de console sans fenêtre de console.

En ce qui concerne le courage de l'application, ils sont essentiellement les mêmes. La différence majeure est ajoutée au stade de la compilation.


1

message boucle est également l'une de la différence:

http://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows


2

Vous pouvez modifier le sous-système avec le Editbin.exe (MSDN Entry on EDITBIN.exe)