| Autor |
Beitrag |
Icy Wolf
Hält's aus hier
Beiträge: 1
|
Verfasst: Fr 05.09.03 21:23
Kann mir jemand sagen, wie ich durch Delphi andere Programme schließen kann?
|
|
The-FoX
      
Beiträge: 203
Win XP
D6 Pers
|
Verfasst: Sa 06.09.03 00:54
Du kannst die TerminateExe Funktion benutzen:
Dieses Tutorial steht bei den Faqs von dieser Seite:
in die uses müssen: TLHelp32, PsAPI
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: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| function TerminateEXE(sFile: string): Bool; var verSystem: TOSVersionInfo; hdlSnap,hdlProcess: THandle; bPath,bLoop: Bool; peEntry: TProcessEntry32; arrPid: array [0..1023] of DWord; iC: DWord; i,iCount: Integer; arrModul: array [0..299] of Char; hdlModul: HMODULE; begin result:=false; if ExtractFileName(sFile)=sFile then bPath:=false else bPath:=true; verSystem.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo); GetVersionEx(verSystem); if verSystem.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS then begin hdlSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); peEntry.dwSize:=Sizeof(peEntry); bLoop:=Process32First(hdlSnap,peEntry); while integer(bLoop)<>0 do begin if bPath then begin if CompareText(peEntry.szExeFile,sFile)=0 then begin TerminateProcess(OpenProcess(PROCESS_TERMINATE,false,peEntry.th32ProcessID),0); result:=true; end; end else begin if CompareText(ExtractFileName(peEntry.szExeFile),sFile)=0 then begin TerminateProcess(OpenProcess(PROCESS_TERMINATE,false,peEntry.th32ProcessID),0); result:=true; end; end; bLoop:=Process32Next(hdlSnap,peEntry); end; CloseHandle(hdlSnap); end else if verSystem.dwPlatformId=VER_PLATFORM_WIN32_NT then begin EnumProcesses(@arrPid,SizeOf(arrPid),iC); iCount:=iC div SizeOf(DWORD); for i:=0 to Pred(iCount) do begin hdlProcess:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,false,arrPid[i]); if (hdlProcess<>0) then begin EnumProcessModules(hdlProcess,@hdlModul,SizeOf(hdlModul),iC); GetModuleFilenameEx(hdlProcess,hdlModul,arrModul,SizeOf(arrModul)); if bPath then begin if CompareText(arrModul,sFile)=0 then begin TerminateProcess(OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,False,arrPid[i]), 0); result:=true; end; end else begin if CompareText(ExtractFileName(arrModul),sFile)=0 then begin TerminateProcess(OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,False,arrPid[i]), 0); result:=true; end; end; CloseHandle(hdlProcess); end; end; end; end; |
Zum Aufrufen brauchst du den Namen der Anwendung im Taskmanager. Also für den IExplorer z.B. Iexplore.exe. Oder für Notepad Notepad.exe.
z.B. das auf Button1.click setzen:
Delphi-Quelltext 1:
| TerminateExe ('Notepad.exe'); |
|
|
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Fr 14.08.09 15:37
Ich wollte das ganze gerade mal Testen und es funktioniert nicht.
Es wird Compiliert aber beim Button Klick schließt sich der Editor nicht, und es wird keine Fehlermeldung ausgegeben.
Ich habe Vista64 kann es damit zusammenhängen?
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Fr 14.08.09 16:53
|
|
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: Sa 15.08.09 15:34
Hey danke mit deinem Code funktioniert es, aber warum? Was ist daran anders?
Wenn dann will ich nicht einfach den Code nur kopieren sondern auch komplett verstehen, kannst du ihn vielleicht mal kommentieren?
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Sa 15.08.09 16:19
Hab deinen Code nur oberflächlich durchgesehen, schreckliche Syntax. Im Prinzip macht der Code das selbe nur das er zwischen Win9x und WinNT+ unterscheidet.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| function KillProcess(const ExeName: String):Boolean; var Process: TProcessEntry32; h: THandle; begin Result := False; Process.dwSize := SizeOf(Process); h := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0); try if Process32First(h, Process) then repeat if AnsiLowerCase(Process.szExeFile) = AnsiLowerCase(ExeName) then Result := TerminateProcess(OpenProcess(Process_Terminate, False, Process.th32ProcessID), 0); until (not Process32Next(h, Process)) or Result; finally CloseHandle(h); end; end; |
Mein Code wird aber wohl nur unter Win NT und Abkömmlingen laufen.
| Zitat: | CreateToolhelp32Snapshot-Funktion
Erstellt einen "Schnappschuss" von den System-Threads, Prozessen, Modulen oder Heaplisten und gibt ein entsprechendes Handle zurück.
Betriebssystem: Win95, Win98, WinNT 4.0, Win2000, WinME |
www.vbarchiv.net/api...tetoolhelp32snapshot
|
|
Dude566
      
Beiträge: 1592
Erhaltene Danke: 79
W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
|
Verfasst: So 16.08.09 18:20
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
|
|
|