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)
-   -   Ruta completa de proceso (https://www.clubdelphi.com/foros/showthread.php?t=36977)

locojoan 30-10-2006 15:47:25

Ruta completa de proceso
 
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

Cita:

Empezado por locojoan
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)

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


La franja horaria es GMT +2. Ahora son las 21:17:41.

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