PDA

Ver la Versión Completa : Matar el proceso de nuestro programa


zurech
08-06-2006, 10:29:13
Este truco, lo que hace es matar el proceso de nuestro programa, finalizando por tanto la aplicación.
Es útil si nuestro programa da pantallazos al cerrarlo y no conseguimos encontrar el error, ya que con este método no los dará.

Nota: Como me contestaron en el foro cuando lo puse, es mucho mejor encontrar el error que hacer este tipo de cosas, pero a unas malas...


{
Esta funcion, como su bonito nombre indica sirve para obtener solo el nombre del EXE, en lugar de la ruta completa
}
function TFrmPrincipal.soloExe(archivo : String) : String;
var
resultado : String;
x : integer;
begin
for x:=1 to Length(archivo) do
begin
if (archivo[x] = '\') then
resultado := ''
else resultado := resultado + archivo[x];
end;

result := resultado;
end;

{
Funcion que mata el proceso de la aplicacion, y sus procesitos (hijos)
}
function TFrmPrincipal.KillTask(FileName:String):integer;
var
ContinueLoop:BOOL;
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
const
PROCESS_TERMINATE=$0001;
begin
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop)<>0 do
begin
if
((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(FileName))
or (UpperCase(FProcessEntry32.szExeFile)=UpperCase(FileName)))
then

Result:=Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE,BOOL(0),

FProcessEntry32.th32ProcessID),0));
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;

{
Procedimiento que mata el proceso de nuestro programa
}
procedure TFrmPrincipal.Terminar();
begin
try
KillTask (soloExe(Application.ExeName));
except on exception do end;
end;