Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-06-2013
force1758 force1758 is offline
Miembro
 
Registrado: jul 2010
Posts: 37
Poder: 0
force1758 Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 21-06-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
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.

Última edición por Casimiro Notevi fecha: 21-06-2013 a las 09:33:36.
Responder Con Cita
  #3  
Antiguo 21-06-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 22-06-2013
force1758 force1758 is offline
Miembro
 
Registrado: jul 2010
Posts: 37
Poder: 0
force1758 Va por buen camino
Muchisimas gracias por su respuestas se los agradezco mucho amigo me sirvió de mucho
Responder Con Cita
  #5  
Antiguo 22-06-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
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.

Última edición por nlsgarcia fecha: 22-06-2013 a las 09:51:52.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Detectar proceso en ejecucion C++ dmartinezn C++ Builder 6 28-08-2012 22:07:16
Controlar la ejecución de un proceso satelier.martin Varios 3 14-04-2011 01:35:33
Como Terminar La Ejecucion De Un Proceso kurono Varios 2 01-02-2008 17:10:44
Parar ejecucion de un proceso trohan Varios 3 01-02-2008 17:05:18
¿Cómo saber la ubicación del ejecutable que levantó un proceso? Alcolea Windows 1 24-11-2007 22:58:43


La franja horaria es GMT +2. Ahora son las 04:41:43.


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
Copyright 1996-2007 Club Delphi