Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Administrador de tareas - recuento de indentificadores (https://www.clubdelphi.com/foros/showthread.php?t=34880)

mole 24-08-2006 15:01:54

Administrador de tareas - recuento de indentificadores
 
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:

Código Delphi [-]
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

thank
 
Gracias, ya accedo al valor.:p


La franja horaria es GMT +2. Ahora son las 03:59:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi