Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Sonstiges (https://www.delphipraxis.net/45-library-sonstiges/)
-   -   Delphi Weitere Programm-Instanzen verhindern mit Parameterübergabe (https://www.delphipraxis.net/73562-weitere-programm-instanzen-verhindern-mit-parameteruebergabe.html)

Shaman 19. Jul 2006 22:10


Weitere Programm-Instanzen verhindern mit Parameterübergabe
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hey there

Hier eine Komplettlösung für das oft behandelte Thema, nur eine Anwendungsinstanz zuzulassen und dabei die Kommandozeilen-Parameter an die bereits laufende Instanz weiterzugeben.

OneInstance.pas
  • Einfache Anwendung: Die Unit muss lediglich in einer beliebige Uses-Klausel (Optimal: In der Projektdatei) aufgeführt werden, um weitere Anwendungsinstanzen zu verhinden. Diese werden dabei frühstmöglich beendet, sodass Formulare und andere Ressourcen gar nicht erst geladen werden.
  • Über den Prozedurenzeiger NewInstProc kann eine Ereignisprozedur festgelegt werden, um in der laufenden Anwendung z.B. die Kommandozeilen-Parameter der neu gestarteten Instanz auszuwerten und diese ggf. zu beenden:
    Delphi-Quellcode:
    type
      TNewInstProc = procedure(ProcessId: Cardinal; CmdLine: string; var Allow: Boolean);

    var
      NewInstProc: TNewInstProc;
  • Kompakt gehaltene NonVCL-Unit, wenig Overhead

InstanceCheck.pas
  • Enthält die Komponente TInstanceCheck, über welche sich die Einstellungen für OneInstance bequem über den OI verwalten lassen
  • Benötigt weniger Ressourcen als ein Timer

You're welcome
Shaman

[edit=Daniel G] Mfg, Daniel G[/edit]

Mithrandir 8. Mär 2010 11:27

Re: Weitere Programm-Instanzen verhindern mit Parameterüberg
 
himitsu hat ein paar Anmerkungen und Verbesserungen in die beiden Units einfließen lassen:

Zitat:

[..]
- theoretisch müßte es jetzt unter allen Delphi-Versionen lauffähig sein
- Probleme wird es aber ab Win7 geben, wenn z.B. die laufende Instanz Adminrechte besitzt und die neue Instanz mit geringeren Rechten (einfacher Benutzer) gestartet wurde, dann dann kann aus "Sicherheitsgründen" (laut MS) die Windowsbotschaft nicht verschickt werden, da dieses geblockt wird.

Weitere behobene Dinge:

In ExtractParams konnte es zu einem Problem kommen, wenn es keine Parameter gibt.
P1 := Pointer(S); liefert in soeinem Fall einen NIL-Pointer und z.B. while P1^ <> #0 do läuft beim dereferenzieren in eine Exception.

Beim NewInstProc (TNewInstProc) wurde der Parameter ProcessId mit cbData (der Datenlänge des TCopyDataStruct) gefüllt ... hab dort jetzt schnell erstmal wenigstens das Window-Handle eingetragen.
Die aktualisierte Version befindet sich im ersten Beitrag.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf