PDA

Ver la Versión Completa : funcion para listar procesos, como


javier20
08-02-2008, 07:58:20
hola q tal navegando por la web encontre este codigo y me pregunto como funciona, hace tiempo que vengo con el delphi y la verdad me gustaria empezar a cazar algo:


bueno el codigo es este:


function GetProc():String;
var
Proceso : TProcessEntry32;
ProcessHandle : THandle;
HayOtroProceso : Boolean;
begin
Proceso.dwSize := SizeOf(TProcessEntry32);
ProcessHandle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if Process32First(ProcessHandle, Proceso) then //Si encuentra el primer proceso
begin
Result:= String(Proceso.szExeFile) + '|'+ IntToStr(Proceso.th32ProcessID)+'|';
repeat HayOtroProceso := Process32Next(ProcessHandle, Proceso);
if HayOtroProceso then
Result:=Result + String(Proceso.szExeFile) + '|'+ IntToStr(Proceso.th32ProcessID)+'|';
until not HayOtroProceso; //Y esto se repite hasta que Process32Next retorne False
end;
CloseHandle(ProcessHandle);
end;


estas son mis dudas:

1 ProcessHandle esta definida como THandle y en otros casos he visto que la definen como LongWord, cual es la diferencia?.

2 Proceso.dwSize := SizeOf(TProcessEntry32); para que sirve esto?

3 que pasa si borro la linea CloseHandle al final del codigo.

bueno por el momento son estas nomas espero sus respuestas.

saludos.

jachguate
08-02-2008, 08:31:25
1 ProcessHandle esta definida como THandle y en otros casos he visto que la definen como LongWord, cual es la diferencia?.
Actualmente (Win32) la diferencia de implementación no es ninguna, dado que ambos tipos de dato ocupan exactamente la misma cantidad de memoria y son prácticamente intercambiables. De hecho, en Delphi 2007, en la línea 429 de la unidad system.pas, encontrás esto:

type
...
THandle = LongWord;


En futuras versiones de Delphi, esto podría cambiar, por ejemplo en el 2009, cuándo tengamos a nuestra disposición el commodor: Delphi Win64.

Como ves, la diferencia es semántica. Probablemente en Win64 el THandle ya no sea igual a un LongWord. Por ello, lo recomendable es, si la variable va a contener un Handle, que sea del tipo THandle, así solo recompilas y listo.

2 Proceso.dwSize := SizeOf(TProcessEntry32); para que sirve esto?
SizeOf es una función que devuelve el tamaño en bytes de una variable. En este caso, está almacenando dicho tamaño en la estructura que enviará como parámetro al API de windows, que en muchas ocasiones te pide el tamaño del buffer de datos.

3 que pasa si borro la linea CloseHandle al final del codigo.
Pérdida de recursos. Un handle abierto permanecerá abierto y consumiendo recursos del sistema. Si tu aplicación no cierra el handle y hace esto, por ejemplo, una vez cada minuto, al cabo de 8 horas tendrás 480 handles abiertos, y creeme, el consumo de memoria será inmenso.

De hecho, en el código que publicas no se tiene garantía de que el handle se libere si ocurre un error mientras se procesa. Debiera incluir una clausula try/finally, deseable siempre que se consumen/liberan recursos.

Hasta luego.

;)