![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Завершение внешнего приложения в случае ошибки
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]а проверять структуру в утилите и завершаться в случае ошибки не пробовал ?;)