Запуск программ и ожидание завершения

25.07.2010
4
0
#1
Знаю про существование гугла, и что подобная тема в интернете разжевана донельзя, но требуется конкретный код.
Есть компонент RzCheckTree из пачки Raize (древовидный список с "галочками"; и просьба, не говорите, что на WinAPI можно сделать так же и с простым TreeView). В цикле читается информация о файлах *.ехе, которые необходимо запустить в цикле. В списке отмечаются нужные пункты, по кнопке запускается цикл, где читаются пути к файлам, и эти самые exe-шники запускаются. После завершения работы одного, запускается другой exe-шник, и так далее до конца списка. При этом, после завершения работы приложения необходимо узнать код возврата (GetExitCodeProcess). Мой не совсем рабочий код обработчика нажатия кнопки:
Код:
var si:StartupInfo;
pi:TProcessInformation;
ExitCode: Cardinal;
sections_count, strings_count: Integer;
File_Path: string;
MyIni: TIniFile;
IniSections, IniStrings: TStringList;
begin
try
MyIni:= tinifile.create(extractfilepath(application.ExeName) + '\MyIni.ini');
for Sections_count:=1 to RzCheckTree1.Items.Count-1 do
for Strings_count:=1 to RzCheckTree1.Items.Count-1 do
begin
with si do
begin
ZeroMemory(@si,sizeof(si));
cb:=SizeOf(si);
dwFlags:=startf_UseShowWindow;
wShowWindow:=sw_ShowNormal;
end;
MyIni.readstring(IniSections.Strings[sections_count],IniStrings.Strings[strings_count],File_Path);
CreateProcess(nil,pchar(extractfilepath(application.ExeName)+File_Path),nil,nil,false,0,nil,nil,si,pi)
WaitForSingleObject(pi.hProcess,INFINITE);
GetExitCodeProcess(pi.hprocess,ExitCode);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
except
ShowMessage('Запуск не удался! Путь: ' +File_Path);
end;
end;
Проблема в том, что не могу правильно организовать/объявить цикл. И мне кажется, путь, по которому тут идет обращение к файлу, не тот, который требуется.
Состав INI:
[секция/группа_в_списке]
путь1=С:\MyProg1.exe
путь2=С:\MyProg2.exe
и т.д.

P.S.: чувствую, из-за Raize'а у вас могут возникнуть заминки. И тем не менее, прошу хотя бы указать на мои ошибки в циклах :welcome:
 

sinkopa

Well-known member
17.06.2009
344
4
#2
...
Проблема в том, что не могу правильно организовать/объявить цикл.
...
Нет... проблема не в этом.
Вглядитесь пристально вот в эту строчку:
Код:
 MyIni.readstring(IniSections.Strings[sections_count],IniStrings.Strings[strings_count],File_Path);
Метод
Код:
MyIni.readstring
Это функция возвращающая строку...
Если вы надеялись что она заполнит вам переменную File_Path то вы жестоко ошиблись... :(

и эту:
Код:
  CreateProcess(nil,pchar(extractfilepath(application.ExeName)+File_Path),nil,nil,false,0,nil,nil,si,pi)
WaitForSingleObject(pi.hProcess,INFINITE);
Если application.ExeName к примеру = "c:\Myprog\myprog.exe",
а File_Path (который Вы надеюсь когда нибудь получите таки) = "c:\Myprog2\myprog2.exe"

То (судя по вашему коду) CreateProcess попытается запустить файл с именем "c:\Myprog\c:\Myprog2\myprog2.exe" :huh:

Пиво было не свежим? ;)