3

ShellExecuteコマンドを使用して、入力テキストファイルを取得して出力テキストファイルを返すexeファイルを実行します。私はそれをこのように書いた:

ShellExecute(mainFormHandle, 'open', 'Test.exe',
    'input.txt output.txt', nil, sw_shownormal);

//Read the output file...
S_List.LoadFromFile('output.txt');
Writeln(S_List[0])

このコマンドを実行する前に、input.txtファイルを提供します。プログラムを実行するたびに、入力ファイルが変更され、出力ファイルも変更されます。

問題はこれです:出力ファイルの変更を見ることができません!コンソールに書き込まれる行は前のファイルからのものであり、新しく変更されたファイルではありません。つまり、エクスプローラーのファイルは変更されていますが、読み取ったファイルはまだ古いファイルです。

少し奇妙に思えますが、出力ファイルを読み取る前に更新する方法はありますか?または私はここで何かが欠けていますか?

前もって感謝します。

4

1 に答える 1

11

ShellExecuteプログラムが作業を終了するのを待ちません。これが起こることです:

  • Test.exeが起動します
  • output.txtで読みます
  • Test.exeは新しいoutput.txtを書き込みます

次のようなものを試してください。

var
  StartUpInfo : TStartUpInfo;
  ProcessInfo : TProcessInformation;
  CreationFlags : Cardinal;
begin
  FillChar(StartUpInfo, SizeOf(TStartupInfo),0);
  StartupInfo.cb := SizeOf(TStartupInfo);
  CreationFlags := Normal_Priority_Class;

  if CreateProcess(nil, 'test.exe input.txt output.txt',
               nil, nil, False, CreationFlags,
               nil, 0, StartupInfo, ProcessInfo) then
  begin
    WaitforSingleObject(ProcessInfo.HProcess, INFINITE);
    CloseHandle(ProcessInfo.HProcess);

    //Read the output file...
    S_List.LoadFromFile('output.txt');
  end;

プロセスが作業を終了するまで待つことWaitForSingleObjectができます。

于 2010-06-29T13:49:18.340 に答える