Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] запуск программы с параметрами и ожидание ее закрытия (http://forum.oszone.net/showthread.php?t=304319)

muslimdogger 21-08-2015 20:41 2544528

запуск программы с параметрами и ожидание ее закрытия
 
при втором условии ожидается код на запуск exe c параметрами, понял что нужно делать через CreateProcess, но никак не могу написать это. не могли бы вы помочь?

opel431 22-08-2015 02:17 2544579

CreateProcess, - можно так

Код:

function ExecAndWait(const aFilename: string; const AParams: string = ''; const AWndState:
  Boolean = False; const ADir: string = ''): Boolean;
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: string;
begin
  FillChar(StartInfo, SizeOf(StartInfo), 0);
  FillChar(ProcInfo, SizeOf(ProcInfo), 0);
  StartInfo.cb := SizeOf(StartInfo);

  // показывать окно используя настройки параметра wShowWindow и курсор в форме песочных часов 2 секунды
  StartInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;

  // отображение окна выполнения
  if AWndState = True then
    StartInfo.wShowWindow := SW_SHOWNORMAL
  else
    StartInfo.wShowWindow := SW_HIDE;

  // форматирование командной строки с обрамлением двойными кавычками имени файла
  CmdLine := Format('"%s" %s', [aFilename, AParams]);

  // после вызова процедуры на строку CmdLine будет ссылаться только один указатель
  {$IFDEF UNICODE}
  UniqueString(CmdLine); // передаем CmdLine как уникальную строку
  {$ENDIF}

  //** обрабатывать ошибки вызова функции (Win32Check)
  {$WARN SYMBOL_PLATFORM OFF}
  result := Win32Check(CreateProcessW(PChar(aFilename), PChar(CmdLine), nil, nil, False,
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, PChar(ADir), StartInfo, ProcInfo));
  {$WARN SYMBOL_PLATFORM ON}
  if result then
  begin
    while WaitForSingleObject(ProcInfo.hProcess, 100) <> WAIT_OBJECT_0 do
      Application.ProcessMessages;

    //** обрабатывать ошибки вызова функции (Win32Check)
    {$WARN SYMBOL_PLATFORM OFF}
    Win32Check(CloseHandle(ProcInfo.hProcess));
    Win32Check(CloseHandle(ProcInfo.hThread));
    {$WARN SYMBOL_PLATFORM ON}
  end;
end;

  {** функция Win32Check конвертирует код ошибки в исключение. Т.е. при возбуждение
  исключения код дальше будет пропущен, а управление будет передано на ближайший обработчик
  ошибок, по умолчанию это объект Application. Функцию обернем директивой ($WARN SYMBOL_PLATFORM)
  для подавления сообщения о специфической платформе этой функции}


opel431 24-08-2015 18:32 2545447

В код добавлена обработка ошибок при вызове функции.
По большому счету, необходимо еще две функции - проверять валидность имени файла и получение полного пути к текущему командному процессору!
Да, в наше время с детства учили быть вежливыми, в части Спасибо и Пожалуйста!

muslimdogger 24-08-2015 23:20 2545621

opel431 спасибо за то что отозвались. я в тему давно не заглядывал, тк отметил ее решенной и забыл


Время: 21:49.

Время: 21:49.
© OSzone.net 2001-