2010-06-29 3 views
3

Я использую команду ShellExecute для запуска exe-файла, который получает входной текстовый файл и возвращает выходной текстовый файл. Я написал это вот так:Чтение выходного файла ShellExecute() в Delphi 2010?

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

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

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

Заранее спасибо.

ответ

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

+0

Спасибо за ваш ответ. Я включил его в свой проект, но это дает мне это исключение: Первое исключение случайности в $ 75819617. Класс исключения EAccessViolation с сообщением «Нарушение доступа по адресу 75BB9783 в модуле« kernel32.dll ». Запись адреса 004F70C2 ' Вы хоть представляете, в чем проблема? Я здесь полностью потерян! – Mahm00d

+0

В Delphi 2010 используется Unicode-версия CreateProcess() (также называемая CreateProcessW()). НЕ передавайте строковые литералы в CreateProcessW()! MSDN говорит, что он может изменить входную строку, что было бы очень плохо (как вы уже обнаружили). Сначала вам нужно назначить свой литерал для переменной String, связанной с эталоном, например: var S: String; S: = 'test.exe input.txt output.txt'; UniqueString (S); если CreateProcess (nil, PChar (S), ...); –

+0

Большое спасибо Remy! Ты сделал мой день, мужик. Оно работало завораживающе! Через миллион лет я бы не догадался, что это была проблема! Я ненавижу исключения Дельфы! Я никогда не понимаю, о чем они говорят. – Mahm00d

Смежные вопросы