(Delphi)
Я из Windows-приложения запускаю программу (консольную) (с помощью CreateProcess), и при этом, если у этой программы возникнет runtime-error, то появляется окошко с сообщением об ошибке (виндуозовское) , а нужно не показывать никаких сообщений, а узнать ExitCode и завершить процесс.
Как поймать этот runtime доWindows ?
6 декабря 2008 в 15:04
Рад помочь
6 декабря 2008 в 11:05
2 Александр Quyse Lert:Спасибо!
6 декабря 2008 в 0:00
Александр Quyse Lert, век живи век учись не знал
5 декабря 2008 в 20:03
Для этого используются Jobs (задания). См. документацию MSDN по функциям CreateJobObject, SetInformationJobObject и т.д.
Надо создать задание, наложить ограничения на процессы в задании, создать процесс в приостановленном состоянии, добавить его в задание, разрешить его выполнение.
Задания позволяют наложить некоторое количество ограничений, в том числе по времени, памяти, использовании UI и т.д., вплоть до процессорной привязки, а также конкретно чтобы не выводилось окно с ошибкой (флаг JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION в структуре JOBOBJECT_BASIC_LIMIT_INFORMATION, ну в общем разберетесь).
При завершении процессов задания приходят уведомления на специально созданный completion port, в которых указывается причина (превышение времени, памяти, рантайм еррор и т.д.) – в общем, как раз то что нужно!
Через дебаг не рекомендую, корректно сделать сложно. Задания здесь по-моему, лучший выбор.
5 декабря 2008 в 19:03
Рома, а ты задумал свою тестирующую систему написать?
5 декабря 2008 в 18:02
2 Санька Тортиковая_Морда Снетков: я не об этом совсем. Мне не нужно избавиться от рантайма в дочернем процессе, мне как раз нужно узнать, что он есть (если есть, конечно) и какой он.
5 декабря 2008 в 16:03
Может у тебя обращение к несуществуещему элементу массива если такие есть?
5 декабря 2008 в 16:02
думается что только через DEBUG-mode, других вариантов особо не вижу
CreateProcess с флагом DEBUG_PROCESS,
потом в цикле
WaitForDebugEvent(&DebugEv, INFINITE);
…
ContinueDebugEvent(DebugEv.dwProcessId, DebugEv.dwThreadId, dwContinueStatus);
пока не свалится, как свалится перезапускаешь
другой вариант – отключить выдачу ватсона и проверять список процессов, как делает mysql но этот вариант хуже