子プロセス(DOS)の標準出力をパイプする
|
こんなんでどうでしょう?(↓)
CreatChildProcess('cmd.exe /c dir');
とやると、Memo1に"dir"の結果が表示されます(NT4.0では動きました)。
ただし、標準出力をリダイレクトしてしまっているので、DOS窓(コンソール)には、なにも表示されません(この例では、コンソールを表示しないようにしていますが、表示しても空のコンソールが表示されるだけです)。
どうしてもコンソールにも表示したい場合は、AllocateConnsoleAPIで自前でコンソールを作成して、Memo1に書く内容を自前で書くのかなぁ?
あとエラー処理等まるっきり省いていますのでご注意を。
function TForm1.CreatChildProcess(exec_name: AnsiString): Integer;
var
buf: array[0..4095] of Char;
hRead, hWrite: THandle;
SecAttrib: TSecurityAttributes;
StartInfo: TStartupInfo;
dwRead: DWORD;
begin
//
// 名前なしパイプの作成
//
FillChar(SecAttrib, SizeOf(SecAttrib), 0);
SecAttrib.nLength := SizeOf(SecAttrib);
SecAttrib.bInheritHandle := TRUE;
CreatePipe(hRead, hWrite, @SecAttrib, 0);
//
// 子プロセスを作成
//
FillChar(StartInfo, SizeOf(StartInfo), 0);
StartInfo.cb := SizeOf(StartInfo);
StartInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
StartInfo.hStdOutput := hWrite;
StartInfo.wShowWindow := SW_HIDE;
if not CreateProcess(Pointer(0),
PChar(exec_name),
Pointer(0), Pointer(0),
TRUE,
0,
Pointer(0), Pointer(0),
StartInfo, ProcInfo) then
begin
Result := -1;
Exit;
end;
WaitForInputIdle(GetCurrentProcess(), INFINITE);
CloseHandle(hWrite);
//
// Windows95ではこの部分で制御を返してくれなくなります。
// もうちょっとしたら対処法を書くつもり。
// いつになることやら。。。(--;
//
While ReadFile(hRead, buf, SizeOf(buf) - 1, dwRead, Nil) do
begin
if dwRead = 0 then
Break;
buf[dwRead] := #00;
Memo1.Lines.Add(buf);
Application.HandleMessage;
end;
CloseHandle(hRead);
Result := 0;
end;
[追記] Autch.net さんの tips にもソースが挙げられているとの情報を得ました。[Delphi-ML:79357]
Autch.net
http://hp.vector.co.jp/authors/VA026252/
GUI アプリからコンソールアプリを実行するには
http://hp.vector.co.jp/authors/VA026252/tips/delphi_anonymous_pipe.html |
|