INFO: Volanie rutiny CRT výstup z GUI aplikácie

DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.

Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem:105305
SUHRN
Použiť C Run-time výstup rutín, ako napríklad printf() z GUIžiadosti, je potrebné vytvoriť konzolu. Aplikáciou Win32programovacie rozhranie (API) AllocConsole() vytvorí konzoly. CRTrutinné setvbuf() odstráni do medzipamäte tak, že výstup je okamžite viditeľná.

Táto metóda funguje ak GUI aplikácie je spustený z príkazového riadka aleboz programu Správca súborov. Avšak táto metóda nefunguje, ak aplikácia jezačal Program Manager alebo prostredníctvom príkazu "Štart". Nasledujúcekód ukazuje, ako obísť tento problém:
   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 otvára nové low-level CRT rukoväť na správne konzoly výstuprukoväť, priradí nová prúd low-level popisovača a nahrádzaSTDOUT s týmto novým prúd. Tento proces sa stará o funkcie, ktoré používajúSTDOUT, ako napríklad printf(), puts() a podobne. Použiť rovnaký postupSTDIN a stderr.

Všimnite si, že tento kód neopravuje problémy súvisiace s rukoväťami 0, 1 a 2. Vskutočnosti, kvôli iné komplikácie, nie je možné napraviť to, apreto je potrebné použiť prúd I/O namiesto low-level I/O.
DALSIE INFORMACIE
Zahájil GUI aplikácie pomocou príkazu "Štart", trištandardné OS zvláda STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, aSTD_ERROR_HANDLE sú všetky "preciachuje von" Autor Inicializácia konzolyrutiny. Tieto tri rukoväte nahrádzajú podľa platné hodnoty keď GUIuplatňovanie vyžaduje AllocConsole(). Preto, keď sa to deje, voláGetStdHandle() vždy vráti platným popisovačom hodnoty. Problém je, žeCRT ukončenú inicializácia pred vašej žiadosti dostanešanca na volanie AllocConsole(); majú tri nízke rukoväte i / 0, 1 a 2už boli nastavené na používanie originál preciachuje mimo OS kľučky, takže všetky CRTI/O sa odošle na neplatné popisovače OS a CRT výstup nie je zobrazený vkonzoly. Použiť riešenie vyššie popísané na odstránenie tohto problému.

Ide o GUI aplikácie počnúc príkazového riadka bezpríkaz "Štart", standard OS rukoväte nie sú správne preciachujeale sú nesprávne zdedené z CMD.EXE. Keď žiadosť je CRTinitializes, tri nízke rukoväte i / 0, 1 a 2 sú inicializované používaťtri Popisovač čísla, ktoré uplatňovanie zdedí od CMD.EXE. keď, kedyuplatňovanie vyžaduje AllocConsole(), konzola inicializačnej rutinypokúsite sa nahradiť, čo verí neplatnú Inicializácia konzolyštandardné OS zvládnuť hodnôt s platným popisovačom z novej konzoly. Autor:náhoda, pretože inicializačnej rutiny konzoly majú tendenciu dať vonrovnaké tri hodnoty pre štandardné OS rukovätí, konzolyupgradeovali bude nahraďte štandardný OS rukoväť hodnoty rovnakéhodnoty, ktoré tam boli pred--tie zdedené z CMD.EXE. Preto,I CRT / funguje v tomto prípade.

Je dôležité si uvedomiť, že schopnosť používať CRT rutiny z GUIaplikáciu spustiť z príkazového riadka nebol dizajnom tak to nesmúPráca v budúcich verziách systému Windows NT alebo Windows. V budúcej verzii, môžetemôžu potrebovať workaround nie len pre aplikácie začali na príkazriadok „Štart <application name="">", ale aj pre aplikácie začali naPríkazový riadok s "názov aplikácie".</application>
3.10 3.50 CRT presmerovať std kľučky

Upozornenie: Tento článok bol preložený automaticky.

Vlastnosti

ID článku: 105305 – Posledná kontrola: 10/10/2011 13:01:00 – Revízia: 2.0

Microsoft Win32 Application Programming Interface

  • kbconsole kbinfo kbkernbase kbmt KB105305 KbMtsk
Pripomienky