![]() |
Application.Terminate und initialization
Moin,
ich habe in einer Software eine umfangreiche Initialisierung von Hardware. Ich brauche also eine Absicherung gegen einen Mehrfachaufruf des Programms. Die wird in der initialization-Klausel aufgerufen, ebenso wie die Initialisierung der Hardware. Zu Beginn hatte ich das so verwendet:
Delphi-Quellcode:
Im Test schlug das fehl, weil es doch noch Hardwarezugriffe gab.
ProgHandle := CreateMutex(nil, True, 'Anwendung');
if GetLastError = ERROR_ALREADY_EXISTS then begin Application.Terminate; end; Ich habe es erstmal gelöst, indem ich das Terminate durch HALT ersetzt habe, würde aber gerne wissen, ob die Initialisierung des Programms auch bei Terminate noch voll durchlaufen wird oder wie das Verhalten tatsächlich ist. Laut Hilfe ruft Terminate postQuitMessage auf. Wenn das aber erst nach Abschluss der Programminitialisierung verarbeitet wird, muss ich das umstrukturieren. Grüße, Messie |
Re: Application.Terminate und initialization
wo hast du denn diesen Code in dein Programm eingebaut?
du kannst natürlich auch das Programm garnicht erst starten lassen:
Delphi-Quellcode:
begin
Application.Initialize; Application.CreateForm(TForm1, Form1); ProgHandle := CreateMutex(nil, True, 'Anwendung'); if GetLastError <> ERROR_ALREADY_EXISTS then begin Application.Run; end; CloseHandle(ProgHandle); end. // oder begin ProgHandle := CreateMutex(nil, True, 'Anwendung'); if GetLastError <> ERROR_ALREADY_EXISTS then begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end; CloseHandle(ProgHandle); end. // oder ... nja, halt das überspringen, was // in diesem Fall nicht ausgeführt werden soll |
Re: Application.Terminate und initialization
Hallo,
habe keine Lösung, aber einen Vorschlag:
Delphi-Quellcode:
Du muss (denk ich mal) das Programm beenden, bevor die ersten Initialisierungen aufgerufen werden.
begin
ProgHandle := CreateMutex(nil, True, 'Anwendung'); if GetLastError <> ERROR_ALREADY_EXISTS then begin Application.Initialize; Application.CreateForm(TfmMain, fmMain); Application.CreateForm(TfmLogSort, fmLogSort); Application.CreateForm(TfmDatenauswertung, fmDatenauswertung); Application.Run; end; CloseHandle(hMutex); end. |
Re: Application.Terminate und initialization
Jau, die zweite Variante ist gut (sowohl die zweite von himitsu als auch der zweite Post :shock: ). Ich gehe mal davon aus, dass hMutex hier nicht von Bedeutung ist.
Ich hatte in der dpr noch nicht mit eigenen Variablen gearbeitet. Aber das gibt mir einige neue Möglichkeiten. Danke, Messie |
Re: Application.Terminate und initialization
tschuldschung, dieses böse Copy&Paste ... hMutex müßte hier natürlich ProgHandle heißen. :oops:
![]() ![]() ![]() PS: z.B. erst im FormCreate abbrechen zu wollen wäre so, als wenn du nac 200 km bei voller Fahrt auf der Autobahn in den Rückwärtsgang schaltest und sagst "ach nee, ich fahr heut nicht weg und bleib noch 'nen bissl liegen" :angel2: |
Re: Application.Terminate und initialization
Zitat:
Grüße, Messie |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 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-2025 by Thomas Breitkreuz