Hola,
No sé exactamente porqué el error, puesto que el código parece "probado", pero, en todo caso puedes intentarlo con algo como esto, que acabo de probar y parece que funciona bien.
Código Delphi [-]
var
hSnapshot, hProcess: Cardinal;
ProcessEntry: TProcessEntry32;
ModuleEntry: TModuleEntry32;
begin
ProcessEntry.dwSize := SizeOf(TProcessEntry32);
ModuleEntry.dwSize := SizeOf(TModuleEntry32);
hSnapshot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if Process32First(hSnapshot, ProcessEntry) then
repeat
if lstrcmpi('calc.exe', @ProcessEntry.szExeFile) = 0 then
begin
hProcess := OpenProcess(PROCESS_TERMINATE, False, ProcessEntry.th32ProcessID);
TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
Break;
end;
until not Process32Next(hSnapshot, ProcessEntry);
CloseHandle(hSnapshot);
end;
Por cierto, si quitas el "break" que se remarcado, cerrarás todos los procesos con el nombre indicado, y no sólo el "primero" que encuentre la rutina.
El asunto podría quedar más o menos así:
Código Delphi [-]
uses
TlHelp32;
function MatarProcesos(nombre: string): boolean;
var
ModuleEntry: TModuleEntry32;
ProcessEntry: TProcessEntry32;
hSnapshot, hProcess: Cardinal;
begin
result := false;
ModuleEntry.dwSize := SizeOf(TModuleEntry32);
ProcessEntry.dwSize := SizeOf(TProcessEntry32);
hSnapshot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
if Process32First(hSnapshot, ProcessEntry) then
repeat
if (lstrcmpi(PChar(nombre), @ProcessEntry.szExeFile) = 0) then
begin
hProcess := OpenProcess(PROCESS_TERMINATE,
false,ProcessEntry.th32ProcessID);
result := TerminateProcess(hProcess,0);
CloseHandle(hProcess);
end;
until not Process32Next(hSnapshot, ProcessEntry);
CloseHandle(hSnapshot);
end;
|