EntryNavi : « ThinkPadシリーズのD2D領域復帰方法 | メイン | VBでODBC接続 »

CategoryNavi : メイン -> コンピューター -> 開発 -> C/C++

Win32APIで標準出力をリダイレクトする方法

意外と良い解説がみつからないのでメモしておきます。
ちゃんと読んで試せばすぐできるんですが・・・。

ポイントが2つあります。
ファイルを開く時に、SECURITY_ATTRIBUTES構造体を使用して、新しいプロセスが作成される時にオブジェクトのハンドルが継承されるよう指定します。
プロセスを起動するときに、STARTUPINFO構造体で、dwFlags=STARTF_USESTDHANDLESとしてhStdOutputにファイルハンドルを指定する
の、2つです。

以下、サンプルです。

HANDLE hFile;
SECURITY_ATTRIBUTES sa;
STARTUPINFO si;
PROCESS_INFORMATION pi;

//リダイレクト先のファイルを開く
ZeroMemory( &sa, sizeof(sa) );
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE; //TRUEでハンドルを引き継ぐ
hFile = CreateFile(".\\stdout.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,&sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

//標準入出力の指定
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = stdin;
si.hStdOutput = hFile;
si.hStdError = hFile;
ZeroMemory( &pi, sizeof(pi) );

//任意のプログラムを別のプロセスで起動する
if(!CreateProcess( NULL, "dir", NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi )){

//エラー処理

}

//起動したプロセスの終了を待つ
WaitForSingleObject( pi.hProcess, INFINITE );

//ハンドルを閉じる
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
CloseHandle(hFile);

<Category : C/C++>

検索

Google

サイドフィード

track feed 理ろぐ
人気ブログランキング - 理ろぐ
Powered by
Movable Type 3.34