Differenza tra Windows e l’applicazione Console

Quali sono le differenze tra le applicazioni Windows e Console?

Quando si crea un nuovo progetto in Visual C ++, si richiede di scegliere uno dei precedenti.

L’unica differenza è che un’applicazione console genera sempre una console se non viene avviata da una (o se la console è triggersmente soppressa all’avvio). Un’applicazione Windows, d’altra parte, non genera una console. Può ancora collegarsi a una console esistente o crearne una nuova utilizzando AllocConsole .

Ciò rende le applicazioni Windows più adatte per le applicazioni GUI o le applicazioni in background perché di solito non si desidera creare una finestra terminale per quelle.

Su una nota più tecnica, l’unica differenza tra una console e un eseguibile di Windows è un byte nell’intestazione PE del file exe . Commutare manualmente questo byte (es. Usando un editor esadecimale) converte il tipo di applicazione. Questo è un hack ben pubblicato che viene utilizzato per creare applicazioni console in VB6 (dove questo tipo di applicazione non era supportato esplicitamente).

Per determinare e modificare il tipo di sottosistema di un’applicazione, è necessario leggere le parti dell’intestazione PE. L’indirizzo dei dati del sottosistema non è stato risolto, perché fa parte dell’intestazione del file opzionale la cui posizione è determinata da un indirizzo memorizzato nell’intestazione del file DOS (nel membro e_lfanew ). Questo indirizzo punta effettivamente al record _IMAGE_NT_HEADERS che, a sua volta, include la struttura IMAGE_OPTIONAL_HEADER32 . Questo ha un membro int16 1) chiamato Subsystem . Il valore del membro è 2 per un’applicazione Windows e 3 per un’applicazione console. Esistono altri sottosistemi (in particolare POSIX e kernel). Ho scritto una piccola applicazione VB6 per modificare il sottosistema di un’applicazione, che può essere scaricato da ActiveVB come codice sorgente.

Il formato PE non è molto ben documentato, ma questo documento può servire come introduzione: Peering Inside the PE: un tour del formato di file eseguibile portatile Win32 .


1) Questo non contraddice in realtà la mia affermazione secondo cui differisce solo un byte: il byte più significativo di questo membro è sempre 0. Solo il byte meno significativo cambia.

Oltre alla differenza menzionata da Konrad, le applicazioni console e Windows si comportano diversamente quando vengono richiamate in modo interattivo dal prompt dei comandi:

Quando si avvia un’applicazione console, il prompt dei comandi non ritorna fino all’uscita dall’applicazione console. Quando si avvia un’applicazione Windows, il comando restituisce immediatamente.

Questo non è vero per i file batch; attenderanno sempre fino all’uscita dell’applicazione. (È sempre ansible utilizzare il comando di avvio per avviare un’applicazione senza attendere.)

La differenza sta nel modo in cui le app vengono eliminate. Quando si utilizza il modello di console, si ha uno stub che verrà triggersto in una console. Se stai già eseguendo una console, ignora la chiamata a farne una.

Allo stesso modo, un’applicazione per Windows è progettata con un modulo predefinito. Se si desidera eliminarlo, è ansible creare un’applicazione Windows Form senza forma che è essenzialmente un’applicazione di console senza una finestra della console.

Per quanto riguarda il coraggio, l’app è essenzialmente la stessa. La principale differenza viene aggiunta in fase di compilazione.

È ansible modificare il sottosistema con EDITBIN.exe ( voce MSDN su EDITBIN.exe )

L’applicazione console viene eseguita da una riga di comando di Windows (avvio / esecuzione / cmd)

Un’applicazione Window è preimpostata in modo da poter programmare un’applicazione GUI che viene eseguita all’interno dell’ambiente Windows.

Il Loop dei messaggi è anche una delle differenze:

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