![]() |
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 );
|
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 ;)
|
AW: Welches Programm ist wo geöffnet?
Zitat:
|
AW: Welches Programm ist wo geöffnet?
Zitat:
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). |
AW: Welches Programm ist wo geöffnet?
Na da hab ich mal wieder was gelernt ;-)
|
AW: Welches Programm ist wo geöffnet?
Zitat:
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. |
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. |
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) |
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. |
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