Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Завершение внешнего приложения в случае ошибки


YDS ©   (2005-12-07 09:47:00) 

Подскажите, как при запуске внешнего приложения в Delphi в случае его некорректного завершения тихо прибить его (подавить появление окна с ошибкой и звукового сигнала).
Если подробнее, то задача в следующем. Из моего приложения запускается утилита конвертации графических файлов. При этом если графический файл имеет неправильную структуру, то эта утилита «падает» с ошибкой. Утилиту из своего приложения запускаю стандартно:

cmdl :='util.exe cmdline’ // командная строка
Createprocess(nil,pchar(cmdl),nil,nil,false,Create_default_error_mode,nil,nil,si,p);
Waitforsingleobject(p.hProcess,infinite);


Leonid Troyanovsky   (2005-12-07 14:55:00) [1]


> YDS   (07.12.05 14:41) [9]


> То есть стандартными средствами Delphi это сделать невозможно?

Таких средств нет и у других языков.

Если оная утилита оконная, то можно было бы установить хук
на поток запускаемого процесса (p.dwThreadId) и следить за созданием
в нем окон, и в случае появления окна требуемого класса (GetClassName)
прибивать процесс.

Установку хука следует делать после WaitForInputIdle.

> на этом и бесконечно висит на Waitforsingleobject(p.hProcess,
> 5000);

Не бесконечно, а 5 сек.

--
Regards, LVT.


Alexander Panov   (2005-12-07 14:49:00) [2]

Вот пример поиска и ожидания:

    ShellExecute(0,'open','y:\load\cnp\CNP.lnk',nil,nil,SW_SHOWNORMAL);
   repeat
     SLeep(1000);  //ждем загрузки программы.
     h:= FindWindow (nil,'Welcome to CNP');
   until h<>0;


Вот примерно так и ищешь.

В цикле же проверяешь, закончился процесс или нет.

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


Alexander Panov   (2005-12-07 14:43:00) [3]

YDS   (07.12.05 14:41) [9]
То есть стандартными средствами Delphi это сделать невозможно?


У тебя что - заголовки все время разные?


YDS   (2005-12-07 14:41:00) [4]


> > А можно ли заполучить хэндл окна, которое порождает это
>
> > внешнее приложение?
>
> Конечно.
> Для начала надо определить заголовок окна любой программой,
>  которая может это сделать. Напрмер Spy++ или подобными...
>

То есть стандартными средствами Delphi это сделать невозможно?

P.S. Интересно, что конструкция
Waitforsingleobject(p.hProcess,5000);
TerminateProcess(p.hProcess,0);

у меня не работает - процесс, когда выдает ошибку, стопорится на этом и бесконечно висит на Waitforsingleobject(p.hProcess,5000);


Alexander Panov   (2005-12-07 12:15:00) [5]


> А можно ли заполучить хэндл окна, которое порождает это
> внешнее приложение?

Конечно.
Для начала надо определить заголовок окна любой программой, которая может это сделать. Напрмер Spy++ или подобными.
Затем  - в своей программе - FindWindow


YDS   (2005-12-07 11:24:00) [6]

А можно ли заполучить хэндл окна, которое порождает это внешнее приложение?


Alexander Panov   (2005-12-07 11:02:00) [7]


> Быть может отлавливать появлением самого окна с ошибкой
> и потом его уже прибить. Но вот как это эффективно реализовать
> увы, не знаю (ведь заголовок у этого окна может быть разным
> в зависимости от того, русские или нет Винды).


В случае разной локализации вариантов всего 2, наверное? Их можно и обрабатывать вроде бы как это не проблема найти соответствующее окно;)


YDS   (2005-12-07 10:59:00) [8]

Я же там написал, что:
1. вариант не прокатывает (для того и выложил сюда эту утилитку)
2. что топик перенес сюда.

Быть может отлавливать появлением самого окна с ошибкой и потом его уже прибить. Но вот как это эффективно реализовать увы, не знаю (ведь заголовок у этого окна может быть разным в зависимости от того, русские или нет Винды).


Alexander Panov   (2005-12-07 10:33:00) [9]

Может быть стоит следить за своими ветками внимательнее?
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1133898381&n=3


YDS   (2005-12-07 10:32:00) [10]

Up


YDS   (2005-12-07 10:02:00) [11]

Утилитка таких параметров не имеет.
Собственно вот она сама: http://www.yds.nm.ru/Symbian/Img/BmConv_err.RAR(39 КБайт) - в архиве также имеется командная строка, вызывающая ошибку (сама по себе она корректна!!)


Ormada   (2005-12-07 09:51:00) [12]

а проверять структуру в утилите и завершаться в случае ошибки не пробовал ?;)


Наверх

Титульная страница Поиск, карта сайта Написать письмо