意外と良い解説がみつからないのでメモしておきます。
ちゃんと読んで試せばすぐできるんですが・・・。
ポイントが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);