Autor Beitrag
Icy Wolf
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Fr 05.09.03 21:23 
Kann mir jemand sagen, wie ich durch Delphi andere Programme schließen kann?
The-FoX
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 203

Win XP
D6 Pers
BeitragVerfasst: 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
ausblenden volle Höhe 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:
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..1023of DWord; iC: DWord; 
    i,iCount: Integer; arrModul: array [0..299of 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<>0then 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:
ausblenden Delphi-Quelltext
1:
TerminateExe ('Notepad.exe');					
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Fr 14.08.09 16:53 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
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.


Was meldet ShowMessage(SysErrorMessage(GetLastError));?

Versuchs mal damit:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
uses
  TLHelp32;

...

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;


user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe Vista64 kann es damit zusammenhängen?

Kann gut sein das die Unit TLHelp32 nicht mit einem 64Bit OS harmoniert, trägt ja auch ein 32 im Namen.
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: 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.

ausblenden 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); //erstellt eine Liste der laufenden Prozesse
  try
   if Process32First(h, Process) then  //Nimmt sich den ersten Prozess vor
    repeat
     if AnsiLowerCase(Process.szExeFile) = AnsiLowerCase(ExeName) then Result := TerminateProcess(OpenProcess(Process_Terminate, False, Process.th32ProcessID), 0);  //ist der Dateiname des Prozesses gleich dem Parameter ExeName wird terminateProccess aufgerufen um den Prozess zu beenden
    until (not Process32Next(h, Process)) or Result; //Weiter zum nächsten Prozess falls vorhanden
  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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: So 16.08.09 18:20 
user profile iconAndreas L. hat folgendes geschrieben Zum zitierten Posting springen:
Hab deinen Code nur oberflächlich durchgesehen, schreckliche Syntax. Im Prinzip macht der Code das selbe nur das er zwischen Win9x und WinNT+ unterscheidet.


Ich bin nicht der Threadersteller und somit war es auch nicht mein Code. :wink:

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.