PDA

Ver la Versión Completa : Conocer La ubicacion de un Proceso en ejecucion delphi


force1758
20-06-2013, 20:06:27
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,


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


Revisa este código:

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 (http://neftali.clubdelphi.com/?p=589), 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 (http://msdn.microsoft.com/en-us/library/windows/desktop/aa394372(v=vs.85).aspx).

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,



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_Management_Instrumentation


Revisa este código:

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:

Windows Management Instrumentation : http://msdn.microsoft.com/en-us/library/aa394582%28v=vs.85%29.aspx

WMI Delphi Code Creator : http://theroadtodelphi.wordpress.com/wmi-delphi-code-creator/

Espero sea útil :)

Nelson.