Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Срочно! Запуск EXE и BAT файлов, Запуск EXE и BAT файлов из Delphi 
:(
    Опции темы
Daiver
Дата 9.7.2003, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.6.2003
Где: Латвия

Репутация: нет
Всего: нет



ПОМОГИТЕ ПОЖАЛУЙСТА!

Я запускаю CreatePRocess-ом exe или bat файл, если файл успешно отработал, запускается следующий, если обнаружена ошибка, программа должна выйти. Как обнаружить ошибку? Кроме того когда файл отработал, его надо закрыть. Я воспользовался TerminateProcess, но bat файл программа не закрывает, что сделать?

Заранее благодарен, дайте пожалуйста любые варианты.
PM MAIL ICQ   Вверх
Alex
Дата 10.7.2003, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 6
Всего: 162



Код
uses
  Windows, Classes, SysUtils, acConst;

resourcestring
  warProcessFinally = 'Процесс принудительно завершен.';

type
  eStartExecuteCommand = class(Exception);
type
  tIdleProc = procedure (var KillProcess :Boolean);
  tApMsg    = procedure ();

function WaitExecuteCommand  (const CmdLine       :String;
                              const WorkDirectory :String;
                              const ShowMode      :Integer   =SW_SHOWNORMAL;
                              const IdleProc      :tIdleProc =Nil;
                              const ProcessMsg    :tApMsg    =Nil
                              ) :Cardinal;

implementation

function StartExecuteCommand (const CmdLine       :String;
                              const WorkDirectory :String;
                              const ShowMode      :Integer =SW_SHOWNORMAL
                              ) :tHandle;
const
  CreationFlags = CREATE_NEW_CONSOLE + NORMAL_PRIORITY_CLASS;
  StartupFlags  = STARTF_USESHOWWINDOW + CREATE_SEPARATE_WOW_VDM;
var
  StartUpInfo   :tStartUpInfo;
  ProcessInfo   :tProcessInformation;
  pDir          :pChar;
begin
  {CreateProcess возвращает ошибку, если ему передать пустую строку в WorkDir,
   в этом случае надо передавать Nil}
  if  Length(WorkDirectory) = 0  then
    pDir := Nil
  else
    pDir := pChar(WorkDirectory);

  FillChar(StartupInfo,Sizeof(StartupInfo),#0);
  StartupInfo.cb          := Sizeof(StartupInfo);
  StartupInfo.dwFlags     := StartupFlags;
  StartupInfo.wShowWindow := ShowMode;

  if not CreateProcess(Nil,pChar(CmdLine),Nil,Nil,false,CreationFlags,nil,
                                    pDir,StartupInfo,ProcessInfo)  then
    raise eStartExecuteCommand.Create(SysErrorMessage(GetLastError()));
  Result := ProcessInfo.hProcess;
end;


function WaitExecuteCommand  (const CmdLine       :String;
                              const WorkDirectory :String;
                              const ShowMode      :Integer   =SW_SHOWNORMAL;
                              const IdleProc      :tIdleProc =Nil;
                              const ProcessMsg    :tApMsg    =Nil
                              ) :Cardinal;
const
  SuspendTime = 200; // время (в милисекундах) на которое вызывающий процесс
                     //    приостанавливается в цикле ожидания
var
  hProcess :tHandle;
  KillProcess   :Boolean;
  ProcessKilled :Boolean;
begin
  // запуск процесса
  hProcess := StartExecuteCommand(CmdLine,WorkDirectory,ShowMode);
  // процесс успешно запущен, ждём завершения
  KillProcess   := False;
  ProcessKilled := False;
  repeat
    if  Assigned(ProcessMsg) then ProcessMsg;
    KillProcess := ProcessKilled;
    if  Assigned(IdleProc) then  IdleProc(KillProcess);
    if  (KillProcess {or Application.Terminated}) and  not ProcessKilled  then begin
      TerminateProcess(hProcess,ERROR_PROCESS_ABORTED);
      ProcessKilled := True;
    end;
  until (WaitforSingleObject(hProcess,SuspendTime)<>WAIT_TIMEOUT);
  if  ProcessKilled  then
    raise eStartExecuteCommand.Create(warProcessFinally);
  // узнаем код завершения процесса
  if  not GetExitCodeProcess(hProcess,Result)  then
    // Хм, Ошибка? Что-бы это могло быть?
    raise eStartExecuteCommand.Create(SysErrorMessage(GetLastError()));
end;


Это сообщение отредактировал(а) p0s0l - 29.9.2005, 13:07


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Daiver
Дата 11.7.2003, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.6.2003
Где: Латвия

Репутация: нет
Всего: нет



Дело в том, что прорамма не находит ошибку, даже если exe-шник запускается с ошибкой, она рассматривает его, как нормальный процесс, что сделать?
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0587 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.