Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   [Aporte] Buscar/Matar procesos y ejecutar un EXE (https://www.clubdelphi.com/foros/showthread.php?t=70918)

BrunoBsso 19-11-2010 06:57:48

[Aporte] Buscar/Matar procesos y ejecutar un EXE
 
1 Archivos Adjunto(s)
Hola Club.
Bueno, hace poco estuve necesitando estas 3 cosas y las soluciones que encontré por varios lados no me convencían mucho así que hice algunos procedimientos (basados en ejemplos y unos retoques míos) que me sirvieron de maravilla. Sobretodo con la arquitectura x64.
Bueno, acá les dejo el código y un adjunto con todo (no es una unit, solo código):
Código Delphi [-]
uses
  System, SysUtils, Windows, TlHelp32, Forms;

function ClearFileName(AExeName: String): TFileName;
{ Sirve para sistemas de arquitectura x64 donde Windows agrega " *32" a los
  procesos que corren con arquitectura x86 }
{ Copia el FileName hasta el espacio en blanco }
var
  i: integer;
begin
  { Marcás el final de la cadena como un espacio vacío }
  i := LastDelimiter(' ', AExeName);
  if (i = 0) then { Si no hay ningún espacio vacío le das el máximo de caracteres }
    i := MaxInt;
  { Copiás desde el inicio hasta el anterior al máximo }
  Result := Copy(AExeName, 0, i - 1);
  { explorer.exe *32 -> el " " aparece en la posición 13, necesitás copiar 12 }
end;

function ProcessExists(AExeName: String): boolean;
var
  ContinueLoop: LongBool;
  FSnapshotHandle: THandle;
  FProcess: TProcessEntry32;
  FExeFound: TFileName;
begin
  { Limpias el hacés un genérico para el FileName }
  AExeName := UpperCase(ClearFileName(AExeName));
  Result := False;
  { Creas un Handle para leer procesos }
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  { Creás un buffer de procesos }
  FProcess.dwSize := SizeOf(FProcess);
  { ContinueLoop es un flag que busca el siguiente proceso y, si hay, lo guarda en FProcess }
  ContinueLoop := Process32First(FSnapshotHandle, FProcess);
  while (ContinueLoop) and NOT(Result) do
  begin
    { Almacenás el nombre "genéroco" del proceso encontrado }
    FExeFound := UpperCase(ClearFileName(ExtractFileName(FProcess.szExeFile)));
    Result := (FExeFound = AExeName);
    ContinueLoop := Process32Next(FSnapshotHandle, FProcess);
  end;
  { Cerrás el Handle }
  CloseHandle(FSnapshotHandle);
end;

procedure ExecuteAndWait(AExeName: String; uCmdShow: Cardinal);
{ Tiene que ejecutar el programa y esperar que aparezca para
  terminar el proceso }
var
  Path: PAnsiChar;
begin
  if NOT(FileExists(AExeName)) then
    Exit;
  { El PAnsiChar es necesario (al menos en D2010) para llamar a WinExec }
  Path := PAnsiChar(AnsiString(AExeName));
  WinExec(Path, uCmdShow);
  { Puede ser que tarde en llegar el mensaje de Exec así que lo "obligás" }
  Application.ProcessMessages;

  { Para prevenir que tarde, lo buscás hasta que aparece }
  while NOT(ProcessExists(AExeName)) do
    Sleep(250);

  { Recibís/Enviás todos los mensajes }
  Application.ProcessMessages;
end;

function ProcessKill(AExeName: String; Iterative: boolean = TRUE): boolean;
const
  TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcess: TProcessEntry32;
  FExeFound: TFileName;
Label NO_ITERATIVE;
begin
  Result := False;
  { Limpias el hacés un genérico para el FileName }
  AExeName := UpperCase(ClearFileName(AExeName));
  { Creas un Handle para leer procesos }
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  { Creás un buffer de procesos }
  FProcess.dwSize := SizeOf(FProcess);
  { ContinueLoop es un flag que busca el siguiente proceso y, si hay, lo guarda en FProcess }
  ContinueLoop := Process32First(FSnapshotHandle, FProcess);
  while (ContinueLoop) do
  begin
    { Almacenás el nombre "genéroco" del proceso encontrado }
    FExeFound := UpperCase(ClearFileName(ExtractFileName(FProcess.szExeFile)));
    if (FExeFound = AExeName) then
    begin
      Result := True;
      { Para matarlo lo debés abrir con el flag de TERMINATE }
      TerminateProcess(OpenProcess(TERMINATE, BOOL(0), FProcess.th32ProcessID),
        0);
      if NOT(Iterative) then { Si no es iterativo sale directamente a cerrar el Handle }
        GoTo NO_ITERATIVE;
    end;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcess);
  end;
NO_ITERATIVE :
  CloseHandle(FSnapshotHandle);
end;

Espero que si alguien lo necesita le sirva.
Saludos.

ElKurgan 19-11-2010 07:31:14

Muchas gracias por el aporte. Le echaremos un vistazo

Saludos

Neftali [Germán.Estévez] 19-11-2010 11:01:41

Gracias.
 
Gracias Bruno. Fantástico aporte.

¿Puedes subirlo al FTP del Club? La sección de Componente/Funciones creo que sería la adecuada.

ecfisa 19-11-2010 12:02:41

Gracias por el aporte. ;)

Saludos. :)

Neftali [Germán.Estévez] 19-11-2010 12:15:05

Una pregunta Bruno, si no te importa.
¿Probaste utilizando WMI? ¿Has encontrado documentación al respecto?

BrunoBsso 22-11-2010 06:12:49

Cita:

Empezado por Neftali (Mensaje 382755)
Una pregunta Bruno, si no te importa.
¿Probaste utilizando WMI? ¿Has encontrado documentación al respecto?

Neftali, mirá que tengo tu componente eh. Lo uso para muchas cosas que hago (boludeces mías como para pasar el rato). Pero no me avivé de fijarme en tu componente a ver si estaba lo que necesitaba jajaja
De todos modos, si alguno tiene tu componente sería bueno que se fijen ahí, está mejor programado que lo que hago yo.
Y lo de subirlo al FTP, súbanlo si quieren. No tengo problema. No lo subí porque ni siquiera llega a ser un componente.
Saludos!

BrunoBsso 22-11-2010 06:14:14

Cita:

Empezado por BrunoBsso (Mensaje 382944)
Neftali, mirá que tengo tu componente eh. Lo uso para muchas cosas que hago (boludeces mías como para pasar el rato). Pero no me avivé de fijarme en tu componente a ver si estaba lo que necesitaba jajaja
De todos modos, si alguno tiene tu componente sería bueno que se fijen ahí, está mejor programado que lo que hago yo.
Y lo de subirlo al FTP, súbanlo si quieren. No tengo problema. No lo subí porque ni siquiera llega a ser un componente.
Saludos!

Y me olvidaba de responderte :P
No probé con las WMI. Prácticamente no las uso. En casos cuando no consigo lo que necesito, por mñas que me mate intentando, recién ahí miro si las WMI lo tienen. No me resultan muy prácticas para entenderlas.
Saludos!

Neftali [Germán.Estévez] 22-11-2010 12:04:26

Cita:

Empezado por BrunoBsso (Mensaje 382944)
Neftali, mirá que tengo tu componente eh.
Y lo de subirlo al FTP, súbanlo si quieren. No tengo problema. No lo subí porque ni siquiera llega a ser un componente.

Realmente el comentario no era para que usaaras mi componente, simplemente para saber si tenías presente que se puede hacer también por WMI. ;)
Aun así puedes utilizar los métodos de la WMI sin necesidad de utilizar ningun componente.

En cuanto a subirlo al FTP, aunque no sea un componente, creo que es un código muy útils que le puede servir a otros "foristas". Lo he subido al directorio comentado antes. Además le he añadido un comentario con tu autoría.

Cita:

Empezado por BrunoBsso (Mensaje 382945)
No me resultan muy prácticas para entenderlas.

Es cierto, que aunque son muy potentes, no son muy intuitivas y sencillas de utilizar.
De todas formas, estamos tratando de que eso cambie... ;)

BrunoBsso 22-11-2010 23:08:20

Cita:

Empezado por Neftali (Mensaje 382964)
Realmente el comentario no era para que usaaras mi componente, simplemente para saber si tenías presente que se puede hacer también por WMI. ;)
Aun así puedes utilizar los métodos de la WMI sin necesidad de utilizar ningun componente.

En cuanto a subirlo al FTP, aunque no sea un componente, creo que es un código muy útils que le puede servir a otros "foristas". Lo he subido al directorio comentado antes. Además le he añadido un comentario con tu autoría.



Es cierto, que aunque son muy potentes, no son muy intuitivas y sencillas de utilizar.
De todas formas, estamos tratando de que eso cambie... ;)

Sí, sí. Sé que tu comentario no era para incentivarme a usar tu componente, pero también sé que está muy completo :D
Buenísimo si lo subiste al FTP, espero que a alguno le sirva.
Saludos!

chelofer11 17-09-2012 17:21:36

Ayuda
 
Hola, soy nuevo en la programacion en Delphi, este codigo me viene muy bien para lo que deseo implementar. Les cuento, soy Referente Informatico en un colegio, el cual, tiene un proyecto del gobierno nacional que le entrega a los alumnos netbooks, en estas, los alumnos instalan diversos juegos, los cuales los utilizan durante el horario de clases. Ahora mi pedido, hay alguna manera de adaptar este codigo para busque y mate los procesos en la red del colegio (ejemplo: CounterStrike (hl.exe))? Les agradezco desde ya por la ayuda que puedan brindarme.

Casimiro Notevi 17-09-2012 17:39:28

En teoría puede servirte.
Lee nuestra guía de estilo, gracias.

chelofer11 18-09-2012 02:17:39

Lastima que la teoria me falta bastante, como dije antes, soy nuevo en delphi, por eso solicite su ayuda

Casimiro Notevi 18-09-2012 10:21:14

Cita:

Empezado por chelofer11 (Mensaje 443347)
Lastima que la teoria me falta bastante, como dije antes, soy nuevo en delphi, por eso solicite su ayuda

Hola, y para eso estamos aquí, para ayudar, pero ¿has leído nuestra guía de estilo?, gracias.

Neftali [Germán.Estévez] 18-09-2012 10:49:17

Cita:

Empezado por chelofer11 (Mensaje 443286)
...tiene un proyecto del gobierno nacional que le entrega a los alumnos netbooks, en estas, los alumnos instalan diversos juegos, los cuales los utilizan durante el horario de clases.
Ahora mi pedido, hay alguna manera de adaptar este codigo para busque y mate los procesos en la red del colegio (ejemplo: CounterStrike (hl.exe))?

Eso podría funcionar si estuviera instalado en el ordenador. No se si esa es la situación que tú tienes. El proceso debería ejecutarse y no poder eliminarse (cosa difícil de controlar).
Si de lo que se trata es de que un proceso mate programas "en la red" (entiendo que quieres matar procesos de los equipos conectados) no es posible.

La solución a ese problema deberá venir de otra forma.


La franja horaria es GMT +2. Ahora son las 00:41:10.

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