PDA

Ver la Versión Completa : Ruta completa de proceso


locojoan
30-10-2006, 15:47:25
hola.
quisiera que alguien me ayude. necesito una funcion que ingrese el nombre de un proceso, por ejemplo (explorer.exe), y me devuelva la ruta completa de dicho proceso.

gracias.

Bicho
30-10-2006, 15:52:24
Hola, pues tienes la función ExtractFilePath a la que le pasas por parámetro exactamente el nombre del ejecutable.

Prueba a ver que tal.

Saludos

seoane
30-10-2006, 15:54:08
Depende de lo que estés buscando, hay que tener en cuenta que mas de un proceso puede tener el mismo nombre, ni siquiera tienen que ser el mismo programa. Es decir, puedes tener un explorer.exe en la carpeta c:\windows y otro en c:\ (es solo un ejemplo), y estar ambos ejecutándose al mismo tiempo. En ese caso, ¿que debería devolver nuestra función?

locojoan
30-10-2006, 16:58:15
simplemente quiero ver la ruta completa de un proceso.
por ejemplo en la lista de procesos sale el msnmsgr.exe que es el microsoft messenger. y quiero saber la ruta completa de ese programa.

en pocas palabras. na funcion que ingrese el nombre del proceso y me salga la ruta completa del programa.

gracias.

delphi.com.ar
30-10-2006, 17:08:07
No se si es la solución correcta, pero lo que he utilizado alguna vez es obtener la ruta del primer Module del proceso: http://www.clubdelphi.com/foros/showthread.php?t=28419

Saludos!

locojoan
31-10-2006, 03:59:27
no. no es lo que estoy buscando. en realidad no creo que sea muy complicado. :confused:

gracias de todas maneras.

tefots
31-10-2006, 13:49:09
no. no es lo que estoy buscando. en realidad no creo que sea muy complicado. :confused:

gracias de todas maneras.

pues es mas complicado de lo que parece , ya que hay que hacer varias llamadas al api.

para hacer eso , has de abrir el proceso con openprocess a través de su pid, obtener el handle y luego hacer una llamada a GetModuleFileNameEx con ese handle.

y para obtener el pid de un proceso en concreto que ya está ejecutandose , lo mejor es hacer una llamada al api que te devuelve la lista de procesos que hay en el sistema con sus pids.

la siguiente funcion , sacada de las jedi jcl (la unit JclSysInfo) hace lo que pides. (ten en cuenta que falta alguna llamada para saber si se ejecuta en xp/w2k o en w98)


//==================================================================================================
// Processes, Tasks and Modules
//==================================================================================================
function RunningProcessesList(const List: TStrings; FullPath: Boolean): Boolean;
function ProcessFileName(PID: DWORD): string;
var
Handle: THandle;
begin
Result := '';
Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID);
if Handle <> 0 then
try
SetLength(Result, MAX_PATH);
if FullPath then
begin
if GetModuleFileNameEx(Handle, 0, PChar(Result), MAX_PATH) > 0 then
StrResetLength(Result)
else
Result := '';
end
else
begin
if GetModuleBaseNameA(Handle, 0, PChar(Result), MAX_PATH) > 0 then
StrResetLength(Result)
else
Result := '';
end;
finally
CloseHandle(Handle);
end;
end;
function BuildListTH: Boolean;
var
SnapProcHandle: THandle;
ProcEntry: TProcessEntry32;
NextProc: Boolean;
FileName: string;
begin
SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Result := (SnapProcHandle <> INVALID_HANDLE_VALUE);
if Result then
try
ProcEntry.dwSize := SizeOf(ProcEntry);
NextProc := Process32First(SnapProcHandle, ProcEntry);
while NextProc do
begin
if ProcEntry.th32ProcessID = 0 then
begin
// PID 0 is always the "System Idle Process" but this name cannot be
// retrieved from the system and has to be fabricated.
FileName := RsSystemIdleProcess;
end
else
begin
if IsWin2k or IsWinXP then
begin
FileName := ProcessFileName(ProcEntry.th32ProcessID);
if FileName = '' then
FileName := ProcEntry.szExeFile;
end
else
begin
FileName := ProcEntry.szExeFile;
if not FullPath then
FileName := ExtractFileName(FileName);
end;
end;
List.AddObject(FileName, Pointer(ProcEntry.th32ProcessID));
NextProc := Process32Next(SnapProcHandle, ProcEntry);
end;
finally
CloseHandle(SnapProcHandle);
end;
end;
function BuildListPS: Boolean;
var
PIDs: array [0..1024] of DWORD;
Needed: DWORD;
I: Integer;
FileName: string;
begin
Result := EnumProcesses(@PIDs, SizeOf(PIDs), Needed);
if Result then
begin
for I := 0 to (Needed div SizeOf(DWORD)) - 1 do
begin
case PIDs[I] of
0:
// PID 0 is always the "System Idle Process" but this name cannot be
// retrieved from the system and has to be fabricated.
FileName := RsSystemIdleProcess;
2:
// On NT 4 PID 2 is the "System Process" but this name cannot be
// retrieved from the system and has to be fabricated.
if IsWinNT4 then
FileName := RsSystemProcess
else
FileName := ProcessFileName(PIDs[I]);
8:
// On Win2K PID 8 is the "System Process" but this name cannot be
// retrieved from the system and has to be fabricated.
if IsWin2k or IsWinXP then
FileName := RsSystemProcess
else
FileName := ProcessFileName(PIDs[I]);
else
FileName := ProcessFileName(PIDs[I]);
end;
if FileName <> '' then
List.AddObject(FileName, Pointer(PIDs[I]));
end;
end;
end;
begin
if GetWindowsVersion in [wvWinNT31, wvWinNT35, wvWinNT351, wvWinNT4] then
Result := BuildListPS
else
Result := BuildListTH;
end;



solo tendrias que llamar a RunningProceslist (lista,true)
y te devolveria la lista de procesos , con sus paths , luego tendrias que hacer un extractfilepath , para sacar su ruta.

saludos.