PDA

Ver la Versión Completa : Administrador de tareas - recuento de indentificadores


mole
24-08-2006, 15:01:54
Hola, estoy intentado capturar el recuento de identificadores de un processo que aparece en el taskmanager.

Ver -> columnas -> recuento de identificadores (handler en ingles).

Alguna idea?

Gracias

seoane
24-08-2006, 16:34:56
Una primera solución seria la siguiente:


uses psapi;

// Esta función no esta declarada en delphi 7, en versiones posteriores puede que ya lo este
function GetProcessHandleCount(hProcess: THandle; var pdwHandleCount: DWORD): BOOL;
stdcall; external 'Kernel32.dll' name 'GetProcessHandleCount';

// Esta función almacena en una lista el nombre y el HandleCount de cada proceso
procedure GetHandleCounts(Lista: TStringList);
var
Procesos: array[1..1024] of DWORD;
Needed: DWORD;
i: integer;
Process: THANDLE;
ModName: array[0..MAX_PATH] of char;
HandleCount: DWORD;
begin
Lista.Clear;
if EnumProcesses(@Procesos, sizeof(Procesos), Needed ) then
begin
for i:= 1 to (Needed div sizeof(DWORD)) do
begin
Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE,Procesos[i]);
if (Process<>0) then
begin
if GetModuleFileNameEx(Process, 0, ModName,sizeof(ModName)-1) > 0 then
if GetProcessHandleCount(Process, HandleCount) then
//Lista.Values[ModName]:= IntToStr(HandleCount)
Lista.Add(string(PChar(@ModName)) + '=' + IntToStr(HandleCount));
CloseHandle(Process);
end;
end;
end;
end;

// Un ejemplo de como usar la funcion
var
Lista: TStringList;
begin
Lista:= TStringList.Create;
try
GetHandleCounts(Lista);
ShowMessage(Lista.Text);
finally
Lista.Free;
end;
end;


El único problema, siempre hay un problema :) , es que si se utiliza desde una aplicación normal no se tiene acceso a todos los procesos. Si quieres acceder a todos los procesos tendrás que utilizar esta función dentro de un servicio, o quizá jugar con los permisos pero esto ultimo no lo he probado.

mole
25-08-2006, 09:41:52
Gracias, ya accedo al valor.:p