Форум: "Начинающим";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];
ВнизЗавершение внешнего приложения в случае ошибки Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c