Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


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 в 19:15. Причина: Добавил обработку ошибок

Это сообщение посчитали полезным следующие участники:

Отправлено: 02:17, 22-08-2015 | #2