Unterschied zwischen Windows- und Konsolenanwendung


39

Welche Unterschiede bestehen zwischen Windows- und Konsolenanwendungen?

Wenn Sie ein neues Projekt in Visual C++ erstellen, werden Sie aufgefordert, eines der oben genannten auszuwählen.

62

Der einzige Unterschied besteht darin, dass eine Konsolenanwendung immer eine Konsole hervorbringt, wenn sie nicht von einer Konsole gestartet wird (oder die Konsole beim Start aktiv unterdrückt wird). Eine Windows-Anwendung erzeugt dagegen keine Konsole. Es kann immer noch an eine vorhandene Konsole anhängen oder eine neue erstellen mit AllocConsole.

Dadurch sind Windows-Anwendungen besser für GUI-Anwendungen oder Hintergrundanwendungen geeignet, da in der Regel kein Terminalfenster für diese Anwendungen erstellt werden soll.

Auf technische Kenntnis, der einzige Unterschied zwischen einer Konsole und einem Windows ausführbar ist ein Byte im PE-Header der Datei exe. Das manuelle Umstellen dieses Bytes (z. B. mit einem Hex-Editor) konvertiert den Anwendungstyp. Dies ist ein gut veröffentlichter Hack, der verwendet wird, um Konsolenanwendungen in VB6 zu erstellen (wo diese Art von Anwendung nicht explizit unterstützt wurde).

Um den Subsystemtyp einer Anwendung zu ermitteln und zu ändern, müssen Sie Teile des PE-Headers lesen. Die Adresse der Subsystemdaten ist jedoch nicht festgelegt, da sie Teil des optionalen Dateiheaders ist, dessen Position durch eine Adresse bestimmt wird, die im DOS-Dateiheader (im Member e_lfanew) gespeichert ist. Diese Adresse zeigt tatsächlich auf den _IMAGE_NT_HEADERS Datensatz, der wiederum die Struktur IMAGE_OPTIONAL_HEADER32 enthält. Dies hat eine int161) Mitglied namens Subsystem. Der Wert des Mitglieds ist 2 für eine Windows-Anwendung und 3 für eine Konsolenanwendung. Andere Subsysteme existieren (insbesondere POSIX und Kernel). Ich habe eine kleine VB6-Anwendung geschrieben, um das Subsystem einer Anwendung zu ändern, das von ActiveVB als Quellcode heruntergeladen werden kann. Das PE-Format ist nicht sehr gut dokumentiert, aber dieses Dokument kann als Einführung dienen: Peering Inside the PE: A Tour of the Win32 Portable Executable File Format.


1) Dies widerspricht nicht wirklich meine Behauptung, dass nur ein Byte unterscheidet: das signifikanteste Byte dieses Mitglied ist immer 0. Nur die wenigsten signifikante Byte ändert.

  0

Dank Konrad ändern kann - super :-) 22 feb. 092009-02-22 13:24:33

  0

@Rakesh, Sie sollte seine Lösung akzeptieren, wenn Sie es mögen, es ist das kleine V neben der Antwort. 22 feb. 092009-02-22 13:27:07

  0

@Olafur, kannst du mir bitte sagen, was ist die Bedeutung von Wert '4' direkt über dem kleinen V neben der Antwort? 22 feb. 092009-02-22 13:29:21

  0

das ist die Anzahl der "Up Votes" - 4 Personen (5 jetzt) ​​haben für diese Antwort gestimmt. 22 feb. 092009-02-22 13:36:16

  0

Was ist das "2" neben der Frage gefragt? 22 feb. 092009-02-22 13:39:15

  0

Gibt es nicht auch Unterschiede in referenzierten DLLs? 22 feb. 092009-02-22 13:40:13

  0

@Rakesh - Nein von Upvotes für Ihre Frage 22 feb. 092009-02-22 13:40:39

  0

@SoapBox: siehe aktualisierte Antwort. Die Adresse ist nicht festgelegt, sie muss berechnet werden. Ich habe einen Link zu einem VB6-Code geschrieben, um diese Daten zu lesen. Der MSDN-Artikel zeigt außerdem, wie das getan wird. 22 feb. 092009-02-22 16:15:27

  0

Mein Vater hat den Linker nur durch ein benutzerdefiniertes Programm ersetzt, das die Linker-Befehlszeile in der entsprechenden Datei änderte und dann den eigentlichen Linker darauf ausführte. Das Endergebnis ist natürlich dasselbe wie das Umschalten des Bytes in der ausführbaren Datei, natürlich :) 31 mai. 132013-05-31 05:10:53


1

Konsolenanwendung läuft von einer Windows-Kommandozeile (Start/Ausführen/cmd)

Ein Fenster Anwendung voreingestellt, so dass Sie eine GUI-Anwendung programmiert werden können, die innerhalb der Windows-Umgebung ausgeführt wird.


15

Neben der Differenz von Konrad erwähnt, Konsole und Windows-Anwendungen verhalten sich anders, wenn interaktiv an der Eingabeaufforderung genannt:

Wenn Sie eine Konsolenanwendung starten, wird die Eingabeaufforderung nicht zurück, bis die Konsole Anwendung beendet. Wenn Sie eine Windows-Anwendung starten, wird der Befehl sofort zurückgegeben.

Dies gilt nicht für Batch-Dateien; Sie warten immer, bis die Anwendung beendet wird. (Sie können den Befehl start immer verwenden, um eine Anwendung ohne Warten zu starten.)


2

Der Unterschied liegt in der Art, wie die Apps ausgedrückt werden. Wenn Sie die Konsolenvorlage verwenden, haben Sie einen Stub, der in einer Konsole ausgelöst wird. Wenn Sie bereits in einer Konsole ausgeführt werden, wird der Aufruf ignoriert, um einen zu drehen.

Aus dem gleichen Grund wird eine Windows-App mit einem Standardformular entworfen. Wenn Sie das Problem beheben möchten, können Sie eine formlose Windows Forms-Anwendung erstellen, bei der es sich im Wesentlichen um eine Konsolenanwendung ohne Konsolenfenster handelt.

Soweit die Eingeweide der App geht, sind sie im Wesentlichen die gleichen. Der Hauptunterschied wird bei der Kompilierung hinzugefügt.


1

Nachrichtenschleife ist auch einer der Differenz:

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


2

Sie das Subsystem mit dem EDITBIN.exe (MSDN Entry on EDITBIN.exe)