情報: GUI アプリケーションからの出力の CRT ルーチンの呼び出し

文書翻訳 文書翻訳
文書番号: 105305
すべて展開する | すべて折りたたむ

概要

C ランタイムを使用するには、と、GUI から、printf() などのルーチンを出力します。アプリケーションは、コンソールを作成するために必要です。Win32 アプリケーションプログラミング インターフェイス (API) AllocConsole() をコンソールを作成します。CRT出力がすぐに表示されるようにするには、バッファー処理ルーチン setvbuf() を削除します。

GUI アプリケーションはコマンド ・ ラインから実行される場合は、この方法は有効かファイル マネージャーから。場合は、アプリケーションでただし、この方法が機能しません。プログラム マネージャーから、または、"start"コマンドを使用して開始します。次に、コードはこの問題を回避する方法を示しています。
   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() などなど。同じ手順を使用してください。stdin と stderr。

このコードをハンドル 0、1、および 2 の問題を修正しないことに注意してください。で実際、その他の問題、ためがないこれを修正することが可能としたがって、ストリーム I/O の代わりに低レベルの I/O を使用する必要です。

詳細

"Start"コマンドで、3 つの GUI アプリケーションの開始時標準的な OS ハンドル、STD_INPUT_HANDLE、STD_OUTPUT_HANDLE とSTD_ERROR_HANDLE はすべて「ゼロ アウト」によって、コンソールの初期化ルーチン。これら 3 つのハンドルが置き換えられますが有効な場合値は、GUIアプリケーション AllocConsole() を呼び出します。そのため、この作業が終わったらを呼び出すGetStdHandle() は常に有効なハンドルの値を返します。問題があります。アプリケーションを取得する前に、CRT が初期化が完了した、AllocConsole() を呼び出す可能性があります。次の 3 つ少ない I/O ハンドル 0、1、および 2 があります。既にオリジナルすべて CRT、OS ハンドルをゼロに設定を使用する設定されて無効な OS ハンドルに I/O を送信し、CRT の出力に表示されない、コンソール。この問題を解決するのには、上記の回避策を使用します。

GUI アプリケーションを起動せずにコマンド ・ ラインからの場合"start"コマンドは OS ハンドルが正しく埋めるされていない標準CMD. を正しく継承されますが、EXE。場合は、アプリケーションを CRT の初期化は、次の 3 つ少ない I/O ハンドル 0、1、および 2 を使用して初期化されます。アプリケーションから CMD. を継承する次の 3 つのハンドル数EXE。時アプリケーションが AllocConsole() をコンソール ルーチンを呼び出す無効であるとの認識は、コンソールの初期化を交換しようとしてください。値の有効なハンドル値を新しいコンソールで標準的な OS を処理します。で偶然、コンソールの初期化ルーチン提供する傾向があるため同じ 3 つの値を標準的な OS のハンドル、コンソール初期化の標準的な OS ハンドルの値が同じで置き換えられます前に: がない値もの CMD. を継承します。EXE。そのため、CRT の I/O にいても動作します。

されることを理解することが重要です CRT ルーチンは、gui を使用することこのことはできませんので、コマンドラインから実行するアプリケーション仕様でした。後で Windows NT や Windows のバージョンを扱います。将来のバージョンで、この回避策だけではなくアプリケーションのコマンドを起動する必要があります。行の"start<application name="">"がアプリケーションの起動コマンド ・ ラインで「アプリケーション名」。</application>

プロパティ

文書番号: 105305 - 最終更新日: 2011年6月30日 - リビジョン: 6.0
キーワード:?
kbinfo kbconsole kbkernbase kbmt KB105305 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:105305
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

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