![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Kim |
|
|||
|
Unregistered |
Народ, подсобите плиз кто чем может... запарился уже...
В общем, есть такая ситуевинка. Имеется мой проект (на дельфи), который принимает исходники других проектов (не важно, каким образом принимает). Например, эти проекты тоже писаны на дельфи. Присылаемые проекты (будем называть их ПП) компилируются и запускаются. Важное условие: исходники ПП не должны меняться! Они запускаются так, как есть... При запуске юзается функция CreateProcess. Но там (в ПП) может быть что угодно. И бывает, что они вылетают с run-time error'ом. В этом случае появляется радостное окошко от "умной" винды о том, что "приложение выполнило ... и должно быть закрыто". А вот этого-то как раз и не надо. Потому как пока руками не будет нажата кнопка Terminate на сообщении процесс ПП не может быть закрыт даже TerminateProcess. А надо, чтобы проект работал корректно... Перенаправление вывода ничего не дает... все равно вываливается это окошко Просьба предложить решение, где не пришлось бы программно искать окошко этого сообщения и программно же нажимать кнопочку... хотелось бы корректное решение... //вынь 2к3 (в идеале - должно работать на любой выне) //дельфи7 |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
полностью отключи уведомление об ошибках и программа будет спокойно умирать...
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Kim |
|
|||
|
Unregistered |
какие это опции компилятора?
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
это опции системы
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Kim |
|
|||
|
Unregistered |
смешно... а какие именно?.. ты не мог бы не давать столь туманных объяснений?..
какую конкретно службу необходимо завалить? |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
ну, батенька, свою систему ( на уровне трех кликов мышой ) надо бы знать...
System Properties->Advanced->Error Reporting -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Kim |
|
|||
|
Unregistered |
Знаешь... фишка вот в чем... отключил эту опцию... а дальше откомпилил и запустил следующий код:
{$APPTYPE CONSOLE} var f, g: text; a, b: longint; x: real; begin a:=1; b:=0; x:=a/b; x:=x; writeln(x); end. и у меня опять вылезла эта фигня... |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
тогда DEBUG_PROCESS к dwCreationFlags добавь
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Kim |
|
|||
|
Unregistered |
То есть мой процесс становится дебаггером этого нового процесса?
а как обрабатывать события? например, возникает это событие... как мне узнать, что именно ран-тайм эррор, а не просто повесилась прога? если не сложно - пару строк кода... |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
ого куда мы заехали...
http://msdn.microsoft.com/library/default....s_main_loop.asp -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Kim |
|
|||
|
Unregistered |
крута. Биг сенкс. Вот это реальная помощь... только остался один вопрос: у меня процессу выделяется не больше определенного интервала времени. И я вызываю WaitForSingleObject. Если он превышает интервал, то приложение снимается. Достаточно ли будет просто заменить эту функцию на WaitForDebugEvent?
и еще в догон: (чтоб понаглеть ;) ) Есть ли возможность ограничить ПП в ресурсах? например, не более определенного объема памяти, доступ - только к определенным к папкам и т.д...? |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
нет. потому как WaitForDebugEvent может как сработать несколько раз так и не сработать ни разу. так что лучше два потока стартануть ( оно и не особо накладно ).
для ограничения доступа можно использовать CreateProcessAsUser ( и, соответственно, создать пользователя с правом доступа только к определенным папкам ) а вот с объемом памяти все гараздо интереснее: как система должна себя вести при превышении лимита? просто не давать памяти? так программа завернется. самой закрывать? поэтому тут придется самому монитор писать ( еще оди поток, в котором раз в н секунд делаем снимок ( CreateToolhelp32Snapshot ) ) и закрывать программу по превышению лимита -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Darhazer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 28.9.2005 Где: HellCity (Sofia, Bulgaria) Репутация: нет Всего: 29 |
А почему не пользуете try...except
Это сообщение отредактировал(а) Darhazer - 27.10.2005, 18:08 -------------------- I'm a wheel, I'm a wheel, I can roll, I can feel But you can't stop me turning 'Cause I'm the sun, I'm the sun, I can move, I can run But you'll never stom me burning |
|||
|
||||
| Kim |
|
|||
|
Unregistered |
Нет, здесь логика работы очень жесткая: превысил ПП лимит времени (т.е. сработал WaitForSingleObject один раз), или вызван эксепшн (т.е. сработал WaitForDebugEvent один раз), или превышен лимит памяти - проект сразу должен быть завален...
И еще... WaitForSingleObject мне и нужен-то был для установления лимита времени. По идее то же самое умеет и WaitForDebugEvent... вот только передаст ли он управление при завершении процесса так же, как и WaitForSingleObject? Если да - то тогда просто тупо его заменить и все... |
|||
|
||||
| Kim |
|
|||
|
Unregistered |
Darhazer, потому, что это проверяющая система. Она смотрит, правильно ли ТЫ написал исходник ;)
|
|||
|
||||
| Kim |
|
|||
|
Unregistered |
Хунтер, и если не секрет (сори за оффтоп) - как переводится фраза-подпись с латыни? ;)
|
|||
|
||||
| _hunter |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
ну тогда точно монитор запустить и самому валить...
не совсем то же: если WaitForSingleObject сработает по истечению времени -- это будет говорить о том, что процес еще живет, а если WaitForDebugEvent -- только о том, что отладочных сообщений не было ( как сообщений о завершении процесса так и сообщений об ошибках ) поэтому заменять нельзя.
не сикрет "Времена меняются, и мы меняемся вместе с ними" -------------------- Tempora mutantur, et nos mutamur in illis... |
||||||
|
|||||||
| Kim |
|
|||
|
Unregistered |
именно поэтому можно Мой проект должен именно это и отслеживать: один раз выделить (условно) 5 сек на то, чтобы ПП завернулся. Причем тихо-мирно, без ошибок и воплей. А если он не успеет - то я его сам заворачиваю ;) Ведь WaitForDebugEvent не будет ждать все 5 секунд, если ПП завершится раньше, правильно? Получается 3 варианта развития событий: 1. ПП работает время меньше 5 сек и завершается корректно. Все ок. 2. ПП хочет работать больше 5 сек. По истечении таймлимита я его заворачиваю. Сообщение об ошибке генерит мой проект в свой лог. 3. ПП вылетает с эксепшином раньше 5 сек... Сообщение об ошибке генерит мой проект в свой лог. вот и все... А насчет памяти... отслежка раз в период - не очень хорошо по двум причинам: 1. ПП может выделить большой объем памяти "на раз" и быстренько его освободить, а я этого не замечу. А заметить надо. 2. Если сильно уменьшу интервал проверки - то мой проект будет кушать много ресурсов. А по задумке как можно больше ресурсов компа должно отдаваться ПП... как быть? |
|||
|
||||
| Петрович |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 15 Всего: 55 |
А может тогда стоит перехватить функции распределения памяти и контролировать сам процесс распределения? -------------------- Все знать невозможно, но хочется |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
для контроля достаточно просто знать выделяла ли программа больше память чем нужно. а для этого можно это:
http://msdn.microsoft.com/library/default...._monitoring.asp использовать... -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Kim |
|
|||
|
Unregistered |
Хунтер, немного промазал:
http://msdn.microsoft.com/library/en-us/pe...information.asp http://msdn.microsoft.com/library/en-us/pe...r_a_process.asp ;) правда какой из них - не знаю еще, не втыкал конкретно... |
|||
|
||||
| Kim |
|
|||
|
Unregistered |
hunter: можешь еще вот это объяснить?
Юзаю WaitForDebugEvent. В результате наблюдаю такую картинку... При запуске 32битного приложения (работающего корректно!) получаю такую очередь эвентов: -ProcessCreate- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -=!EXCEPTION!=- -ProcessExit- Код возврата: 0 При запуске 32битного приложения (вызывающего деление на 0) - такая очередь: -ProcessCreate- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!= ... и так до бесконечности При запуске 16битного приложения (работающего корректно!) - такая очередь: -ProcessCreate- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -=!EXCEPTION!=- -ThreadCreate- -LoadDLL- -LoadDLL- -OutputSTR- -LoadDLL- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -ThreadCreate- -=!EXCEPTION!=- -ThreadExit- -ThreadExit- -ProcessExit- Код возврата: 0 При запуске 16битного приложения (вызывающего деление на 0) - такая очередь: -ProcessCreate- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -=!EXCEPTION!=- -ThreadCreate- -LoadDLL- -LoadDLL- -OutputSTR- -LoadDLL- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -=!EXCEPTION!=- -ThreadCreate- -ThreadExit- -ThreadExit- -ProcessExit- Код возврата: 200 Так как же мне грамотно определить, в каком случае запускаемый процесс отваливается, а в каком - нормально работает?.. |
|||
|
||||
| Kim |
|
|||
|
Unregistered |
Предыдущий вопрос снят... по 32битникам все понятно: надо было более подробно рассматривать эксепшины. Возник другой вопрос: сколько вообще этих эксепшинов бывает? Микрософт публикует всего 5, борланд в своем хелпе - 20. В сумме (разных) получается 21. Где еще можно поискать?
А вот по 16 битникам.... Правильная прога: -ProcessCreate- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- =!ExBreakpoint!= -ThreadCreate- -LoadDLL- -LoadDLL- -OutputSTR- -LoadDLL- -ThreadCreate- -ThreadExit- -ThreadExit- -ProcessExit- Код возврата: 0 Неправильная прога: -ProcessCreate- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- -LoadDLL- =!ExBreakpoint!= -ThreadCreate- -LoadDLL- -LoadDLL- -OutputSTR- -LoadDLL- -ThreadCreate- -ThreadExit- -ThreadExit- -ProcessExit- Код возврата: 200 Получается, их можно отследить только по коду возврата?.. |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 9 Всего: 98 |
так 20 их и есть:
http://msdn.microsoft.com/library/default...._record_str.asp а остальные ( всякие наследники от Exception ) -- языкозависимы... а с 16-ти битными -- хз ( я их только в школе писал... ) а зачем, кстати, в 16 бит компилировать ( особенно в делфи )? -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |