INFO: CRT-Output Routines aanroept vanuit een GUI-toepassing

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 105305 - Bekijk de producten waarop dit artikel van toepassing is.
Alles uitklappen | Alles samenvouwen

Samenvatting

C runtime output routines zoals printf() vanuit een GUI gebruiken toepassing, is het maken van een console. De Win32-toepassing programming interface maakt (API) AllocConsole() de console. De CRT routine setvbuf() verwijdert buffer zodat uitvoer onmiddellijk zichtbaar is.

Deze methode werkt als de toepassing wordt uitgevoerd vanaf de opdrachtregel of vanuit Bestandsbeheer. Echter, deze methode werkt niet als de toepassing starten van programma Manager of via de opdracht 'start'. De volgende code ziet u hoe dit probleem te omzeilen:
   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 );
				
Deze code wordt een nieuwe Low CRT-ingang naar de juiste console-uitvoer ingang, gekoppeld aan een nieuwe gegevensstroom die Low ingang en vervangen STDOUT met die nieuwe stream. Dit proces zorgt voor functies gebruiken STDOUT, zoals printf(), puts(), enzovoort. Gebruik dezelfde procedure voor stdin en stderr.

Opmerking: deze code wordt niet opgelost problemen met grepen 0, 1 en 2. In feit er andere complicaties, het is niet mogelijk om deze, en Daarom is het noodzakelijk I/O stream gebruiken in plaats van I/O op laag niveau.

Meer informatie

Wanneer een toepassing wordt gestart met de opdracht 'start', de drie Standaard OS STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, verwerkt en STD_ERROR_HANDLE zijn alle "nulpunt ' door de initialisatie van de console routines. Deze drie ingangen worden vervangen door waarden die van geldige wanneer de GUI toepassing AllocConsole(). Daarom, zodra dit wordt gedaan, aanroepen GetStdHandle() wordt altijd geldige ingang waarden geretourneerd. Het probleem is dat de CRT al initialisatie is voltooid voordat uw toepassing krijgt een kans om het aanroepen van AllocConsole(); de drie lage I/O grepen 0, 1 en 2 al is ingesteld voor gebruik van de oorspronkelijke ingesteld op nul, OS handgrepen, zodat alle CRT I/O is verzonden naar ongeldige ingangen van OS en CRT-uitvoer wordt niet weergegeven in de console. De hierboven beschreven om dit probleem oplossing gebruiken.

Voor de toepassing vanaf de opdrachtregel zonder de opdracht 'start', de OS-ingangen niet correct nulpunt worden, standaard maar onjuist zijn overgenomen van CMD.EXE. Wanneer de toepassing CRT van geïnitialiseerd, de drie lage I/O grepen 0, 1 en 2 zijn geïnitialiseerd gebruiken de drie getallen die van Cmd.exe de toepassing neemt verwerktEXE. Wanneer de toepassing roept AllocConsole(), de console initialisatieroutines poging om de initialisatie van de console gelooft ongeldig worden vervangen Standaard OS verwerken met geldige ingang waarden uit de nieuwe console. Door samenvalt, omdat de console initialisatieroutines meestal vermeld dezelfde drie waarden voor de standaard OS grepen, de console initilization vervangt de standaard waarden voor OS-ingang met dezelfde waarden die er vóór waren--die zijn overgenomen van CMD.EXE. Daarom In dit geval werkt het CRT I/O.

Het is belangrijk te realiseren dat gebruik van CRT-routines uit een GUI toepassing uitvoeren vanaf de opdrachtregel is niet ontworpen, zodat dit niet mogelijk werken in toekomstige versies van Windows NT of Windows. In een toekomstige versie u mogelijk moet de oplossing niet alleen voor toepassingen die worden gestart op de opdracht de regel met " <application name="">start", maar ook voor toepassingen die worden gestart op de opdrachtregel met 'application name'. </application>

Eigenschappen

Artikel ID: 105305 - Laatste beoordeling: vrijdag 6 juli 2012 - Wijziging: 4.0
De informatie in dit artikel is van toepassing op:
  • Microsoft Win32-API op de volgende platformen
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
Trefwoorden: 
kbconsole kbinfo kbkernbase kbmt KB105305 KbMtnl
Automatisch vertaald artikel
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende: 105305

Geef ons feedback

 

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