Tietew です。

On Mon, 30 Jun 2003 15:06:30 +0900
In article <2...@ta-taki.tokyo-horei.co.jp>
[[vcpp 00060956] RE: popen()でのエラー取得]
"t...@tokyo-horei.co.jp" <t...@tokyo-horei.co.jp> wrote:

> si.hStdOutput = hFile;  // 標準出力
> si.hStdError = hFile;   // 標準エラー出力

> にファイルハンドルを指定していますが、
> これだとファイルに落ちてしまいます。
> ファイルに落とさず、出力結果を変数(char * , CStringなど)に
> 代入させてやることは出来ないのでしょうか?

CreatePipe で無名パイプを作って,書き込み側パイプを「継承可」フ
ラグをセットして複製 (DuplicateHandle) し,si.hStdOutput 等に代
入しておき,ReadFile で読み込むと普通のファイルっぽく読めます。

_read() を使いたいなら読み込み側パイプを _open_osfhandle() して
ファイル記述子を取得し,fread() 等を使いたいなら更に fdopen() す
ればよろし。

-----

// エラー処理してないので適切にすること。

HANDLE rh, wh0, wh;
CreatePipe(&rh, &wh0, NULL, 1024);
DuplicateHandle(GetCurrentProcess(), wh,
  GetCurrentProcess(), &wh0, 0, true, DUPLICATE_SAME_ACCESS);
CloseHandle(wh0);

STARTUPINFO si = { sizeof STARTUPINFO };
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = wh;
si.hStdError = wh;
PROCESS_INFORMATION pi;

CreateProcess(NULL, /*CommandLine*/, NULL, NULL, true,
  0, NULL, NULL, &si, &pi);
CloseHandle(wh);

while(ReadFile(rh, ...)) {
  // 読んだバッファで処理処理
}
if(GetLastError() != ERROR_BROKEN_PIPE) {
  // やばいエラー
}
// 子プロセスが終了した。

CloseHandle(rh);
CloseHandle(si.hThread);
CloseHandle(si.hProcess);


―[ Tietew ]――――――――――――――――――――――――――――
Mail: t...@tietew.net / t...@raug.net
Web : http://www.tietew.net/     Tietew Windows Lab.
PGP fingerprint: 26CB 71BB B595 09C4 0153  81C4 773C 963A D51B 8CAA