![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Ок. Спасибо за ответы
Тему можно считать закрытой |