Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
Delphi 2007 Enterprise
|
Re: Programm durch Delphi Programm beenden?
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
|
|
Zitat
|