Entwickler-Ecke
Windows API - Application beenden
renekr - So 20.08.06 15:18
Titel: Application beenden
Hallo,
Ich habe ien kleines Problem.
Ich habe in meinem Programm eine Function KillTask die per Filename externe Applications beendet.
Nun geht die nicht unter Win NT und auch andere wo ich getestet habe .
Hat jemand ev. etwas passendes?
Danke
Delete - So 20.08.06 16:12
renekr hat folgendes geschrieben: |
Nun geht die nicht unter Win NT und auch andere wo ich getestet habe . |
Fehlermeldung? Quellcode? Ansonsten kann man dir wohl nicht großartig helfen bei deinem Problem.
renekr - Mo 21.08.06 10:31
Hallo,
hier meine Function die ich verwende:
W2K +XP super ohne Probleme.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| 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; |
Delete - Mo 21.08.06 10:42
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| uses Tlhelp32;
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;
procedure TForm1.Button1Click(Sender: TObject); begin KillTask('notepad.exe'); end; |
Funktioniert: Windows XP SP2
Was für Prozesses kannst du denn nicht beenden? Gehören dir die Prozesse überhaupt? Prozesse eines anderen Benutzers kann man nämlich nicht beenden.
Kann es sein, dass hier seit Jahren der gleiche unsinnige Code kopiert wird? Oder warum sehe ich jedes mal diesen überflüssigen Cast von ContiunueLoop auf Integer und dann der Vergleich auf ungleich null? :?
Ich würde es so machen?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| uses Tlhelp32;
function KillTask(ExeFileName: string): Boolean; const PROCESS_TERMINATE = $0001; var ContinueLoop : BOOL; FSnapshotHandle : THandle; FProcessEntry32 : TProcessEntry32; begin Result := False; ZeroMemory(@FprocessEntry32, sizeof(TProcessEntry32)); FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if FSnapshotHandle <> INVALID_HANDLE_VALUE then begin FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while ContinueLoop do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then Result := TerminateProcess(OpenProcess(PROCESS_TERMINATE, False, FProcessEntry32.th32ProcessID), 0); ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin if not KillTask('notepad.exe') then ShowMessage(SysErrorMessage(GetLastError)); end; |
renekr - Mo 21.08.06 11:50
Hi,
XP Geht klaro.
Aber Win NT 4 nicht !!!
Das ist mein Problem.
Danke.
Marco D. - Mo 21.08.06 13:04
Kann man hier nicht:
Delphi-Quelltext
1:
| ShowMessage(SysErrorMessage(GetLastError)); |
benutzen? :gruebel:
Vielleicht willst du als eingeschränkter User ja auch Dienste beenden, was nicht möglich ist.
jaenicke - Mo 21.08.06 15:17
Ähh, unter Win NT 4 gibts CreateToolhelp32Snapshot doch noch gar nicht...
Und das steht im Internet auch in allen Referenzen (MSDN, etc.)...
Da steht nur Windows 95, 98, ME, 2000, XP, 2003...
renekr - Mo 21.08.06 17:14
Hi,
sowas war mir fast bewusst.
Fehler kommt nciht nur er beendet das Programm nciht.
Es ist kien Dienst,ich bin Admin auf der Ksite also alle Variablen ausgeschlossen.
Wäre euch dankbar wenn ich eine Funktionierende Version für Nt bekommen könnte,ich habe schon alles für mich mögliche getestet.
Danke
Marco D. - Mo 21.08.06 18:53
Probiere bitte trotzdem mal meine Codezeile aus und schreib mal, was du als Ausgabe erhälst. ;)
renekr - Mo 21.08.06 19:03
Hi,
"Die Zugriffsnummer ist nicht definiert "
Sowohl die exe auf als auch wenn diese zu ist.
Hoffe das hilft dir.
Danke
Delete - Mo 21.08.06 23:24
Das liegt eben daran, dass es die Funktion unter Windows NT nicht gibt. Unter NT musst du mit EnumProcesses arbeiten.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!