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

Тема в разделе "Delphi - FAQ", создана пользователем AnthonySoprano, 5 мар 2011.

  1. AnthonySoprano

    AnthonySoprano New Member

    Регистрация:
    25 июл 2010
    Сообщения:
    4
    Симпатии:
    0
    Знаю про существование гугла, и что подобная тема в интернете разжевана донельзя, но требуется конкретный код.
    Есть компонент RzCheckTree из пачки Raize (древовидный список с "галочками"; и просьба, не говорите, что на WinAPI можно сделать так же и с простым TreeView). В цикле читается информация о файлах *.ехе, которые необходимо запустить в цикле. В списке отмечаются нужные пункты, по кнопке запускается цикл, где читаются пути к файлам, и эти самые exe-шники запускаются. После завершения работы одного, запускается другой exe-шник, и так далее до конца списка. При этом, после завершения работы приложения необходимо узнать код возврата (GetExitCodeProcess). Мой не совсем рабочий код обработчика нажатия кнопки:
    Код (Delphi):
    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:
     
  2. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Нет... проблема не в этом.
    Вглядитесь пристально вот в эту строчку:
    Код (Delphi):
     MyIni.readstring(IniSections.Strings[sections_count],IniStrings.Strings[strings_count],File_Path);
    Метод
    Код (Delphi):
    MyIni.readstring
    Это функция возвращающая строку...
    Если вы надеялись что она заполнит вам переменную File_Path то вы жестоко ошиблись... :(

    и эту:
    Код (Delphi):
      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:

    Пиво было не свежим? ;)
     
Загрузка...

Поделиться этой страницей