Différence entre l’application Windows et la console

Quelles sont les différences entre les applications Windows et Console?

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

La seule différence est qu’une application console génère toujours une console si elle n’est pas démarrée à partir de l’une (ou si la console est activement supprimée au démarrage). Une application Windows, par contre, ne génère pas de console. Il peut toujours être AllocConsole à une console existante ou en créer une nouvelle à l’aide d’ AllocConsole .

Cela rend les applications Windows mieux adaptées aux applications graphiques ou aux applications d’arrière-plan, car vous ne souhaitez généralement pas créer de fenêtre de terminal pour ces applications.

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 fait de basculer manuellement cet octet (par exemple en utilisant un éditeur hexadécimal) convertit le type d’application. Il s’agit d’un hack bien publié utilisé pour créer des applications de console dans VB6 (où ce type d’application n’était pas explicitement pris en charge).

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 cependant pas fixe 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 en réalité vers l’enregistrement _IMAGE_NT_HEADERS qui, à son tour, inclut la structure IMAGE_OPTIONAL_HEADER32 . Cela a un int16 1) 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 (notamment POSIX et kernel). J’ai écrit une petite application VB6 pour changer le sous-système d’une application, qui peut être téléchargé à partir d’ ActiveVB en tant que code source.

Le format PE n’est pas très bien documenté, mais ce document peut servir d’introduction: Peering Inside the PE: visite du format de fichier exécutable portable Win32 .


1) Cela ne contredit pas vraiment mon affirmation selon laquelle un seul octet diffère: l’octet le plus significatif de ce membre est toujours 0. Seuls les octets les moins significatifs changent.

Outre la différence mentionnée par Konrad, les applications console et Windows se comportent différemment lorsqu’elles sont appelées interactivement depuis l’invite de commande:

Lorsque vous démarrez une application console, l’invite de commande ne retourne pas jusqu’à la fermeture de l’application console. Lorsque vous démarrez une application Windows, la commande renvoie immédiatement.

Cela n’est pas vrai pour les fichiers de commandes. ils attendent toujours que l’application se ferme. (Vous pouvez toujours utiliser la commande de démarrage pour démarrer une application sans attendre.)

La différence réside dans la manière dont les applications sont supprimées. Lorsque vous utilisez le modèle de console, vous avez un stub qui se lance dans une console. Si vous utilisez déjà une console, l’appel est ignoré.

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 les entrailles de l’application, elles sont essentiellement les mêmes. La différence majeure est ajoutée à la compilation.

Vous pouvez modifier le sous-système avec EDITBIN.exe ( entrée MSDN sur EDITBIN.exe )

L’application console s’exécute à partir d’une ligne de commande Windows (start / run / cmd)

Une application Windows est prédéfinie afin que vous puissiez programmer une application graphique qui s’exécute dans l’environnement Windows.

La boucle de messages est également l’une des différences:

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