資訊: 從 GUI 應用程式呼叫 CRT 輸出常式

文章翻譯 文章翻譯
文章編號: 105305 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

結論

若要使用 C 執行階段輸出常式如從 GUI 應用程式的 printf() 就必須建立主控台。Win32 應用程式發展介面 (API) AllocConsole() 建立主控台。CRT 例行 setvbuf() 移除緩衝處理,如此輸出就立即可見。

如果在 GUI 應用程式執行從命令列中] 或 [從檔案管理員這個方法的效果。但是,這個方法無法運作如果從程式管理員] 或 [透過 「 啟動 」 命令啟動應用程式。下列程式碼將示範如何解決這個問題:
   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 );
				
這個程式碼會開啟的控制新低階 CRT 代碼正確的主控台輸出控制、 將新的資料流與該低階的控制代碼產生關聯,並以該新的資料流取代 stdout。這個處理程序會處理的函式 (使用如 printf()、 puts() 及等等的 stdout。請使用相同的程序 stdin 和 stderr。

請注意這段程式碼無法更正問題的控點 0、 1 和 2。在實際上由於至其他的複雜情形不能更正此,因此它需要使用資料流 I/O,而不是低階 I/O。

其他相關資訊

當一個 GUI 應用程式所啟動具有 「 開始 」 命令三個標準 OS 處理 STD_INPUT_HANDLE、 STD_OUTPUT_HANDLE 和 STD_ERROR_HANDLE 全都是 「 歸 」 主控台的初始化常式。這些三個控點會被取代有效值 GUI 應用程式呼叫 AllocConsole() 時。因此,一旦這完成呼叫 GetStdHandle() 一定會傳回有效的控制代碼值。問題是 CRT 已完成初始化之前您的應用程式取得呼叫 AllocConsole() 的機率 ; 控三個低 I/O 點 0、 1 和 2 已經被設定要使用原始歸 OS 控點,因此所有的 CRT I/O 會傳送至無效的 OS 控點,並 CRT 輸出並不會顯示在主控台。使用上面所述來消除這個問題的解決方案。

在從命令列,而 「 啟動 」 命令不開始 GUI 應用程式的情況下標準 OS 控點不正確歸,但是不正確地繼承自 CMD.EXE。當應用程式的 CRT 會初始化時,控三個低 I/O 點 0、 1 和 2 會初始化為使用應用程式繼承自 CMD.EXE 的三個控制代碼數字。當應用程式呼叫 AllocConsole() 時,主控台的初始化常式會嘗試取代主控台初始化認為是無效標準作業系統控制代碼值與有效的控制代碼值從新的主控台。由 coincidence,因為主控台的初始化常式傾向洩漏標準作業系統控制代碼相同的三個值主控台 initilization 會取代標準的作業系統控制代碼值與之前--繼承自 CMD.EXE 的有了相同的值。因此,CRT I/O 運作在這種情況下。

請務必瞭解使用 CRT 常式從 GUI 應用程式,從命令列執行的能力不是由設計讓這可能無法運作在未來版本的 Windows NT 或 Windows。在未來版本中,您可能需要因應措施不只是針對以"開始 < 應用程式名稱 >"啟動命令列上的應用程式還在 「 應用程式名稱 」 為命令列上啟動的應用程式。

屬性

文章編號: 105305 - 上次校閱: 2006年11月21日 - 版次: 4.2
這篇文章中的資訊適用於:
  • Microsoft Win32 Application Programming Interface?應用於:
    • 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
關鍵字:?
kbmt kbconsole kbinfo kbkernbase KB105305 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:105305
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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