![]() |
Prüfen, ob eine Anwendung läuft
Moin,
ich habe aus der Codelibrary folgende Funktion eingesetz: ![]() Allerdings ein wenig verändert, damit es an meine Applikation passt:
Delphi-Quellcode:
mein Aufruf ist folgendermaassen:
function TFrm_login.GetProcessID(Exename: string): DWORD;
var hProcSnap: THandle; pe32: TProcessEntry32; begin result := 0; hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); if hProcSnap <> INVALID_HANDLE_VALUE then begin pe32.dwSize := SizeOf(ProcessEntry32); if Process32First(hProcSnap, pe32) = true then begin while Process32Next(hProcSnap, pe32) = true do begin if pos(Exename, pe32.szExeFile) <> 0 then result := pe32.th32ProcessID; end; end; CloseHandle(hProcSnap); end; end; function TFrm_login.GetProcessHandleFromID(ID: DWORD): THandle; begin result := OpenProcess(SYNCHRONIZE, False, ID); CloseHandle(result); end; function TFrm_login.laufzeitcheck : boolean; var hProcess: THandle; wf: DWORD; begin result := true; hProcess := GetProcessHandleFromID(GetProcessID('Anwendung.exe')); if hProcess = 0 then result := false; // läuft nicht end; if not laufzeitcheck then begin start applikation ... ... ... ... end else begin showmessage('Applikation läuft bereits'); end; Allerdings wird in jedem fall in die Variable hProcess <> 0. Somit kann die Applikation nie gestartet werden. Wer hat eine Idee? Gruss EL |
Re: Prüfen, ob eine Anwendung läuft
Ist logisch, da dein Programm ja schon im Speicher ist, wenn geprüft wird ob dein Programm geladen wird...
|
Re: Prüfen, ob eine Anwendung läuft
Alternativ kannst du auch im OnCreate Ereignis über FindWindow gehen. Da im OnCreate das eigene Fensterhandle noch nicht erzeugt ist, wirst du deine eigene Anwendung somit auch nicht finden, sondern nur eine eventuell laufende.
|
Re: Prüfen, ob eine Anwendung läuft
Zitat:
Gruss EL |
Re: Prüfen, ob eine Anwendung läuft
Du könntest auch ein Semaphore benutzten. Für Details bin ich zu müde. Aber die Delphi-Praxis-Suche sollte trotzdem ausreichen.
Gruß DelphiFreund |
Re: Prüfen, ob eine Anwendung läuft
Meine Idee schlug fehl... Über FindWindow ist die eigene Anwendung bereits findbar. Ne andere Möglichkeit fällt mir aber im Moment auch nicht ein?
|
Re: Prüfen, ob eine Anwendung läuft
Dann bin ich dran:
Delphi-Quellcode:
Die MyGuid sollte eine GUID sein, muss es gaub ich aber nicht
const
MyGUID = 'hex-Zahl'; var Semaphore: THandle; begin ActivationMessage := RegisterWindowMessage(PChar(MyGUID)); Semaphore := CreateSemaphore(nil, 1, 1, PChar(MyGUID)); if (GetLastError = ERROR_ALREADY_EXISTS) then begin ShowMessage('Das Programm läuft schon'); Exit; end; end; Gruß und gute Nacht DelphiFreund |
Re: Prüfen, ob eine Anwendung läuft
Hallo,
das Beispiel von DelphiFreund ist schon ganz gut. Du musst es direkt im Projektquelltext vor dem ersten Application.CreateForm einbauen. P.S. am Ende der Anwendung CloseHandle(Semaphore); nicht vergessen. Ist zwar nicht nötig, da Windows alle Objekthandles selber schliesst wenn der primäre Thread terminiert. Wenn alle Objekthandles geschlossen sind entfernt Windows automatisch das Semaphore-Objekt. Sieht aber besser aus. |
Re: Prüfen, ob eine Anwendung läuft
Sorry, das hab ich vergessen zu erwähnen. Danke für den Hinweis.
|
Re: Prüfen, ob eine Anwendung läuft
Zitat:
ActivationMessage := RegisterWindowMessage(PChar(MyGUID)); Gruss EL |
Re: Prüfen, ob eine Anwendung läuft
Ich glaub man braucht die Unit Windows, oder SysUtils, schau am besten in die Hilfe.
|
Re: Prüfen, ob eine Anwendung läuft
Moin,
so hab den Rat des Kollegen befolgt und diese Routine "geklaut":
Delphi-Quellcode:
const
MyGUID = 'hex-Zahl'; var Semaphore: THandle; ActivationMessage : integer; var b_Ok : Boolean; begin ActivationMessage := RegisterWindowMessage(PChar(MyGUID)); Semaphore := CreateSemaphore(nil, 1, 1, PChar(MyGUID)); if (GetLastError = ERROR_ALREADY_EXISTS) then begin ShowMessage('Manager läuft bereits'+#10#13+ 'und kann nicht mehrfach gestartet werden'); CloseHandle(Semaphore); Exit; end; CloseHandle(Semaphore); progstart := true; Application.Initialize; Einstell := TEinstellungen.Create; Einstell.load; // LOginmaske erzeugen Frm_login := TFrm_login.Create(nil); // durch try finally sicherstellen das Form freigegeben wird try b_Ok := Frm_login.login; finally FreeAndNil(frm_Login); end; progstart := true; if (b_Ok) and (not sfirststart) then begin Application.Title := 'Manager'; Application.CreateForm(TfrmMain, frmMain); Application.CreateForm(TfrmLizenzDaten, frmLizenzDaten); Application.CreateForm(TfrmZinsen, frmZinsen); Application.CreateForm(TPDF, PDF); Application.CreateForm(TfrmNetzwerk, frmNetzwerk); Application.CreateForm(Tprogramminfo, programminfo); Application.Run; end; freeandnil (einstell); end. Es tuet sich leider nix ... Ich kann nach wie vor mehrfach starten. :( Gruss EL |
Re: Prüfen, ob eine Anwendung läuft
Vielleicht kannst Du ja was mit den LMD-TOOLS SE anfangen. Da hab ich was schönes gefunden das ich immer verwende. Ist einfach und funktioniert. Heisst glaub OneInstance oder so. Echt easy.
|
Re: Prüfen, ob eine Anwendung läuft
|
Re: Prüfen, ob eine Anwendung läuft
Zitat:
|
Re: Prüfen, ob eine Anwendung läuft
Zitat:
:wall: :wall: :wall: :wall: :wall: klappt jetzt :wall: :wall: :wall: :wall: Danke !!!! Gruss EL |
Re: Prüfen, ob eine Anwendung läuft
Wenn die bereits laufende Anwendung nicht informiert werden soll, das der Benutzer versucht das Programm mehr als einmal zu starten, dann reicht es auch, wenn du es so schreibst:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} var AppHandle: THandle; initialization AppHandle := CreateSemaphore(nil, 0, 1, '{FCAE1E10-4533-4A5B-9710-05BF647B6A1C}'); if GetLastError = ERROR_ALREADY_EXISTS then Halt(0); finalization if AppHandle <> 0 then CloseHandle(AppHandle); end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz