![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Задача запуск 2 программ. Запускаем первую программу с параметрами, ждем ее окончания, и только потом запускаем вторую. Заново написаный код.
Код:
program Project1; uses Winapi.Windows, System.SysUtils; {$R *.res} function RunApp (const ProgName, ProgParams: String; RunWait:Boolean): boolean; Var StartInf: TStartupInfo; ProcInf: TProcessInformation; begin ZeroMemory(@StartInf,sizeof(StartInf)); StartInf.cb:=SizeOf(StartInf); Result:=CreateProcess(nil, PChar('"' + ProgName + '" ' + ProgParams), nil, nil, False, 0, nil, nil, StartInf, ProcInf); CloseHandle(ProcInf.hThread); If RunWait then WaitForSingleObject(ProcInf.hProcess, INFINITE ); CloseHandle(ProcInf.hProcess); end; begin if not RunApp('C:\Windows\System32\notepad.exe','D:\1.txt', True) then exit; if not RunApp('C:\Windows\System32\notepad.exe','D:\2.txt', False) then exit; end. Просьба оценить, есть ли какие-то ошибки в коде? |
#2
|
||||
|
||||
![]() Если Вы опишите задачу более подробно, то, возможно, я смогу Вам чем-либо помочь. Алгоритм данного кода меня, честно говоря, смущает.
Особенно вот эта функция, результат которой Вы даже не обрабатываете: WaitForSingleObject(ProcInf.hProcess, INFINITE ); Если результат выполнения первой программы используется во второй программе, то Вам просто необходимо "узнать" всё ли прошло успешно. |
#3
|
|||
|
|||
![]() Смысл такой. Написанная программа (лаунчер) запускает одно приложение с параметрами, ждет его завершение и после этого запускает второе приложение также с параметрами. Если не запустилось любое приложение, то просто лаунчер закрывается не вызывая никаких окон. Обработка и анализ кодов ошибок и тп не нужен. Т.е. запустил ОК, нет файла, какая-то ошибка и тп, просто закрывается не говоря ничего
|
#4
|
||||
|
||||
![]() Код:
function RunProgram(name, params: string; runWait: boolean; waitTime: cardinal): boolean; var startInf : TStartupInfo; procInf : TProcessInformation; exitCode : cardinal; begin FillChar(startInf, SizeOf(TStartUpInfo), 0); startInf.cb := SizeOf(TStartUpInfo); try result := CreateProcess(nil, PChar('"' + name + '" ' + params), nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, startInf, procInf ); except result := false; end; if result and runWait then with procInf do begin if waitTime = 0 then WaitforSingleObject(hProcess, INFINITE) else WaitforSingleObject(hProcess, waitTime); result := GetExitCodeProcess(hProcess, exitCode); CloseHandle(hThread); CloseHandle(hProcess); end; end; begin if not RunProgram('C:\Windows\System32\notepad.exe','D:\1.txt', true, 5000) then exit; RunProgram('C:\Windows\System32\notepad.exe','D:\2.txt', false, 0); end; и всё-таки Вам необходимо дождаться выполнения первой программы... Есть два выхода: 1) ждать пока программа сама закроется(рискуем повиснуть) и 2) дать время на выполнение программы, после чего продолжать свои действия. Последний раз редактировалось Alex_4444, 24.12.2014 в 19:31. |
#5
|
|||
|
|||
![]() Ок. Спасибо за ответы
![]() |