Entwickler-Ecke

Windows API - Ander Programme schließen


Icy Wolf - Fr 05.09.03 21:23
Titel: Ander Programme schließen
Kann mir jemand sagen, wie ich durch Delphi andere Programme schließen kann?


The-FoX - 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

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:

Delphi-Quelltext
1:
TerminateExe ('Notepad.exe');                    


Dude566 - 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?


Andreas L. - 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:

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 - 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?


Andreas L. - 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); //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

http://www.vbarchiv.net/api/details.php?id=createtoolhelp32snapshot


Dude566 - 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: