INFO: Aufrufen von CRT-Ausgabe Routinen aus einer GUI-Anwendung

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 105305 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Zusammenfassung

Mit C Run-Time-Ausgabe-Routinen wie printf() aus einer GUI-Anwendung ist es erforderlich eine Konsole erstellen. Win32 Application programming Interface (API) AllocConsole() erstellt die Konsole. Die Routine setvbuf() CRT entfernt Pufferung so, dass Ausgabe sofort sichtbar ist.

Diese Methode funktioniert wenn GUI-Anwendung von der Befehlszeile aus oder vom Datei-Manager ausgeführt wird. Diese Methode funktioniert jedoch nicht, wenn die Anwendung aus dem Programm-Manager oder über den Befehl "Start" gestartet wird. Im folgende Code wird veranschaulicht, um dieses Problem zu umgehen:
   int hCrt;
   FILE *hf;

   AllocConsole();
   hCrt = _open_osfhandle(
             (long) GetStdHandle(STD_OUTPUT_HANDLE),
             _O_TEXT
          );
   hf = _fdopen( hCrt, "w" );
   *stdout = *hf;
   i = setvbuf( stdout, NULL, _IONBF, 0 );
				
dieser Code eröffnet ein neue Low-Level CRT-Handle für die richtige Konsolenausgabe-Handle, das Low-Level Handle einen neuen Stream ordnet und ersetzt Stdout durch die neuen Stream. Dieser Vorgang sorgt für Funktionen, die stdout, wie printf(), puts() und usw. verwenden. Verwenden Sie dieselbe Verfahren für Stdin und Stderr.

Beachten Sie, dass dieser Code Probleme mit Ziehpunkten 0, 1 und 2 nicht behoben wird. Aufgrund von anderen Komplikationen tatsächlich, es ist nicht möglich, dies zu korrigieren, und daher ist es erforderlich, Stream-e/A statt auf niedriger Ebene e/A zu verwenden.

Weitere Informationen

Wenn eine GUI-Anwendung gestartet wird mit "Starten der ? Befehl, der drei standard-Betriebssystem behandelt STD_INPUT_HANDLE, STD_OUTPUT_HANDLE und STD_ERROR_HANDLE sind alle ? genullt" von der Konsole Initialisierungsroutinen. Diese drei Handles werden durch gültige Werte ersetzt, wenn die GUI-Anwendung AllocConsole() aufruft. Daher Sobald dies geschehen ist, wird beim Aufrufen GetStdHandle() immer gültiges Handle Werte zurückgegeben. Das Problem ist, dass die CRT Initialisierung bereits abgeschlossen wurde, bevor Ihre Anwendung rufen Sie AllocConsole() Möglichkeit erhält, die drei niedrige e/a-Handles 0, 1 und 2 bereits eingerichtet wurde mit der ursprünglichen genullt, Betriebssystem-Handles, sodass alle CRT e/A an ungültige OS-Handles gesendet und CRT-Ausgabe nicht in der Konsole angezeigt. Verwenden Sie die Problemumgehung oben beschrieben, um dieses Problem zu vermeiden.

Im Fall von GUI-Anwendung von der Befehlszeile ohne den Befehl "Start" beginnen, die Standardhandles im Betriebssystem sind nicht korrekt aus genullt, aber falsch von cmd.exe vererbt werden. Wenn die Anwendung CRT initialisiert, werden die drei niedrige e/a-Handles 0, 1 und 2 initialisiert, die drei Handle Zahlen verwenden, die die Anwendung von cmd.exe erbt. Wenn die Anwendung den AllocConsole() aufruft, versucht die Initialisierungsroutinen Konsole, was die Initialisierung der Konsole glaubt, werden ungültige OS Handle Standardwerte mit gültigen Handle Werten aus die neue Konsole zu ersetzen. Durch Zufall da die Initialisierungsroutinen Konsole in der Regel geben Sie die gleichen drei Werte für die Standardhandles von OS ersetzt Konsole Initialisierung die Standardwerte der Betriebssystem-Handle mit den gleichen Werten, die vor--diejenigen von cmd.exe geerbt wurden. Daher, CRT e/a-funktioniert in diesem Fall.

Sie müssen unbedingt bewusst, dass die Möglichkeit, CRT-Routinen in einer GUI-Anwendung von der Befehlszeile aus ausführen verwenden nicht beabsichtigt, war sodass dies in zukünftigen Versionen von Windows NT oder Windows möglicherweise nicht funktionieren. In einer zukünftigen Version müssen Sie möglicherweise die Problemumgehung nicht nur für Anwendungen, die mit "Start < anwendungsname >" auf der Befehlszeile gestartet, sondern auch für Anwendungen auf der Befehlszeile mit "Anwendungsname" gestartet.

Eigenschaften

Artikel-ID: 105305 - Geändert am: Dienstag, 21. November 2006 - Version: 4.2
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Win32 Application Programming Interface, wenn verwendet mit:
    • Microsoft Windows NT Advanced Server 3.1
    • Microsoft Windows NT 4.0
    • Microsoft Windows NT 3.51 Service Pack 5
    • Microsoft Windows NT 4.0
    • Microsoft Windows 95
    • Microsoft Windows 98 Standard Edition
    • the operating system: Microsoft Windows 2000
    • Microsoft Windows Millennium Edition
    • the operating system: Microsoft Windows XP
Keywords: 
kbmt kbconsole kbinfo kbkernbase KB105305 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 105305
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com