Externes Programm beenden

Hallo,
Ich möchte ein laufendes (von mir geschriebenes) Programm vor der Installation eines Updates beenden, damit die Installation die alte Version auch ersetzt.

Nun ist das so, das das laufende Programm ins Systray minimiert sein kann. Außerdem gibt es die Option das Programm über das „Schließen Kreuz“ rechts oben nicht zu beenden, sondern nur zu minimieren,

Natürlich kann ich den User in der readme.txt dazu auffordern das Programm zu beenden. Aber da gibt es doch sicher eine elegantere Lösung.

Ich würde mich sehr über einen Lösungsvorschlag freuen.
Am besten Idiotensicher, da ich noch nicht so der Profi bin :wink:

Danke schon mal
Mike

So gehts
Hallo,

das machst du folgendermaßen:

...
uses Windows, TlHelp32, SysUtils;
...

// Das ist die Funktion, die du benötigst:
// Sie schießt ein Programm ab, welches mit der "FileName"
Variable definiert wird
function KillTask(FileName: string): Integer; stdcall;
var
 ContinueLoop: BOOL;
 FSnapshotHandle: THandle;
 FProcessEntry32: TProcessEntry32;
begin
 Result := 0;
 FSnapshotHandle := CreateToolhelp32Snapshot($2, 0);
 FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
 ContinueLoop := Process32First(FSnapshotHandle,
FProcessEntry32);

 while Integer(ContinueLoop) 0 do begin
 if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))
=
 UpperCase(FileName)) or
(UpperCase(FProcessEntry32.szExeFile) =
 UpperCase(FileName))) then
 Result := Integer(TerminateProcess(
 OpenProcess($1,
 BOOL(0),

FProcessEntry32.th32ProcessID),
 0));
 ContinueLoop := Process32Next(FSnapshotHandle,
FProcessEntry32);
 end;
 CloseHandle(FSnapshotHandle);
end;

// Zum Aufruf folgende Zeile in die Aufruf-Method schreiben:
**KillTask('C:\programm.exe');**

Sollte funktionieren. Bei mir hat es geklappt (D7)

lg der Chris

KillTask(‚C:\programm.exe‘);

Sollte funktionieren. Bei mir hat es geklappt (D7)

Hallo Chris,
endlich hatte ich mal Zeit deinen Vorschlag zu testen. Das funktioniert auch gut, solange ich den Pfad zum Programm weiß.
Nur kann ich im Voraus natürlich nicht wissen wohin das Programm installiert wurde.
Kannst du mir sagen wie ich das aus der Registry auslesen kann?

Danke schon mal
Mike

Kein Problem…
klar, kein Problem:

uses Registry;

function InstallPath: string
var
 Reg: TRegistry;
 S: string
begin
 Reg := TRegistry.Create;
 Reg.RootKey := HKEY\_CURRENT\_USER;
 if Reg.OpenKey('Software\DeinName\ProgrammName', False) then 
 S := Reg.ReadString('InstallPath');
 Reg.CloseKey;
 Reg.Free;
 if S[Length(s)] '\' then S := S + '\'
 Result := S;
end;

Aufruf erfolgt dann mit

 KillTask(InstallPath+'Programm.exe')

Dieses Beispiel nutzt die VCL. Geht natürlich auch in Win32API, ist aber komplizierter.
In diesem Beispiel holt das Programm den Pfad aus der Stringvariable „InstallPath“ im Schlüssel „HKEY_CURRENT_USER\Software\DeinName\ProgrammName“ .

LG

Super, danke!
Wenn ich mal wieder richtig Zeit habe werde ich das gleich ausprobieren.

Tschüss
Mike