Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.25;
Скачать: CL | DM;

Вниз

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

 
YDS   (2005-12-07 09:47) [0]

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

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


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

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


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

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


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

Up


 
Alexander Panov ©   (2005-12-07 10:33) [4]

Может быть стоит следить за своими ветками внимательнее?
http://delphimaster.net/view/15-1133898381/


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

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

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


 
Alexander Panov ©   (2005-12-07 11:02) [6]


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


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


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

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


 
Alexander Panov ©   (2005-12-07 12:15) [8]


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

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


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


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

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

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

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


 
Alexander Panov ©   (2005-12-07 14:43) [10]

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


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


 
Alexander Panov ©   (2005-12-07 14:49) [11]

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

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


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

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

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


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


> YDS   (07.12.05 14:41) [9]


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

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

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

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

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

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

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2005.12.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.043 c
2-1133759989
Gem
2005-12-05 08:19
2005.12.25
Определение реального текущего номера записи таблицы


2-1133883102
BackGround
2005-12-06 18:31
2005.12.25
TCriticalSection


2-1133793502
Saimon
2005-12-05 17:38
2005.12.25
Плоский стиль контролов


2-1134140411
fun
2005-12-09 18:00
2005.12.25
Путь запуска dll


1-1133417197
RoboCop
2005-12-01 09:06
2005.12.25
Удалить границу у TComboBox