Zabijanie usługi

0

Jak wyłączyć proces uruchomiony jako usługa systemowa w Windowsie XP? Procedury tu przytaczane nie radzą sobie z takim przypadkiem... Menadżer zadań za to nie stwarza żadnych problemów...
Pozdrawiam
Kev

0

jezel ichodzi ci o process w systemie to podaj nazwe tego pliku nie wazne czy to exe czy inny po porstu proces sie zabije

function KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := 0;

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(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(OpenProcess(
PROCESS_TERMINATE, BOOL(0),
FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle,
FProcessEntry32);
end;

CloseHandle(FSnapshotHandle);
end;

0

ZIOMBER nareszcie żyje...

Ok, przejde do tematu:

Zabicie services.exe to nie dobry pomysł... jeżeli znasz execa z odpowiednim service (Service As Executable) to zabij jego proces, natomiast jeżeli to biblioteka, to jusz kobminacje (chyba Wywołanie funkcji TerminateService z biblioteki usługi, ale pewien nie jestem)

0

jezel ichodzi ci o process w systemie to podaj nazwe tego pliku nie wazne czy to exe czy inny po porstu proces sie zabije

function KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := 0;

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(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(OpenProcess(
PROCESS_TERMINATE, BOOL(0),
FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle,
FProcessEntry32);
end;

CloseHandle(FSnapshotHandle);
end;

Jak już pisałem wcześniej, procedury i funkcje które były już na forum nie działają w tym przypadku... po prostu taki proces nie zostaje zabity...
Pozdrawiam
Kev

0

OK znalazłem procedurę która rozwiązuje ten problem, może się komuś przydać... Działa właśnie w Windowsach NT/2000/XP

[code]

procedure KillProcess(hWindowHandle: HWND);
var
hprocessID: INTEGER;
processHandle: THandle;
DWResult: DWORD;
begin
SendMessageTimeout(hWindowHandle, WM_CLOSE, 0, 0,
SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult);

if isWindow(hWindowHandle) then
begin
// PostMessage(hWindowHandle, WM_QUIT, 0, 0);

{ Get the process identifier for the window} 
GetWindowThreadProcessID(hWindowHandle, @hprocessID); 
if hprocessID  0 then 
begin 
  { Get the process handle } 
  processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION, 
    False, hprocessID); 
  if processHandle  0 then 
  begin 
    { Terminate the process } 
    TerminateProcess(processHandle, 0); 
    CloseHandle(ProcessHandle); 
  end; 
end; 

end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
KillProcess(FindWindow('notepad',nil));
end;

[/code]

1 użytkowników online, w tym zalogowanych: 0, gości: 1