Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Welches Programm ist wo geöffnet? (https://www.delphipraxis.net/171418-welches-programm-ist-wo-geoeffnet.html)

Sir Rufo 6. Nov 2012 11:50

AW: Welches Programm ist wo geöffnet?
 
Jo, und wenn das Programm mehrfach von dem Benutzer an dem Rechner gestartet wird, dann klappert das so nicht.

Dein Aufruf müsste dann wie folgt sein:

Delphi-Quellcode:
CreateFile( PChar( FFileName ), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, 0 );

Mazen 6. Nov 2012 11:54

AW: Welches Programm ist wo geöffnet?
 
Das das Programm an einem Rechner mehrmals gestartet werden kann hab ich schon mit Hilfe von "CreateMutex" unterbunden ;)

sh17 6. Nov 2012 11:56

AW: Welches Programm ist wo geöffnet?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1189967)
Jo, und wenn das Programm mehrfach von dem Benutzer an dem Rechner gestartet wird, dann klappert das so nicht.

Dein Aufruf müsste dann wie folgt sein:

Delphi-Quellcode:
CreateFile( PChar( FFileName ), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, 0 );

Doch, das klappt, da die aktuelle Zeit im Dateinamen enthalten ist. Und auf die genaue Millisekunde bekommt das kein Benutzer doppelt hin.

himitsu 6. Nov 2012 14:03

AW: Welches Programm ist wo geöffnet?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1189967)
Jo, und wenn das Programm mehrfach von dem Benutzer an dem Rechner gestartet wird, dann klappert das so nicht.

Es sei dem einem reicht es zu wissen, daß "mindestens" ein Programm an dieser Stelle gestartet ist.

Wird das letzte Programm beendet, dann wird auch automatisch die Datei gelöscht.

FILE_FLAG_DELETE_ON_CLOSE bezieht sich nur auf das erste FileHandle, über welches die Datei erstellt wurde. (danach sollte es IMHO keine Wirkung mehr haben)
Und es zeigt erst seine Wirkung, nachdem kein Handle mehr auf die Datei zeigt (egal wem diese Handles gehörten).

sh17 6. Nov 2012 14:17

AW: Welches Programm ist wo geöffnet?
 
Na da hab ich mal wieder was gelernt ;-)

Sir Rufo 6. Nov 2012 14:18

AW: Welches Programm ist wo geöffnet?
 
Zitat:

Zitat von himitsu (Beitrag 1189997)
Zitat:

Zitat von Sir Rufo (Beitrag 1189967)
Jo, und wenn das Programm mehrfach von dem Benutzer an dem Rechner gestartet wird, dann klappert das so nicht.

Es sei dem einem reicht es zu wissen, daß "mindestens" ein Programm an dieser Stelle gestartet ist.

Wird das letzte Programm beendet, dann wird auch automatisch die Datei gelöscht.

FILE_FLAG_DELETE_ON_CLOSE bezieht sich nur auf das erste FileHandle, über welches die Datei erstellt wurde. (danach sollte es IMHO keine Wirkung mehr haben)
Und es zeigt erst seine Wirkung, nachdem kein Handle mehr auf die Datei zeigt (egal wem diese Handles gehörten).

Nu joar ... das ist alles nicht so wie gedacht ...

Man kann solange ein Handle auf diese Datei bekommen, bis der erste das Handle (mit Flag FILE_FLAG_DELETE_ON_CLOSE) schließt.
Ab diesem Zeitpunkt hat die Datei den Status "Sobald mich keiner mehr sieht, verdufte ich" und jeder Versuch ein Handle auf diese Datei zu bekommen führt zu einem INVALID_HANDLE_VALUE.

Also muss jede Instanz seine eigene Datei verwalten.

stahli 6. Nov 2012 19:00

AW: Welches Programm ist wo geöffnet?
 
Die Idee mit den Files ist nicht schlecht!

Ich habe mal in einer DB-Anwendung infach eine Log-Tabelle eingeführt, in der sich die Clients eintragen und zyklisch einen Zeitstempel aktualisieren (dadurch fallen auch "veraltete" Einträge auf).
Beim Schließen tragen sich die Client natürlich aus.

Um einen Wartungsmodus einzustellen erzeuge ich eine ReadOnly.txt bei der Exe (da steht drin, dass die Programmdaten nur noch gelesen werden können).
In einem Timer wird auf die Existenz der Datei geprüft und dann die Txt angezeigt, die Tabellen auf ReadOnly gesetzt und die Form eingefärbt.
Als zweite Möglichkeit wird eine KillAll.txt erzeugt, worauf sich alle Programme beenden (außer meins im AdminModus).

Ist nicht wirklich genial, funktioniert aber ganz zuverlässig.

WM_CLOSE 6. Nov 2012 21:31

AW: Welches Programm ist wo geöffnet?
 
Schreib einen Launcher, der aus einem Ordner jeweils die neueste Version der Software startet.

Laufende Programme werden nicht beachtet.
Irgendwann wird der Nutzer das Programm beenden und wenn er es beim nächten mal startet, startet der Launcher das geupdatete Programm.

Oder wenn du das auch verhindern willst, lausche mit Indy auf einem beliebigen freigegbenen Port und warte darauf, dass jemand (du) eine Anfrage "Update" sendet. Sobald die Anfrage eintrifft, öffne eine MessageBox, die dem Nutzer sagt, dass er seine Anwendung gefälligst neuzustarten hat.
(der Vorschlag von Jonas Shinaniganz)

sh17 7. Nov 2012 05:16

AW: Welches Programm ist wo geöffnet?
 
Um zu bestimmen, ob die lokale EXE ein Update benötigt, lesen wir vor jedem Start die Versionsnummer der zentralen Exe aus und vergleichen. Unterscheiden sie sich, ist ein Update nötig. In den Delphi-Einstellungen muss dazu das Häkchen gesetzt werden, das mit jedem Build die Versionsnummer automatisch erhöht wird.
Und auf ungleich prüfen, so können auch ältere Versionen wieder reaktiviert werden.

Ist also die Version unterschiedlich, wird vor dem Start die Exe in den lokalen Cache kopiert. Ist das nicht möglich, weil z.B. noch eine Instanz geöffnet ist, dann wird solange die neue Version vom Server direkt gestartet, bis wieder kopiert werden kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr.
Seite 3 von 3     123   

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