Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Conocer La ubicacion de un Proceso en ejecucion delphi (https://www.clubdelphi.com/foros/showthread.php?t=83462)

force1758 20-06-2013 20:06:27

Conocer La ubicacion de un Proceso en ejecucion delphi
 
Hola amigo del clubdelphi vengo de nuevo y perdone las molestias causadas Mi pregunta seria de como saber la ubicacion exacta de un otro proceso, que no sea el mio se que se puede con "getmodulefilename" pero solo me da la ubicacion de mi propio programa como se podria hacer

Gracias Saludos :)

nlsgarcia 21-06-2013 07:26:56

force1758,

Cita:

Empezado por force1758
...¿como saber la ubicación exacta de otro proceso, que no sea el mio?...

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TlHelp32, PsAPI;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Obtiene el ID de Proceso (PID) de un Programa Activo en Memoria.
function GetPID(AppName: String): DWORD;
var
   Snapshot: THandle;
   ProcessEntry : TProcessEntry32;
begin
   Result := 0;
   AppName := UpperCase(AppName);
   Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0 );
   If Snapshot <> 0 Then
   try
      ProcessEntry.dwSize := Sizeof(ProcessEntry);
      if Process32First(Snapshot, ProcessEntry) then
      repeat
         if Pos(AppName, UpperCase(ExtractFilename(StrPas(ProcessEntry.szExeFile)))) > 0 then
         begin
            Result:= ProcessEntry.th32ProcessID;
            Break;
         end;
      until not Process32Next(Snapshot, ProcessEntry);
   finally
      CloseHandle(Snapshot);
   end;
end;

// Obtiene el Path de un ID de Proceso (PID) Activo en Memoria.
function GetPathFromPID(const PID: cardinal): string;
var
   hProcess: THandle;
   Path: Array[0..MAX_PATH - 1] of char;
begin
   hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID);
   if hProcess <> 0 then
   try
      if GetModuleFileNameEx(hProcess, 0, Path, SizeOf(Path)) <> 0 then
         Result := Path;
   finally
      CloseHandle(hProcess)
   end
   else
      raise Exception.Create('El Programa No Se Encuentra Activo en Memoria');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   PID : THandle;
begin
   PID := GetPID('Notepad.exe');
   ShowMessage(Format('El Path del Programa en Disco es: %s',[GetPathFromPID(PID)]));
end;

end.
El código anterior muestra el Path de cualquier Programa Activo en Memoria (Inclusive el que ejecuta la aplicación), en el ejemplo se muestra la ruta de directorio de Notepad si este es un proceso activo, en caso contrario se emite un mensaje de error.

Espero sea útil :)

Nelson.

Neftali [Germán.Estévez] 21-06-2013 10:51:18

También puedes hacerlo utilizando WMI.
Si te da igual utilizar componentes externos, la librería GLibWMI, posee el componente TProcessInfo, con el que puedes obtener toda la información de los procesos que hay funcionando (entre ella el path de ejecución).
Las demos de la librería incluyen el funcionamiento de este componente.

Si no quieres instalar componentes, en el FTP, hay algunos ejemplos sobre uso de WMI. Podrás adaptarlos sin problemas para obtener lo que necesitas, utilizando la clase Win32_Process.

force1758 22-06-2013 02:26:41

Muchisimas gracias por su respuestas se los agradezco mucho amigo me sirvió de mucho

nlsgarcia 22-06-2013 09:34:23

force1758,

Cita:

Empezado por Wikipedia:

Windows Management Instrumentation (WMI)
is a set of extensions to the Windows Driver Model that provides an operating system interface through which instrumented components provide information and notification. WMI is Microsoft's implementation of the Web-Based Enterprise Management (WBEM) and Common Information Model (CIM) standards from the Distributed Management Task Force (DMTF).

Tomado del link : http://en.wikipedia.org/wiki/Windows...nstrumentation

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ActiveX, ComObj;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Obtiene Información de un Proceso Activo en Memoria con WMI
function GetProcessInformation(ProcessName : String) : String;
const
   wbemFlagForwardOnly = $00000020;

var
   FSWbemLocator : OLEVariant;
   FWMIService : OLEVariant;
   FWbemObjectSet : OLEVariant;
   FWbemObject : OLEVariant;
   oEnum : IEnumvariant;
   iValue : LongWord;
   SQLWMI : String;

begin

   FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');

   FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');

   SQLWMI := 'SELECT Name, ProcessId, Caption, ExecutablePath FROM Win32_Process Where Name = ' + QuotedStr(ProcessName);

   FWbemObjectSet := FWMIService.ExecQuery(SQLWMI,'WQL',wbemFlagForwardOnly);

   oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;

   if oEnum.Next(1, FWbemObject, iValue) = 0 then
   begin
      Result := String(FWbemObject.ExecutablePath);
      FWbemObject:=Unassigned;
   end
   else
      raise Exception.Create('El Programa No Se Encuentra Activo en Memoria');

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage(Format('El Path del Programa en Disco es: %s',[GetProcessInformation('notepad.exe')]));
end;

end.
El código anterior es una variante de la solución mostrada en el Msg #2 utilizando la Clase Win32_Process de WMI como se sugirió en el Msg #3.

Nota: WMI es un medio muy versátil para obtener y manejar informacion en Windows, en el ejemplo de hace un Select a cuatro propiedades de la Clase Win32_Process (Aunque solo se requiere la propiedad ExecutablePath) como una muestra de las capacidades de WMI.

Te sugiero revisar estos links:
Cita:

Windows Management Instrumentation : http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

WMI Delphi Code Creator : http://theroadtodelphi.wordpress.com...-code-creator/
Espero sea útil :)

Nelson.


La franja horaria es GMT +2. Ahora son las 23:57:15.

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