Differenza tra Windows e l'applicazione console


39

Quali differenze ci sono tra le applicazioni Windows e Console?

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

62

L'unica differenza è che un'applicazione console genera sempre una console se non viene avviata da una (o se la console è attivamente soppressa all'avvio). Un'applicazione Windows, d'altra parte, non genera una console. È possibile aggiungere a una console esistente o crearne una nuova utilizzando AllocConsole.

Ciò rende le applicazioni Windows più adatte per applicazioni GUI o 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. La commutazione manuale di questo byte (ad esempio utilizzando 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. Tuttavia, l'indirizzo dei dati del sottosistema non viene risolto perché fa parte dell'intestazione del file facoltativo 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 int161) membro 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: A Tour of the Win32 Portable Executable File Format.


1) Questo in realtà non contraddice la mia affermazione che un solo byte è diverso: il byte più significativo di questo utente è sempre 0. Solo i meno significativi cambiamenti byte.

  0

Grazie Konrad - grande :-) 22 feb. 092009-02-22 13:24:33

  0

@Rakesh, è dovrebbe accettare la sua soluzione se ti piace, è la piccola V accanto alla risposta. 22 feb. 092009-02-22 13:27:07

  0

@Olafur, potresti dirmi qual è il significato del valore '4' proprio sopra la piccola V accanto alla risposta? 22 feb. 092009-02-22 13:29:21

  0

questo è il numero di "Voti positivi" - 4 persone (5 adesso) hanno votato a favore di questa risposta. 22 feb. 092009-02-22 13:36:16

  0

cos'è "2" accanto alla domanda? 22 feb. 092009-02-22 13:39:15

  0

Non ci sono differenze anche nelle DLL di riferimento? 22 feb. 092009-02-22 13:40:13

  0

@Rakesh - No di upvotes per la tua domanda 22 feb. 092009-02-22 13:40:39

  0

@SoapBox: vedi risposta aggiornata. L'indirizzo non è fisso, deve essere calcolato. Ho postato un collegamento ad un codice VB6 per leggere questi dati. L'articolo MSDN mostra anche come farlo. 22 feb. 092009-02-22 16:15:27

  0

Mio padre si limitava a sostituire il linker con un programma personalizzato che modificava la riga di comando del linker nel file appropriato e quindi eseguiva il linker effettivo su di esso. Il risultato finale è lo stesso del passaggio del byte nell'eseguibile, ovviamente :) 31 mag. 132013-05-31 05:10:53


1

applicazione console va da una riga di comando di Windows (Start/Esegui/cmd)

Un'applicazione Finestra è preimpostato in modo da poter programmare un applicazione GUI che viene eseguito in ambiente Windows.


15

Oltre alla differenza di cui da Konrad, console e le applicazioni Windows si comportano in modo diverso quando viene chiamato in modo interattivo dal prompt dei comandi:

Quando si avvia un'applicazione console, il prompt dei comandi non restituisce fino a quando la chiusura dell'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 possibile utilizzare il comando start per avviare un'applicazione senza attendere.)


2

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

Allo stesso modo, un'applicazione di Windows è progettata con un modulo predefinito. Se si desidera eliminarlo, è possibile 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.


1

messaggio Loop è anche uno della differenza:

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


2

È possibile modificare il sottosistema al EDITBIN.exe (MSDN Entry on EDITBIN.exe)