| FAQ der Newsgroup de.comp.lang.assembler (d.c.l.a.) | |||||||||||||||
|
Wie verhindere ich das Öffnen einer Konsole in Windows? Manche Programme öffnen eine Konsole (Eingabeaufforderungsfenster), wenn sie per Mausklick gestartet werden. Diese Konsole bleibt während der Laufzeit des Programms offen. Ein kurzes Beispiel soll diesen Effekt verdeutlichen: Wenn man dieses Programm assembliert, wie angegeben linkt (mit Option /console) und per Klick im Windows-Explorer startet, öffnet sich eine schwarze Konsole und darüber die Message-Box. Beides verschwindet erst mit einem Klick auf OK. Verantwortlich für dieses Verhalten ist das Subsystem-Flag im PE-Header der EXE-Datei. Normalerweise interessieren nur zwei der verschiedenenen Subsysteme: Console (CUI - Console User Interface) und Windows (GUI - Graphical User Interface). Das Console-Subsystem öffnet eine Konsole, wenn das Programm nicht bereits eine Konsole zur Verfügung hat. Beim Windows-Subsystem muss der Programmierer selbst das Erscheinungsbild des Programms bestimmen. Dieses Subsystem ist auch das richtige Subsystem, wenn man überhaupt kein Erscheinungsbild haben möchte. Das Subsystem-Flag wird vom Linker gesetzt. Hier die Kommandozeilenparameter einiger Linker für das Setzen des Windows-Subsystem-Flags:
Das Subsystem-Flag kann auch nachträglich gesetzt werden. In jedem Visual-Studio-Paket befindet sich der COFF-Binärdatei-Editor EditBin.exe, mit dem man das Subsystem-Flag ändern kann. Die Eigenentwicklung rbSubSys kann mit Nasm-Quellcode hier heruntergeladen werden. Der große Nachteil besteht darin, dass ein GUI-Programm zwar von der Konsole gestartet werden kann, aber keine Ausgabe an diese Konsole senden kann. Ab Windows XP gibt es die Kernel-Funktion AttachConsole(-1), mit der man eine Ausgabe wenigstens über "start /wait ..." erzwingen kann: Eine andere Möglichkeit ist, beim Subsystem CONSOLE zu bleiben und das Konsolenfenster so schnell wie möglich zu entkoppeln (es schließt sich dann von selbst). Die Win32-Funktion hierfür heißt FreeConsole. Es bleibt aber ein kurzes Aufblitzen der Konsole. Links zum Thema GUI-Programm und Konsole:
http://support.microsoft.com/kb/105305/en-us Ralph 'rkhb' Bauer Feb 2009 | |||||||||||||||