AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Welches Programm ist wo geöffnet?

Ein Thema von Mazen · begonnen am 6. Nov 2012 · letzter Beitrag vom 7. Nov 2012
Antwort Antwort
Seite 1 von 3  1 23      
Mazen

Registriert seit: 6. Okt 2011
66 Beiträge
 
Delphi 7 Professional
 
#1

Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 10:22
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 :/
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.029 Beiträge
 
Delphi 12 Athens
 
#2

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 10:36
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.
(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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#3

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 10:38
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...
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Mazen

Registriert seit: 6. Okt 2011
66 Beiträge
 
Delphi 7 Professional
 
#4

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 10:48
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.
Das wusste ich gar nicht das das geht. Habe jetzt die alte Datei in "Datei2.exe" umbenannt und die neue Datei "Datei.exe" eingefügt. Das heißt die laufenden Programm laufen natürlich auf der alten Verson weiter. Beim nächsten Start wird dann aber logischerweise die neue Datei geladen!?

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)
Eigentlich wäre mein Problem mit deinem Ansatz oben ja fast schon gelöst. Nur wäre so eine Serveranwendung schon echt komfortabel. Z.b. um Nachrichten an alle (Broadcast) oder nur an bestimmte Nutzer zu senden. Nur leider hab ich da noch keine wirkliche Idee.
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?


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...
Wie oben gesagt find ich die Idee sehr gut, und ich würd sicher auch Spaß am entwickeln finden.
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.194 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 10:53
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.
Das wusste ich gar nicht das das geht.
Darauf sollte man sich nicht verlassen. Das ging einige Jahre mal nicht. Wobei das Verhalten z.B. durch Virenscanner blockiert werden könnte.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.029 Beiträge
 
Delphi 12 Athens
 
#6

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 11:05
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.

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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Mazen

Registriert seit: 6. Okt 2011
66 Beiträge
 
Delphi 7 Professional
 
#7

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 11:06
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.029 Beiträge
 
Delphi 12 Athens
 
#8

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 11:12
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 11:12
Es geht auch mit Bordmitteln, die Windows bereitstellt:

Um herauszufinden wo überall das Programm läuft kannst du auch mit MSDN-Library durchsuchenCreateFile eine Datei erzeugen, die automatisch beim Beenden (bzw. wenn du das Handle loslässt, was beim Beenden automatisch passiert) gelöscht wird
Code:
FILE_FLAG_DELETE_ON_CLOSE
Dieses funktioniert auch dann, wenn die Anwendung abstürzt.

Jede Programminstanz sollte natürlich logischerweise einen anderen Dateinamen benutzen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.029 Beiträge
 
Delphi 12 Athens
 
#10

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 11:14
@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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz