![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
PID процесса [D7, WinXP]
Alex870 © (2005-08-19 14:39:00)Здравствуйте!
Подскажите пожалуйста, как получить PID процесса, зная имя модуля, его породившего. Нашел функцию GetProcessId, ей передается Handle процесса, но как его получить я тоже не знаю. Зарание всем спасибо!
Leonid Troyanovsky (2005-08-21 17:24:00) [1]
> > Создан был NT3.51-4 only
> Requirements
> Client Requires Windows XP, Windows 2000 Professional, or
> Windows NT Workstation 4.0.
> Server Requires Windows Server 2003, Windows 2000 Server,
> or Windows NT Server 4.0.
http://groups-beta.google.com/group/microsoft.public.win32.programmer.kernel/browse_frm/thread/bfe3257147fb910f/815c8da92040fd70?lnk=st&q=microsoft+kernel+ntquerysysteminformation+psapi&rnum=1#815c8da92040fd70
Кста, для NT > IMHO, группой(?) двоечников
> ?
Свен Шрайбер "Недокументированные возможности Windows 2000"
--
Regards, LVT.
Digitman (2005-08-21 13:42:00) [2]
> Создан был NT3.51-4 only
EnumProcesses
..
Requirements
Client Requires Windows XP, Windows 2000 Professional, or Windows NT Workstation 4.0.
Server Requires Windows Server 2003, Windows 2000 Server, or Windows NT Server 4.0.
> IMHO, группой(?) двоечников
?
alpet (2005-08-20 12:21:00) [3]А как понимать - "модуля его породившего". Это модуль Delphi или некоторая DLL, его "породили"? Запуск на выполнения связан с какими-нибудь событиями? Если так можно, сразу после запуска, построить список процессов, выделить в нем самый молодой (GetProcessTimes), или сравнить с предыдущим списком процессов. Как тебе может имя модуля, если это не имя исполняемого файла самого процесса, помочь, я не представляю.
psa247 (2005-08-20 12:08:00) [4]Кое-что подправишь...
psa247 (2005-08-20 11:56:00) [5]
if name = '' then exit;
name:= UpperCase(name);
if not(EnumProcesses(@ProcList, sizeof(ProcList), Proc_count))then exit;
for i:= 0 to Proc_count div 4 - 1 do begin
ProcHandle:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, ProcList[i]);
if ProcHandle > 0 then begin
EnumProcessModules(ProcHandle, @ModHandle, 4, Mod_Count);
GetModuleFileNameEx(ProcHandle, ModHandle, ModName, sizeof(ModName));
if name = UpperCase(string(ExtractFileName(ModName)))then begin
// Нашли имя процесса
ProcList[i] - his PID ..... <--- look here.....
CloseHandle(ProcHandle);
end;
end;
BiN (2005-08-19 16:33:00) [6]Digitman © (19.08.05 16:27) [5]
Toolhelp32API не рекомендуется использовать на НТ-платформе, хоть и поддерживается ей.
Имелось ввиду, что EnumProcesses() не возвращает "инф.структуру, содержащую кр.всего прочего имя ехе-модуля и PID процесса".
Leonid Troyanovsky (2005-08-19 16:32:00) [7]
> Digitman © (19.08.05 16:27) [5]
> Toolhelp32API не рекомендуется использовать на НТ-платформе,
> хоть и поддерживается ей.
Кто не рекомендует Toolhelp32API, тот, уж подавно, не
будет рекомендовать psapi, а Nt* only.
> psapi (ProcessStatus API) был разработан специально для
> этих (и других связанных с этими) целей, его использование
> на НТ оправдано и корректно, равно как и просто.
Создан был NT3.51-4 only, и, IMHO, группой(?) двоечников.
--
Regards, LVT.
Digitman (2005-08-19 16:27:00) [8]
> BiN © (19.08.05 15:43) [3]
Toolhelp32API не рекомендуется использовать на НТ-платформе, хоть и поддерживается ей.
psapi (ProcessStatus API) был разработан специально для этих (и других связанных с этими) целей, его использование на НТ оправдано и корректно, равно как и просто.
NtQuerySystemInformation в составе NativeAPI заметно сложней в использовании, потому что эта ф-ция предоставляет самую разнородную инф-цию в гораздо большем объеме, нежели требуется для дан.задачи .. эта ф-ция, по сути, некий "пользовательский шлюз", через который можно получить самую разнородную сист.инф-цию, в т.ч. инф-цию о процессах в системе
Leonid Troyanovsky (2005-08-19 16:13:00) [9]
> BiN © (19.08.05 15:43) [3]
> Очевидно, имелось ввиду Process32First/Next (?)
Конечно, тут следует иметь ввиду CreateToolhelp32Snapshot &etc.
По-крайней мере, оно более документировано и шире применимо.
Ну, а psapi вовсе не нужно, и успешно заменялось NtQuerySystemInformation.
--
Regards, LVT.
BiN (2005-08-19 15:43:00) [10]Digitman © (19.08.05 15:35) [2]
см. EnumProcesses() в составе psapi.pas
для каждого активного в системе процесса в ходе перечисления енумератор вернет инф.структуру, содержащую кр.всего прочего имя ехе-модуля и PID процесса
Очевидно, имелось ввиду Process32First/Next (?)
Digitman (2005-08-19 15:35:00) [11]см. EnumProcesses() в составе psapi.pas
для каждого активного в системе процесса в ходе перечисления енумератор вернет инф.структуру, содержащую кр.всего прочего имя ехе-модуля и PID процесса
Erik1 (2005-08-19 15:19:00) [12]Вобщето можно в Help глянуть там куча функций, если конечно тебе надо получить ID текущего процеса то:
GetCurrentProcessId