現在オフラインです。再接続するためにインターネットの接続を待っています

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

重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。

英語版 KB: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>
3.10 3.50 CRT 標準ハンドルをリダイレクトします。

警告: この記事は自動翻訳されています

プロパティ

文書番号:105305 - 最終更新日: 06/30/2011 07:29:00 - リビジョン: 6.0

  • kbinfo kbconsole kbkernbase kbmt KB105305 KbMtja
フィードバック