INFORMACE: Volání rutiny CRT výstup z aplikace GUI

Překlady článku Překlady článku
ID článku: 105305 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Souhrn

Použití rutiny výstup C Runtime, jako například printf() z GUI aplikace je nutné vytvořit konzolu. Rozhraní Win32 application programming interface (API) AllocConsole() vytvoří konzoly. Rutiny setvbuf() CRT odebere ukládání do vyrovnávací paměti, že výstup je okamžitě viditelná.

Tato metoda funguje, pokud je aplikace GUI spustit z příkazového řádku nebo z programu Správce souborů. Tato metoda však nefunguje, pokud je spuštěna aplikace Správce programů nebo prostřednictvím příkazu "start". Následující kód ukazuje, jak tento problém vyřešit:
   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 );
				
tento kód otevře nahoru nový úchyt CRT nižší úrovně do popisovače výstupu konzoly správné, přidruží nového proudu nízkoúrovňové popisovače a nahradí stdout, že nového proudu. Tento proces činnostem funkcí použít stdout například printf(), puts() a tak dále. Použijte stejný postup pro stdin a proudu stderr.

Poznámka: Tento kód neodstraní potíže s úchyty 0, 1 a 2. Ve skutečnosti kvůli jiných komplikacích není možné opravit to a proto je nutné použít datový proud I/O namísto I/O nižší úrovně.

Další informace

Při spuštění aplikace GUI s "start"příkaz tři standardní OS zpracovává STD_INPUT_HANDLE, STD_OUTPUT_HANDLE a STD_ERROR_HANDLE jsou všechny"vynulovanými mimo" podle rutiny inicializace konzoly. Tyto tři popisovače jsou nahrazeny platné hodnoty při GUI aplikace volá AllocConsole(). Proto po to provést volání GetStdHandle() bude vždy vrátit platný popisovač hodnoty. Problém je, že CRT již dokončil inicializaci před aplikace získá pravděpodobnost volání AllocConsole(); tři nízké I/O úchytů 0, 1 a 2 byly již nastaveny použít původní vynulovanými mimo úchyty OS tak všechny I/O CRT odeslána neplatná úchyty OS a CRT výstup nezobrazí v konzole. Použijte řešení eliminovat potíže popsané výše.

V případě typu spuštění GUI aplikace z příkazového řádku bez příkazu "start" standardní úchyty OS jsou NOT správně vynulovanými mimo ale nesprávně zděděné z cmd.exe. Při inicializuje aplikace CRT tři nízké I/O úchytů 0, 1 a 2 inicializován použít tři úchyt čísla, která aplikace zdědí cmd.exe. Když aplikace volá AllocConsole(), pokus o inicializaci rutiny konzoly nahradit inicializace konzoly považuje být neplatné hodnoty standardní popisovač OS platný popisovač hodnotami z nové konzoly. Podle coincidence protože inicializace rutiny konzoly mají tendenci neuvádějte stejné tři hodnoty standardní úchyty OS initilization konzoly nahradí standardní popisovač hodnoty OS stejné hodnoty, které byly před--ty zděděné z cmd.exe k dispozici. Proto CRT I/O v tomto případě funguje.

Je důležité si uvědomit, že schopnost používat rutiny CRT z aplikace GUI spustit z příkazového řádku nebyl záměrné tak to nemusí fungovat v budoucích verzích Windows NT nebo Windows. Budoucí verze nejen pro aplikace spuštěna v příkazovém řádku s "zahájení < název aplikace >", ale také pro spuštění na příkazovém řádku příkazu "název aplikace" aplikace bude pravděpodobně nutné řešení.

Vlastnosti

ID článku: 105305 - Poslední aktualizace: 21. listopadu 2006 - Revize: 4.2
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Win32 Application Programming Interface na těchto platformách
    • 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
Klíčová slova: 
kbmt kbconsole kbinfo kbkernbase KB105305 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:105305

Dejte nám zpětnou vazbu

 

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