Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.12.2014, 11:01
AlexeyTG AlexeyTG вне форума
Прохожий
 
Регистрация: 17.12.2014
Сообщения: 7
Версия Delphi: Delphi XE7
Репутация: 10
По умолчанию Рабочий код, просьба оценить "корявость" v3

Задача запуск 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  
Старый 23.12.2014, 15:58
Аватар для Alex_4444
Alex_4444 Alex_4444 вне форума
Прохожий
 
Регистрация: 22.12.2014
Сообщения: 14
Версия Delphi: XE5
Репутация: 50
По умолчанию

Если Вы опишите задачу более подробно, то, возможно, я смогу Вам чем-либо помочь. Алгоритм данного кода меня, честно говоря, смущает.
Особенно вот эта функция, результат которой Вы даже не обрабатываете:

WaitForSingleObject(ProcInf.hProcess, INFINITE );

Если результат выполнения первой программы используется во второй программе, то Вам просто необходимо "узнать" всё ли прошло успешно.
Ответить с цитированием
  #3  
Старый 24.12.2014, 10:07
AlexeyTG AlexeyTG вне форума
Прохожий
 
Регистрация: 17.12.2014
Сообщения: 7
Версия Delphi: Delphi XE7
Репутация: 10
По умолчанию

Смысл такой. Написанная программа (лаунчер) запускает одно приложение с параметрами, ждет его завершение и после этого запускает второе приложение также с параметрами. Если не запустилось любое приложение, то просто лаунчер закрывается не вызывая никаких окон. Обработка и анализ кодов ошибок и тп не нужен. Т.е. запустил ОК, нет файла, какая-то ошибка и тп, просто закрывается не говоря ничего
Ответить с цитированием
  #4  
Старый 24.12.2014, 18:41
Аватар для Alex_4444
Alex_4444 Alex_4444 вне форума
Прохожий
 
Регистрация: 22.12.2014
Сообщения: 14
Версия Delphi: XE5
Репутация: 50
По умолчанию

Код:
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  
Старый 26.12.2014, 12:07
AlexeyTG AlexeyTG вне форума
Прохожий
 
Регистрация: 17.12.2014
Сообщения: 7
Версия Delphi: Delphi XE7
Репутация: 10
По умолчанию

Ок. Спасибо за ответы Тему можно считать закрытой
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:27.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025