AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Prozess beenden funktioniert nicht - Alternative?
Thema durchsuchen
Ansicht
Themen-Optionen

Prozess beenden funktioniert nicht - Alternative?

Ein Thema von simlei · begonnen am 16. Feb 2007 · letzter Beitrag vom 19. Feb 2007
Antwort Antwort
Seite 1 von 2  1 2      
simlei

Registriert seit: 23. Nov 2005
119 Beiträge
 
Delphi 7 Professional
 
#1

Prozess beenden funktioniert nicht - Alternative?

  Alt 16. Feb 2007, 22:35
Hi!
Mein Problem ist, dass ich versuche, mit einem Programm Prozesse zu beenden... Und hat auch alles mit dem Code aus dsdt.info geklappt, aaber seit Patch 2.0.6 (imho) klappt das mit WoW.exe nicht mehr :/ .
Der Code ist folgender:

Delphi-Quellcode:
function KillTask(const AExeName: string): boolean;
var
  p: TProcessEntry32;
  h: THandle;
begin
  Result := false;
  p.dwSize := SizeOf(p);
  h := CreateToolHelp32Snapshot(TH32CS_SnapProcess, 0);
  try
    if Process32First(h, p) then
      repeat
        if AnsiLowerCase(p.szExeFile) = AnsiLowerCase(AExeName) then
          Result := TerminateProcess(OpenProcess(Process_Terminate,
                                                 false,
                                                 p.th32ProcessID),
                                     0);
      until (not Process32Next(h, p)) or Result;
  finally
    CloseHandle(h);
  end;
end;
Versuche ich den Prozess mit dem Taskmanager zu killen klappt das einwandfrei, aber eben mit dieser Routine nicht. Ich kann mich jetzt irren, aber ist der taskmanager nicht auch ein ganz normales Programm?
Also muss es ja auch irgendwie klappen, den Prozess zu beenden, mit firefox.exe zB hats auch wunderbar geklappt u.a.

Idee, anyone?
danke schonmal!

-- Edith möchte euch noch sagen, dass World of Warcraft sich auch nicht als Service registriert hat...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Prozess beenden funktioniert nicht - Alternative?

  Alt 16. Feb 2007, 23:32
Was sagt den MSDN-Library durchsuchenGetLastError?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Prozess beenden funktioniert nicht - Alternative?

  Alt 16. Feb 2007, 23:50
Moin simlei,

Du solltest auch mal die Routine etwas "entzerren".
Dadurch, dass Du OpenProcess direkt in das TerminateProcess gelegt hast, kannst Du gar nicht prüfen, ob OpenProcess überhaupt funktioniert hat.
Ausserdem solltest Du das Handle, dass OpenProcess, im Erfolgsfalle, zurückgibt wieder mit CloseHandle freigeben.
Dass ggf. der Prozess dazu nicht mehr existiert spielt für die Resourcen Deines Programmes keine Rolle.

Der Taskmanager ist zwar ein Programm, dass aber nicht im Shell-, sondern im Systemkontext gestartet wird. Es ist ein Unterprozess der Winlogon.exe (System\Session Manager Subsystem\Winlogon)

Das Blizzard an solchen Zugriffsmöglichkeiten dreht ist mir schon bei einem Patch zu Diablo 2 aufgefallen.
Zuerst konnte ich problemlos den Adressraum lesen und schreiben, nach einem Patch ging das auf einmal nicht mehr, so dass ich diese Aktionen über einen Service mit Systemrechten erledigen musste
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
simlei

Registriert seit: 23. Nov 2005
119 Beiträge
 
Delphi 7 Professional
 
#4

Re: Prozess beenden funktioniert nicht - Alternative?

  Alt 17. Feb 2007, 09:32
hm...
Wie kann ich so ein Programm als Servce registrieren?

€: GetLastError als Integer liefert 18...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Prozess beenden funktioniert nicht - Alternative?

  Alt 17. Feb 2007, 10:51
Na dann guck mal im MSDN nach, was das bedeutet oder lass es dir im Klartext mit Delphi-Referenz durchsuchenSystemErrorMessage ausgeben.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
simlei

Registriert seit: 23. Nov 2005
119 Beiträge
 
Delphi 7 Professional
 
#6

Re: Prozess beenden funktioniert nicht - Alternative?

  Alt 17. Feb 2007, 11:04
hm hmhmhm

interessant: Es wird (Mit SysErrorMessage) für den Fehler bei Killtask mit WoW ausgegeben. "Keine weiteren Dateien mehr vorhanden". Wenn aber zB auch der Firefox beendet werden soll, er läuft aber gerade garnicht, kommt dort derselbe Fehler.
Versteckt sich WoW jetzt vor der KillTask-Funktion, und wie kann ich das beheben? (zB mit registrierung als Dienst?)
Wenn ja, wie?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Prozess beenden funktioniert nicht - Alternative?

  Alt 17. Feb 2007, 12:35
Moin simlei,

prüfe doch erst einmal, ob OpenProcess überhaupt korrekt funktioniert.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
17. Feb 2007, 12:38
Dieses Thema wurde von "Christian Seehase" von "VCL / WinForms / Controls" nach "Windows API / MS.NET Framework API" verschoben.
Doch wohl eher ein API-Problem
simlei

Registriert seit: 23. Nov 2005
119 Beiträge
 
Delphi 7 Professional
 
#9

Re: Prozess beenden funktioniert nicht - Alternative?

  Alt 17. Feb 2007, 20:17
Ich habe jetzt die Funktion "entzerrt" - folgendermaßen:

Delphi-Quellcode:
function KillTask(const AExeName: string): boolean;
var
  p: TProcessEntry32;
  h: THandle;
  Process: Cardinal;
begin
  Result := false;
  p.dwSize := SizeOf(p);
  h := CreateToolHelp32Snapshot(TH32CS_SnapProcess, 0);
  try
    if Process32First(h, p) then
      repeat
        if AnsiLowerCase(p.szExeFile) = AnsiLowerCase(AExeName) then
        begin
          Process := OpenProcess(Process_Terminate, false, p.th32ProcessID);
          Result := TerminateProcess(Process, 0);
        end;
      until (not Process32Next(h, p)) or Result;
  finally
    CloseHandle(h);
  end;
end;
Ich habe p dann mal überwacht, als AExeName 'WoW.exe' war...
Dabei ist das Programm garnicht bis zu OpenProcess gekommen, da in diese If-Anweisung garnicht gesprungen wurde:
Delphi-Quellcode:
if AnsiLowerCase(p.szExeFile) = AnsiLowerCase(AExeName) then
        begin
          Process := OpenProcess(Process_Terminate, false, p.th32ProcessID);
          Result := TerminateProcess(Process, 0);
        end;
Dann hab ich mir mal p angeschaut... p wurde mit

(296, 0, 0, 0, 0, 1, 0, 0, 0, ('[', 'S', 'y', 's', 't', 'e', 'm', ' ', 'P', 'r', 'o', 'c', 'e', 's', 's', ']', #0, 'û', 'ý', '', #24, #0, #0, #0, 'Ð', #7, #0, #0, 'X', 'ú', #18, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, '<', #0, '>', #0, #0, 'ü', 'ý', '', 't', #7, #0, #0, '„', 'ú', #18, #0, 'Ê', '/', '', '|', #3, #0, #31, #0, #0, #0, #0, #0, #0, 'ü', 'ý', '', 'Ø', 'ú', #18, #0, #30, #0, #31, #0, 'à', 'ú', #18, #0, 'œ', 'ú', #18, #0, '’', 'Õ', '‘', '|', '»', '›', '€', '|', 't', #7, #0, #0, #12, 'ý', #18, #0, 'Ù', #21, 'j', 't', 't', #7, #0, #0, ' ', '.', #21, #0, '¥', 'ö', 'k', 't', '|', #6, #16, #0, #2, #0, #0, #0, '£', 'À', #0, #0, 'x', 'â', #20, #0, 'x', 'â', #20, #0, #2, #0, #0, #0, '(', #0, 'ì', #0, #0, #0, #0, #0, 'x', 'â', #20, #0, 'È', 'q', #20, #0, '(', 'á', #20, #0, 'Ð', #13, #21, #0, #0, #0, #0, #0, 'à', 'ú', #18, #0, 'M', 'S', 'C', 'T', 'F', '.', 'S', 'e', 'n', 'd', 'R', 'e', 'c', 'e', 'i', 'v', 'e', '.', 'E', 'v', 'e', 'n', 't', '.', 'I', 'A', 'O', '.', 'I', 'C', #0, #0, #1, #0, #0, #0, 'Ð', 'ú', #18, #0, 'p', 'ý', #18, #0, 'p', 'ý', #18, #0, '”', #4, 'Ô', 'w', #8, 'ˆ', 'Ñ', 'w', 'ÿ', 'ÿ', 'ÿ', 'ÿ', #16, #0, #0, #0, '°', '3', 'ˆ', '|', 'l', 'û', #18, #0, #0, #0, #0, #0, 'Æ', 'Z', 'A', #0))

angezeigt...
Dabei ist p.szExeFile dann gleich

('[', 'S', 'y', 's', 't', 'e', 'm', ' ', 'P', 'r', 'o', 'c', 'e', 's', 's', ']', #0, 'û', 'ý', '', #24, #0, #0, #0, 'Ð', #7, #0, #0, 'X', 'ú', #18, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, '<', #0, '>', #0, #0, 'ü', 'ý', '', 't', #7, #0, #0, '„', 'ú', #18, #0, 'Ê', '/', '', '|', #3, #0, #31, #0, #0, #0, #0, #0, #0, 'ü', 'ý', '', 'Ø', 'ú', #18, #0, #30, #0, #31, #0, 'à', 'ú', #18, #0, 'œ', 'ú', #18, #0, '’', 'Õ', '‘', '|', '»', '›', '€', '|', 't', #7, #0, #0, #12, 'ý', #18, #0, 'Ù', #21, 'j', 't', 't', #7, #0, #0, ' ', '.', #21, #0, '¥', 'ö', 'k', 't', '|', #6, #16, #0, #2, #0, #0, #0, '£', 'À', #0, #0, 'x', 'â', #20, #0, 'x', 'â', #20, #0, #2, #0, #0, #0, '(', #0, 'ì', #0, #0, #0, #0, #0, 'x', 'â', #20, #0, 'È', 'q', #20, #0, '(', 'á', #20, #0, 'Ð', #13, #21, #0, #0, #0, #0, #0, 'à', 'ú', #18, #0, 'M', 'S', 'C', 'T', 'F', '.', 'S', 'e', 'n', 'd', 'R', 'e', 'c', 'e', 'i', 'v', 'e', '.', 'E', 'v', 'e', 'n', 't', '.', 'I', 'A', 'O', '.', 'I', 'C', #0, #0, #1, #0, #0, #0, 'Ð', 'ú', #18, #0, 'p', 'ý', #18, #0, 'p', 'ý', #18, #0, '”', #4, 'Ô', 'w', #8, 'ˆ', 'Ñ', 'w', 'ÿ', 'ÿ', 'ÿ', 'ÿ', #16, #0, #0, #0, '°', '3', 'ˆ', '|', 'l', 'û', #18, #0, #0, #0, #0, #0, 'Æ', 'Z', 'A', #0)

und natürlich wird in die Anweisungen nicht gesprungen... Frage ist nun natürlich, warum es beim Firefox zB funktioniert, aber bei WoW.exe nicht? p.szExeFile war beim firefox ja auch gleich dem exe-Namen...

Ich bin sehr angewiesen auf eine Lösung; es wäre nett wenn jemand eine findet, ich bin am Ende mit meinem Latein...
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Prozess beenden funktioniert nicht - Alternative?

  Alt 17. Feb 2007, 20:57
Moin simlei,

schau Dir mal den Anfang von szExeFile genau an:
'[', 'S', 'y', 's', 't', 'e', 'm', ' ', 'P', 'r', 'o', 'c', 'e', 's', 's', ']', #0

Entspricht als String
[System Process]

Das wäre also der (Pseudo)Prozess mit der ID 0.

Das was hinter der #00 steht, ist halt das, was gerade im Speicher stand, als szExeFile gefüllt wurde. Da die #00 den String terminiert, ist alles, was davor steht das, womit verglichen wird.
Da [System Process] der Rückgabewert von Process32First gewesen sein dürfte: Geh' doch mal im Einzelschritt durch, was die nächsten Werte sind, oder lass Dir die Prozessnamen einfach mal der Reihe nach ausgeben.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz