以下のようなプログラムを作成し、実行してみました。
------------------------
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;
PChar(CmdStr) を、
PChar('command.com /c ' + CmdStr) にすると良いのではないかと思いますが・・・
>Result := ProgramExecute('C:\Program Files\Borland\CBuilder6\Bin\make /? > Report.txt');
スペースを含むPATHはダブルクォ−テーションで囲む。
Result := ProgramExecute('"C:\Program Files\Borland\CBuilder6\Bin\make" /? > Report.txt');
ありがとうございます。
早速試してみました。
deldelさんのとおり
'command.com /c ' を追加しました。
空の Report.txt ができました。
中身がありません。
さらにさんのように " でくくってみました。
CreateProcess で True が返ってこず
このFunction からは $FFFFFFFF がリターンされます。
以下のように変更しただけですけどどこに間違いが?
Result := ProgramExecute('"command.com /c C:\Program Files\Borland\CBuilder6\Bin\make" /? > Report.txt');
>以下のように変更しただけですけどどこに間違いが?
>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');
間違い探しさんへ、
実はそれも、試してたりして・・・
結果は、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"'
いずれも、だめでした。
今回の場合に限っては、パスが設定されているので・・・
'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 で求めるしか手はないのでしょうか?
それとも標準関数ってありますか?
もちろん、短いディレクトリ名でなくても長いディレクトリ名を
使ってできる方法があれば、
後々プログラムを作成する上ではそちらの方が都合がいいのですが
>実はそれも、試してたりして・・・
Result := ProgramExecute('command.com /c "C:\Program Files\Borland\CBuilder6\Bin\make" /? > Report.txt');
これでうまくいかないなら、原因は別の場所。自分で探すべし。
ツイート | ![]() |