Sie sind zurzeit offline. Es wird auf die erneute Herstellung einer Internetverbindung gewartet.

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

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
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.
3.10 3,50 CRT umleiten std-Handles

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 105305 – Letzte Überarbeitung: 11/21/2006 15:41:01 – Revision: 4.2

Microsoft Win32 Application Programming Interface

  • kbmt kbconsole kbinfo kbkernbase KB105305 KbMtde
Feedback
html>