Einzelnen Beitrag anzeigen

renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#13

Re: Programm durch Delphi Programm beenden?

  Alt 22. Aug 2006, 17:16
Hallo,
Ich habe es mittlerweile per Enumprocess hinbekommen.

Delphi-Quellcode:
uses PsApi;

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;
PS: Ich hatte oder habe alle Rechte für das PRogramm,weil es ja auch von mir kommt,nur zum updaten muss i es zu machen,weil das 1. programm das 2. staret und das 2. das 1. updatet *GG*

danke
  Mit Zitat antworten Zitat