Delphi Tips 
-----------------------------

0115  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 1999/02/08 osamu rev 1.2
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 2003/11/21 osamu 編集
子プロセス(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
参照: [Delphi-ML:21973] [Delphi-ML:79357] <Windows>

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp