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.235
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.286
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.286
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
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 22:14:06.


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