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 19-11-2010
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
Lightbulb [Aporte] Buscar/Matar procesos y ejecutar un EXE

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.
Archivos Adjuntos
Tipo de Archivo: zip Procesos.zip (1,5 KB, 95 visitas)
Responder Con Cita
  #2  
Antiguo 19-11-2010
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.234
Poder: 20
ElKurgan Va camino a la fama
Muchas gracias por el aporte. Le echaremos un vistazo

Saludos
Responder Con Cita
  #3  
Antiguo 19-11-2010
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
Thumbs up Gracias.

Gracias Bruno. Fantástico aporte.

¿Puedes subirlo al FTP del Club? La sección de Componente/Funciones creo que sería la adecuada.
__________________
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 19-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Gracias por el aporte.

Saludos.
Responder Con Cita
  #5  
Antiguo 19-11-2010
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
Una pregunta Bruno, si no te importa.
¿Probaste utilizando WMI? ¿Has encontrado documentación al respecto?
__________________
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
  #6  
Antiguo 22-11-2010
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
Cita:
Empezado por Neftali Ver Mensaje
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!
Responder Con Cita
  #7  
Antiguo 22-11-2010
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
Cita:
Empezado por BrunoBsso Ver Mensaje
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!
Responder Con Cita
  #8  
Antiguo 22-11-2010
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
Cita:
Empezado por BrunoBsso Ver Mensaje
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 Ver Mensaje
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...
__________________
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
  #9  
Antiguo 22-11-2010
BrunoBsso BrunoBsso is offline
Miembro
 
Registrado: nov 2009
Ubicación: Berisso, Buenos Aires, Argentina
Posts: 239
Poder: 15
BrunoBsso Va por buen camino
Cita:
Empezado por Neftali Ver Mensaje
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
Buenísimo si lo subiste al FTP, espero que a alguno le sirva.
Saludos!
Responder Con Cita
  #10  
Antiguo 17-09-2012
chelofer11 chelofer11 is offline
Registrado
NULL
 
Registrado: sep 2012
Posts: 2
Poder: 0
chelofer11 Va por buen camino
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.
Responder Con Cita
  #11  
Antiguo 17-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
En teoría puede servirte.
Lee nuestra guía de estilo, gracias.
Responder Con Cita
  #12  
Antiguo 18-09-2012
chelofer11 chelofer11 is offline
Registrado
NULL
 
Registrado: sep 2012
Posts: 2
Poder: 0
chelofer11 Va por buen camino
Lastima que la teoria me falta bastante, como dije antes, soy nuevo en delphi, por eso solicite su ayuda
Responder Con Cita
  #13  
Antiguo 18-09-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por chelofer11 Ver Mensaje
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.
Responder Con Cita
  #14  
Antiguo 18-09-2012
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
Cita:
Empezado por chelofer11 Ver Mensaje
...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.
__________________
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
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
[Aporte] Guardar archivos binarios en BD PostgreSQL con C++ Builder, ADO y ODBC KATODO C++ Builder 6 26-04-2011 00:08:22
[Aporte] TDecBinHex - Números binarios/decimales/hexa BrunoBsso Varios 17 11-02-2011 14:32:10
[Aporte] TWindowsShortCut BrunoBsso OOP 3 15-06-2010 19:10:00
Aporte: CodigoFuente Tabla Virtual cmm07 Varios 10 03-02-2009 20:13:41
Aporte: Manual firebird (en español) pepitu Firebird e Interbase 6 06-10-2005 16:17:15


La franja horaria es GMT +2. Ahora son las 15:59:07.


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