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;
var
i: integer;
begin
i := LastDelimiter(' ', AExeName);
if (i = 0) then
i := MaxInt;
Result := Copy(AExeName, 0, i - 1);
end;
function ProcessExists(AExeName: String): boolean;
var
ContinueLoop: LongBool;
FSnapshotHandle: THandle;
FProcess: TProcessEntry32;
FExeFound: TFileName;
begin
AExeName := UpperCase(ClearFileName(AExeName));
Result := False;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcess.dwSize := SizeOf(FProcess);
ContinueLoop := Process32First(FSnapshotHandle, FProcess);
while (ContinueLoop) and NOT(Result) do
begin
FExeFound := UpperCase(ClearFileName(ExtractFileName(FProcess.szExeFile)));
Result := (FExeFound = AExeName);
ContinueLoop := Process32Next(FSnapshotHandle, FProcess);
end;
CloseHandle(FSnapshotHandle);
end;
procedure ExecuteAndWait(AExeName: String; uCmdShow: Cardinal);
var
Path: PAnsiChar;
begin
if NOT(FileExists(AExeName)) then
Exit;
Path := PAnsiChar(AnsiString(AExeName));
WinExec(Path, uCmdShow);
Application.ProcessMessages;
while NOT(ProcessExists(AExeName)) do
Sleep(250);
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;
AExeName := UpperCase(ClearFileName(AExeName));
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcess.dwSize := SizeOf(FProcess);
ContinueLoop := Process32First(FSnapshotHandle, FProcess);
while (ContinueLoop) do
begin
FExeFound := UpperCase(ClearFileName(ExtractFileName(FProcess.szExeFile)));
if (FExeFound = AExeName) then
begin
Result := True;
TerminateProcess(OpenProcess(TERMINATE, BOOL(0), FProcess.th32ProcessID),
0);
if NOT(Iterative) then
GoTo NO_ITERATIVE;
end;
ContinueLoop := Process32Next(FSnapshotHandle, FProcess);
end;
NO_ITERATIVE :
CloseHandle(FSnapshotHandle);
end;
Espero que si alguien lo necesita le sirva.
Saludos.