Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отлов завершения програм. [D6, Win95/98, WinME]


VovanM ©   (2002-03-11 18:01:00) 

Нужно зафиксировать время запуска и завершения любой програмЬІ (игрЬІ). Проблема в том чтоПрограма может запустить другой процес и завершить вЬІполнениє.


Raptor   (2002-03-12 22:14:00) [1]

2 Sasha9
Это относится только к окнам, а никак не к процессам.


Sasha9   (2002-03-12 18:59:00) [2]

можно ещё хуком(Hook) перехватить сообщения WM_CAREATE, WM_CLOSE, WM_DESTROY


paul_shmakov   (2002-03-12 18:51:00) [3]

кстати, перехватить на 100% все вызовы к CreateProcess из обычного приложения не получится. только драйвером.
здесь описано почему:
http://www.rsdn.ru/forum/message.asp?mid=21412#21412


paul_shmakov   (2002-03-12 18:00:00) [4]

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

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

наше приложение следит за появлением этих данных. при появлении каждого нового идентификатора процесса, запоминаем время запуска. потом ждем завершения одного из процессов функцией WaitForMultipleObjects. как только завершился, запоминаем время завершения. и т.д.


Наверх

Титульная страница Поиск, карта сайта Написать письмо