• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы AnthonySoprano
  • Дата начала
A

AnthonySoprano

Знаю про существование гугла, и что подобная тема в интернете разжевана донельзя, но требуется конкретный код.
Есть компонент 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:
 
S

sinkopa

...
Проблема в том, что не могу правильно организовать/объявить цикл.
...
Нет... проблема не в этом.
Вглядитесь пристально вот в эту строчку:
Код:
 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:

Пиво было не свежим? ;)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!