Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.014 c
11-1115316782
Sphinxx
2005-05-05 22:13
2005.12.25
Скачивание фалов с инета


2-1134047013
GanibalLector
2005-12-08 16:03
2005.12.25
PostMessage


2-1134302428
skysat
2005-12-11 15:00
2005.12.25
Ковертация Dos-формата


6-1126951071
redlord
2005-09-17 13:57
2005.12.25
задержки при коннекте


14-1133262163
CHES
2005-11-29 14:02
2005.12.25
А вы говорите в килограмме 1024 грамма....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский