Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> блокировка сообщения системы (перенаправление выво 
:(
    Опции темы
Kim
Дата 27.10.2005, 09:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Народ, подсобите плиз кто чем может... запарился уже...
В общем, есть такая ситуевинка. Имеется мой проект (на дельфи), который принимает исходники других проектов (не важно, каким образом принимает). Например, эти проекты тоже писаны на дельфи. Присылаемые проекты (будем называть их ПП) компилируются и запускаются. Важное условие: исходники ПП не должны меняться! Они запускаются так, как есть... При запуске юзается функция CreateProcess. Но там (в ПП) может быть что угодно. И бывает, что они вылетают с run-time error'ом. В этом случае появляется радостное окошко от "умной" винды о том, что "приложение выполнило ... и должно быть закрыто". А вот этого-то как раз и не надо. Потому как пока руками не будет нажата кнопка Terminate на сообщении процесс ПП не может быть закрыт даже TerminateProcess. А надо, чтобы проект работал корректно... Перенаправление вывода ничего не дает... все равно вываливается это окошко smile
Просьба предложить решение, где не пришлось бы программно искать окошко этого сообщения и программно же нажимать кнопочку... хотелось бы корректное решение...
//вынь 2к3 (в идеале - должно работать на любой выне)
//дельфи7

  Вверх
_hunter
Дата 27.10.2005, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



полностью отключи уведомление об ошибках и программа будет спокойно умирать...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Kim
Дата 27.10.2005, 12:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











какие это опции компилятора?
  Вверх
_hunter
Дата 27.10.2005, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



это опции системы smile


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Kim
Дата 27.10.2005, 14:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











смешно... а какие именно?.. ты не мог бы не давать столь туманных объяснений?..
какую конкретно службу необходимо завалить?
  Вверх
_hunter
Дата 27.10.2005, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



ну, батенька, свою систему ( на уровне трех кликов мышой ) надо бы знать...

System Properties->Advanced->Error Reporting


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Kim
Дата 27.10.2005, 15:13 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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.

и у меня опять вылезла эта фигня... smile
  Вверх
_hunter
Дата 27.10.2005, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



тогда DEBUG_PROCESS к dwCreationFlags добавь


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Kim
Дата 27.10.2005, 16:10 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











То есть мой процесс становится дебаггером этого нового процесса?
а как обрабатывать события? например, возникает это событие... как мне узнать, что именно ран-тайм эррор, а не просто повесилась прога?
если не сложно - пару строк кода...
  Вверх
_hunter
Дата 27.10.2005, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



ого куда мы заехали... smile ( а как мило все начиналось... просто не видеть сообщения об ошибках... )
http://msdn.microsoft.com/library/default....s_main_loop.asp


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Kim
Дата 27.10.2005, 16:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











крута. Биг сенкс. Вот это реальная помощь... только остался один вопрос: у меня процессу выделяется не больше определенного интервала времени. И я вызываю WaitForSingleObject. Если он превышает интервал, то приложение снимается. Достаточно ли будет просто заменить эту функцию на WaitForDebugEvent?

и еще в догон: (чтоб понаглеть ;) ) Есть ли возможность ограничить ПП в ресурсах? например, не более определенного объема памяти, доступ - только к определенным к папкам и т.д...?
  Вверх
_hunter
Дата 27.10.2005, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



нет. потому как WaitForDebugEvent может как сработать несколько раз так и не сработать ни разу. так что лучше два потока стартануть ( оно и не особо накладно ).

для ограничения доступа можно использовать CreateProcessAsUser ( и, соответственно, создать пользователя с правом доступа только к определенным папкам )
а вот с объемом памяти все гараздо интереснее: как система должна себя вести при превышении лимита? просто не давать памяти? так программа завернется. самой закрывать? поэтому тут придется самому монитор писать ( еще оди поток, в котором раз в н секунд делаем снимок ( CreateToolhelp32Snapshot ) ) и закрывать программу по превышению лимита


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Darhazer
Дата 27.10.2005, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 28.9.2005
Где: HellCity (Sofia, Bulgaria)

Репутация: нет
Всего: 29



А почему не пользуете try...except

Код

var
f, g: text;
a, b: longint;
x: real;

begin

a:=1;
b:=0;
try
x:=a/b;
x:=x;
except
exit
end;

writeln(x);

end.


Это сообщение отредактировал(а) 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
PM MAIL WWW ICQ YIM   Вверх
Kim
Дата 27.10.2005, 18:20 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Нет, здесь логика работы очень жесткая: превысил ПП лимит времени (т.е. сработал WaitForSingleObject один раз), или вызван эксепшн (т.е. сработал WaitForDebugEvent один раз), или превышен лимит памяти - проект сразу должен быть завален...
И еще... WaitForSingleObject мне и нужен-то был для установления лимита времени. По идее то же самое умеет и WaitForDebugEvent... вот только передаст ли он управление при завершении процесса так же, как и WaitForSingleObject? Если да - то тогда просто тупо его заменить и все...
  Вверх
Kim
Дата 27.10.2005, 18:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Darhazer, потому, что это проверяющая система. Она смотрит, правильно ли ТЫ написал исходник ;)
  Вверх
Kim
Дата 27.10.2005, 18:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Хунтер, и если не секрет (сори за оффтоп) - как переводится фраза-подпись с латыни? ;)
  Вверх
_hunter
Дата 27.10.2005, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



Цитата
Нет, здесь логика работы очень жесткая: превысил ПП лимит времени (т.е. сработал WaitForSingleObject один раз), или вызван эксепшн (т.е. сработал WaitForDebugEvent один раз), или превышен лимит памяти - проект сразу должен быть завален...

ну тогда точно монитор запустить и самому валить...

Цитата
И еще... WaitForSingleObject мне и нужен-то был для установления лимита времени. По идее то же самое умеет и WaitForDebugEvent

не совсем то же: если WaitForSingleObject сработает по истечению времени -- это будет говорить о том, что процес еще живет, а если WaitForDebugEvent -- только о том, что отладочных сообщений не было ( как сообщений о завершении процесса так и сообщений об ошибках ) поэтому заменять нельзя.

Цитата
Хунтер, и если не секрет (сори за оффтоп) - как переводится фраза-подпись с латыни? ;)

не сикрет smile
"Времена меняются, и мы меняемся вместе с ними"


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Kim
Дата 27.10.2005, 20:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(_hunter @ 27.10.2005, 18:37)
не совсем то же: если WaitForSingleObject сработает по истечению времени -- это будет говорить о том, что процес еще живет, а если WaitForDebugEvent -- только о том, что отладочных сообщений не было ( как сообщений о завершении процесса так и сообщений об ошибках )

именно поэтому можно smile
Мой проект должен именно это и отслеживать: один раз выделить (условно) 5 сек на то, чтобы ПП завернулся. Причем тихо-мирно, без ошибок и воплей. А если он не успеет - то я его сам заворачиваю ;) Ведь WaitForDebugEvent не будет ждать все 5 секунд, если ПП завершится раньше, правильно? smile
Получается 3 варианта развития событий:
1. ПП работает время меньше 5 сек и завершается корректно. Все ок.
2. ПП хочет работать больше 5 сек. По истечении таймлимита я его заворачиваю. Сообщение об ошибке генерит мой проект в свой лог.
3. ПП вылетает с эксепшином раньше 5 сек... Сообщение об ошибке генерит мой проект в свой лог.
вот и все...

А насчет памяти... отслежка раз в период - не очень хорошо по двум причинам:
1. ПП может выделить большой объем памяти "на раз" и быстренько его освободить, а я этого не замечу. А заметить надо.
2. Если сильно уменьшу интервал проверки - то мой проект будет кушать много ресурсов. А по задумке как можно больше ресурсов компа должно отдаваться ПП...
как быть?
  Вверх
Петрович
Дата 27.10.2005, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 15
Всего: 55



Цитата(Kim @ 27.10.2005, 21:09)
. ПП может выделить большой объем памяти "на раз" и быстренько его освободить, а я этого не замечу. А заметить надо.

А может тогда стоит перехватить функции распределения памяти и контролировать сам процесс распределения?


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
_hunter
Дата 28.10.2005, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 9
Всего: 98



для контроля достаточно просто знать выделяла ли программа больше память чем нужно. а для этого можно это:
http://msdn.microsoft.com/library/default...._monitoring.asp
использовать...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Kim
Дата 28.10.2005, 17:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Хунтер, немного промазал:
http://msdn.microsoft.com/library/en-us/pe...information.asp
http://msdn.microsoft.com/library/en-us/pe...r_a_process.asp

;)

правда какой из них - не знаю еще, не втыкал конкретно...
  Вверх
Kim
Дата 29.10.2005, 11:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 29.10.2005, 12:10 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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

Получается, их можно отследить только по коду возврата?.. smile


  Вверх
_hunter
Дата 31.10.2005, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 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...
PM ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0708 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.