![]() |
Welches Programm ist wo geöffnet?
Hallo Leute...
Folgende Problemstellung: Wir stellen Delphi-Programme auf einem Server für mehrere Clienten bereit die diese von ihren Rechnern aufrufen. Problem ist jetzt, wenn ich ein Update einspielen will, also Änderungen am Programm vorgenommen habe muss ich diese zentrale .exe ersetzen was aber bekannterweise nur möglich ist wenn diese nirgends mehr geöffnet ist. Und da ich nicht weiß wer es grade offen hat wird das immer ein wahnsinns Aufwand ein Programm zu ändern. Die einzig sinnvolle Lösung die mir bisher eingefallen ist, ist das ich irgendwo an einem zentralen Punkt hinschreibe wer welches Programm grade geöffnet hat. (Falls es hier schon andere Ansatze gibt, nur zu ;)) Nur wie setze ich das am besten um? Wäre eine Möglichkeit einfach im "OnCreate" und "OnClose" eine Datei zu schreiben bzw. zu löschen? Und würde das auch funktionieren wenn das Programm z.B. über den Taskmanager abgeschossen wird? Mir kommt diese Lösung nicht optimal vor :/ |
AW: Welches Programm ist wo geöffnet?
Computerverwaltung > System > Freigegebene Ordner > Geöffnete Dateien. ?
Wenn ein Programm abgeschossen wird, oder wenn die Netzwerkverbindung weg ist, dann kann diese Datei natürlich nicht von den Programmen gelöscht werden. :roll: (du müßtest dann lokal versuchen die Dateien zu löschen) Tipp: Geöffnete Dateien (EXE/DLL) kann man dennoch umbenennen und an deren Stellen die neuen Dateien hinkopieren. Bei den geöffneten Programmen bleiben aber dennoch die alten Dateiversionen geladen. (gibt eventuell Probleme, wenn ein aktives Programm, nach dem Austausch, eine der neuen Dateien laden will ... vorallem bei BPLs knallt es dann im Programm gerne mal) Du könntest du aber auf dem Server eine Serveranwendung laufen lassen, wo sich alle Programme anmelden. Da siehst du, wer wo da ist (du kannst die Programme ja nach Programmverzeichnis, Computer-/Benutzernamen und IP befragen) und den Programmen dauch sagen "fahr runter oder starte dich (z.B. in x Minuten) neu". (Letzteres zusammen mit einer kleinen Hilfsanwendung, oder mit Hilfe der Windows-Aufgabenplanung) |
AW: Welches Programm ist wo geöffnet?
Na wenn das Delphi Programme sind, würde Ich diese Programme um eine Verbindung zu einer Server-App erweitern.
Die Server-App zeigt dir an, welche PC-Namen Verbunden sind und mit welcher Anwendung. Dann kannst du vielleicht noch über diese App eine Message auf den Delphi - Programmen ausgeben. ("Bitte schließen Sie die Anwendung" oder direkt killen :) (nein mach das besser nicht) In der ServerApp kannst du vielleicht noch einstellen das bestimmte Programme direkt beim öffnen wieder geschlossen werden sollen, solange ein öffnen verboten ist. (vllt mit Nachricht an den Benutzer) Naja und wenn dann von einem Delphi Programm keine Verbindungen mehr ausgehen kannst du das Update machen. Meine Gedanken dazu... |
AW: Welches Programm ist wo geöffnet?
Zitat:
Zitat:
Wie können denn 2 Delphi-Programm untereinander kommunizieren um sich beispielsweise an- oder abzumelden? Oder wie kann ich Nachrichten aus der Serveranwednung an die Clients senden? Müsste das alles über "dritte Dateien" laufen die das eine Programm schreibt und das andere permanent überwacht und ausliest? Zitat:
Nur fehlen mir dazu ein paar Grundlagen was die Kommunikation zwischen Applikationen angeht. Ich denke ich werd mich dazu mal etwas belesen. Über direkte Hilfe, vielleicht mit verweisen auf entsprechende Seiten wo ich Informationen bekomme, würd ich mich aber auch nicht beklagen ;) |
AW: Welches Programm ist wo geöffnet?
Zitat:
|
AW: Welches Programm ist wo geöffnet?
Aktuell geht das für alle Dateien, welche nicht per "Dateihandle" (CreateFile, also AssignFile, TFileStream und Co.) geöffnet sind.
EXE/DLL/BPL werden quasi per LoadLibrary als MMF geladen und dort läßt es sich umbenennen. Abgesehn davon, wenn sich Fremdprogramme ala Virenscanner einmischen, oder wenn ein OS glaubt es sei intelligent. z.B. wenn man das Programm "nochmals" läd und das OS denkt "ahh, da ist die Datei ja schon geladen, also verwende ich sie jetzt gleich nochmal", anstatt sich die aktuelle Dateiversion zu holen, aber so intelligent ist Windows nicht. :stupid: Aber wenn's geht: Ja, dann laufen die alten Programme weiter und beim Neustart werden dann die neuen Dateiversionen verwendet. Aktuell = WinNT-Reihe (mindestens WinXP, Win7, Win8, Server2003, Server2008, Server2011 und Server2012) |
AW: Welches Programm ist wo geöffnet?
Grad eben konnte ich sie unbennen (das Programm war definitiv in Benutzung) und jetzt gehts nicht mehr :? Wieder die Meldung das das Programm in Benutzung sei.
Also wäre so eine Serveranwednung wohl doch auch von Nöten. |
AW: Welches Programm ist wo geöffnet?
Man kann auch die Dateiverbindungen, jene über die Netzwerkfreigaben, in der genannten Systemsteuerung trennen.
Man darf sich dann nur nicht wundern, wenn die geöffneten Programme komisch reagieren sollten ... das ist so, als wenn man lokal, via FileUnlocker, einfach so die Dateihandle in fremden Anwendungen schließt, aber die Anwendungen selber erstmal nicht erfahren, daß ihnen jetzt der Dateizugriff fehlt ... bis sie dann mal wieder drauf zugreifen wollen und es knallt. Der Server hat aber den Vorteil, daß man die Programme eben geziehlt informieren und ordnungsgemäß runterfahren/neu starten kann. (praktischer, da sie dann erstmal ihr Aufgaben ordentlich beenden können, vorallem wenn ein Bentuzer davor sitzt) |
AW: Welches Programm ist wo geöffnet?
Es geht auch mit Bordmitteln, die Windows bereitstellt:
Um herauszufinden wo überall das Programm läuft kannst du auch mit ![]()
Code:
Dieses funktioniert auch dann, wenn die Anwendung abstürzt.
FILE_FLAG_DELETE_ON_CLOSE
Jede Programminstanz sollte natürlich logischerweise einen anderen Dateinamen benutzen. |
AW: Welches Programm ist wo geöffnet?
@FILE_FLAG_DELETE_ON_CLOSE: Das funktioniert leider nicht über alle Arten der Netzwerkfreigaben, da das Transportprotokoll dieses explizit unterstützen muß.
Lokal ist das aber eine geile Sache, vorallem für temporäre Dateien, welche auch im Falle eines Programmabsturzes ordentlich entfernt würden. :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 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