実行結果を取得するには?


ボッター  2006-01-16 09:39:40  No: 19660  IP: 192.*.*.*

以下のようなプログラムを作成し、実行してみました。
------------------------
SetCurrentDir('D:\');
Result := ProgramExecute('C:\Program Files\Borland\CBuilder6\Bin\make /? > Report.txt');
------------------------
で呼び出したのですが Report.txt が作成されません。
Result は 0 で結果的には成功しているようです。
何か処理が必要なのでしょうか?

function ProgramExecute(CmdStr: String): Longword;
var
  SI:  TStartupInfo;
  PI:  TProcessInformation;
begin
  with SI do begin
    FillChar(SI, SizeOf(SI), 0);
    Cb      := SizeOf(SI);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := SW_HIDE;
  end;

  Result := WAIT_FAILED;
  if CreateProcess(Nil, PChar(CmdStr), Nil, Nil, False, 0, Nil, Nil, SI, PI) then begin
    WaitForSingleObject(PI.hProcess, INFINITE);
  GetExitCodeProcess(PI.hProcess, Result);
  CloseHandle(PI.hProcess);
  end else begin
    Result := $FFFFFFFF;
  end;
end;

編集 削除
deldel  2006-01-16 12:56:02  No: 19661  IP: 192.*.*.*

PChar(CmdStr) を、
PChar('command.com /c ' + CmdStr) にすると良いのではないかと思いますが・・・

編集 削除
さらに  2006-01-16 13:33:20  No: 19662  IP: 192.*.*.*

>Result := ProgramExecute('C:\Program Files\Borland\CBuilder6\Bin\make /? > Report.txt');
スペースを含むPATHはダブルクォ−テーションで囲む。
Result := ProgramExecute('"C:\Program Files\Borland\CBuilder6\Bin\make" /? > Report.txt');

編集 削除
ボッター  2006-01-16 14:43:49  No: 19663  IP: 192.*.*.*

ありがとうございます。

早速試してみました。
deldelさんのとおり
'command.com /c ' を追加しました。
空の  Report.txt ができました。
中身がありません。

さらにさんのように " でくくってみました。
CreateProcess で True が返ってこず
このFunction からは $FFFFFFFF がリターンされます。

以下のように変更しただけですけどどこに間違いが?
Result := ProgramExecute('"command.com /c C:\Program Files\Borland\CBuilder6\Bin\make" /? > Report.txt');

編集 削除
間違い探し  2006-01-16 14:57:25  No: 19664  IP: 192.*.*.*

>以下のように変更しただけですけどどこに間違いが?
>Result := ProgramExecute('"command.com /c C:\Program Files\Borland\CBuilder6\Bin\make" /? > Report.txt');

IQサプリ初級の間違い探し
Result := ProgramExecute('command.com /c "C:\Program Files\Borland\CBuilder6\Bin\make" /? > Report.txt');

編集 削除
ボッター  2006-01-16 15:03:27  No: 19665  IP: 192.*.*.*

間違い探しさんへ、
実はそれも、試してたりして・・・

結果は、0バイトの Report.txt が出力されるんですよね・・・
'"command.com /c C:\Program Files\Borland\CBuilder6\Bin\make" /? > Report.txt'
'command.com /c "C:\Program Files\Borland\CBuilder6\Bin\make" /? > Report.txt'
'command.com /c "C:\Program Files\Borland\CBuilder6\Bin\make /?" > Report.txt'
'command.com /c "C:\Program Files\Borland\CBuilder6\Bin\make /? > Report.txt"'
いずれも、だめでした。

編集 削除
ボッター  2006-01-16 15:09:54  No: 19666  IP: 192.*.*.*

今回の場合に限っては、パスが設定されているので・・・
'command.com /c make /? > Report.txt'
これでできました。
でも、実際にはパス通っていないので問題です・・・・・
と、いいつつこれも
'command.com /c C:\Progra~1\Borland\CBuild~1\Bin\make /? > Report.txt'
にて、実行できました。

さて、そこで・・・なのですが、ディレクトリ
「'C:\Progra~1\Borland\CBuild~1\Bin'」のこの部分を
「C:\Program Files\Borland\CBuilder6\Bin」から求めるには
どうすればよいのでしょうか?
私が知っているのは、ひとつずつ区切っていって、
FindFirst,FindNext で求めるしか手はないのでしょうか?
それとも標準関数ってありますか?

編集 削除
ボッター  2006-01-16 15:11:29  No: 19667  IP: 192.*.*.*

もちろん、短いディレクトリ名でなくても長いディレクトリ名を
使ってできる方法があれば、
後々プログラムを作成する上ではそちらの方が都合がいいのですが

編集 削除
ハリポタも千里眼にあらず  2006-01-16 15:18:23  No: 19668  IP: 192.*.*.*

>実はそれも、試してたりして・・・
Result := ProgramExecute('command.com /c "C:\Program Files\Borland\CBuilder6\Bin\make" /? > Report.txt');
これでうまくいかないなら、原因は別の場所。自分で探すべし。

編集 削除