Чтение выходного файла ShellExecute () в Delphi 2010? - PullRequest
3 голосов
/ 29 июня 2010

Я использую команду 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 перед выполнением этой команды. При каждом запуске моей программы входной файл меняется, как и выходной файл.

Проблема заключается в следующем: я не вижу изменений в выходном файле! Строка, записанная в консоли, относится к предыдущему файлу, а не к новому измененному. Я имею в виду, что файл в проводнике изменился, но файл, который я прочитал, все еще остается старым.

Это кажется немного странным, но мне было интересно, есть ли способ обновить выходной файл перед его чтением? Или я что-то здесь упускаю?

Спасибо заранее.

1 Ответ

11 голосов
/ 29 июня 2010

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 вы можете подождать, пока процесс завершит работу.

...