Я использую команду 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 перед запуском этой команды. В каждом запуске моей программы входной файл изменяется, а также выходной файл.
Проблема заключается в следующем: я не вижу изменений в выходном файле! Строка, написанная на консоли, относится к предыдущему файлу, а не к новой. Я имею в виду, что файл в проводнике изменен, но файл, который я прочитал, по-прежнему является старым файлом.
Кажется немного странным, но мне было интересно, есть ли способ обновить выходной файл перед его чтением? Или я чего-то не хватает?
Заранее спасибо.
Спасибо за ваш ответ. Я включил его в свой проект, но это дает мне это исключение: Первое исключение случайности в $ 75819617. Класс исключения EAccessViolation с сообщением «Нарушение доступа по адресу 75BB9783 в модуле« kernel32.dll ». Запись адреса 004F70C2 ' Вы хоть представляете, в чем проблема? Я здесь полностью потерян! – Mahm00d
В Delphi 2010 используется Unicode-версия CreateProcess() (также называемая CreateProcessW()). НЕ передавайте строковые литералы в CreateProcessW()! MSDN говорит, что он может изменить входную строку, что было бы очень плохо (как вы уже обнаружили). Сначала вам нужно назначить свой литерал для переменной String, связанной с эталоном, например: var S: String; S: = 'test.exe input.txt output.txt'; UniqueString (S); если CreateProcess (nil, PChar (S), ...); –
Большое спасибо Remy! Ты сделал мой день, мужик. Оно работало завораживающе! Через миллион лет я бы не догадался, что это была проблема! Я ненавижу исключения Дельфы! Я никогда не понимаю, о чем они говорят. – Mahm00d