Текущий архив: 2002.03.28;
Скачать: CL | DM;
ВнизОтслежка запуска программы другой программой Найти похожие ветки
← →
Raven (2002-01-04 09:44) [0]Уважаемые Мастера, помогите пожалуйста отследить запуск какой-либо программы. Есть вариант опрашивать систему на все запущенные процессы, через какой-то промежуток времени, но этот вариант слишком модет тормозить систему. Нужно видимо поставить hook на запуск приложений, чтобы он срабатывал как раз на запуск приложения, но help плз, я не знаю как это делать и hookи ни разу не ставил. Буду признателен.
← →
Aleksey Pavlov (2002-01-04 12:15) [1]Да, вариант с hook-ом будет выглядеть на первый взгряд более красиво, но вот ставить его прийдётся не на запуск какого-то конкретного процесса, а на запуск процесса вообще.
Таким образом, при каждом создании нового процесса в системе будет срабатывать ваш hook, который будет проверять тот ли это процесс или не тот.
Притом, при программировании такого рода hook-а, вам придётся использовать механизм файлов отображённых в память, который, вообще говоря, достаточно нетривиален в использовании (не достаточно хорошо освещён в Net-е).
Юрий Зотов приводил примерна данную тему, но лично у меня этот пример вызвал некоторые сомнения на предмет работоспособности при определённых обстоятельствах.
К тому же, при таком варианте использования hook-a, система будет "тормозиться" не меньше, чем при снятия слепка процессов в системе, к примеру, раз в секунду. (CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0))
Так что вам решать, чем пользоваться.
← →
otari (2002-01-04 21:15) [2]uses tlhelp32;
procedure TForm1.Button1Click(Sender: TObject);
var
I : Integer;
hSnapshoot : THandle;
pe32 : TProcessEntry32;
List : TStrings;
begin
memo1.lines.clear;
hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshoot = -1) then Exit;
pe32.dwSize := SizeOf(TProcessEntry32);
if (Process32First(hSnapshoot, pe32)) then repeat
I := memo1.Lines.Add(Format("%x, %x: %s", [pe32.th32ProcessID,
pe32.th32ParentProcessID,pe32.szExeFile]));
memo1.Lines.Objects[I] := Pointer(pe32.th32ProcessID);
until not Process32Next(hSnapshoot, pe32);
CloseHandle (hSnapshoot);
end;
esli ctonibut nado pishi: otarip@yahoo.com
← →
Raven (2002-01-08 16:33) [3]Спасибо Мастера, что откликнулись, но слепок процессов мне известный вариант. Мне нужно что-то вроде того как Диспетчер Задач Windows перехватывает процессы. Да и, г-н Павлов, подскажите пожалуйста как связаться с Юрием Зотовым. Заранее благодарен.
← →
pin (2002-01-26 16:26) [4]Присоеденяюсь к поиску ответа на данный вопрос, только в моем случае при запуске нужной программы надо получить параметры переданные ей через командную строчку, потом заморозить процесс, что-то там сделать и отморозить... Вот.
← →
Dimaond Cat (2002-01-26 22:01) [5]А Юрий Зотов своих мылов не дает :о)
если нужен пример хуков пиши вышлю, или еще лучше пошатырь по этой конфе, тут они были рассмотрены в различных вариантах
2 Aleksey Pavlov считаю что снятие слепков менее результативный подход, вопервых вы регулярно выполняеете этот процесс, т.е. регулярно подгружаете процессор, во вторых вероятен вариант что искомый процесс может отработать и завершиться за время простоя вашей программы
← →
VuDZ (2002-01-26 22:26) [6]поищи в в МСДН пример
Taking a Snapshot and Viewing Processes
работает быстро и то, что надо...
← →
Юрий Зотов (2002-01-28 13:42) [7]Надо смотреть 4-е издание книги Рихтера, там есть такая задача. Решается она перехватом обращения к CreateProcess. Если "на пальцах", то примерно так: пишется, например, DLL с глобальным хуком (чтобы внедрить свой код в адресное пространство каждого процесса) и в ней по DLL_PROCESS_ATTACH адрес CreateProcess подменяется адресом своей функции (которая делает все, что нам нужно, а потом вызывает "родную" CreateProcess).
Страницы: 1 вся ветка
Текущий архив: 2002.03.28;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.006 c