![]() |
AW: Welches Programm ist wo geöffnet?
Also ich erstelle für jede laufende EXE eine Datei im zentralen Verzeichnis, da sieht man gut, was wer wo am laufen hat.
Die nächste Stufe mit Nachrichten verschicken vom Update-Prozess an alle Clients, das sie sich mal beenden sollen, ist natürlich genial. Allerdings müssten dann auch die Zustände in den Clients überprüft werden und ggf der Benutzer zurückgefragt werden. Weil einfach mal den Prozess killen ist ja nicht die LÖsung.
Delphi-Quellcode:
initialization AppHandle := CreateFile(PChar(SYS.TmpDir+ MakeFileNameFromTimeReadableCompact(GetLocalComputerName+'_'+GetLocalUserName +'_'+ ExtractFileName(Application.ExeName)+'_','','APP',true)), GENERIC_READ or GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE or FILE_ATTRIBUTE_TEMPORARY, 0); if AppHandle = INVALID_HANDLE_VALUE then AppHandle := 0; finalization if (AppHandle <> INVALID_HANDLE_VALUE) and (AppHandle <> 0) then CloseHandle(AppHandle); |
AW: Welches Programm ist wo geöffnet?
Welche uses muss ich für "MakeFileNameFromTimeReadableCompact", "GetLocalComputerName" und "GetLocalUserName" implementieren?
Oder sind das Funktionen welche du dir selbst gestrickt hast? |
AW: Welches Programm ist wo geöffnet?
Wir haben in unserem Apps eine Funktion drin "beende Clienten" und "starte Clienten neu".
Jeweils mit Zeitangabe. Die Benutzer sehen dann einen Dialog mit Timeout "Programm muß neu beendet/gestartet werden" ... 10 ... 9 ... 8 ... (natürlich mit mindestens einer Minute) Bei Neustart starten die Anwendungen dann, nach ablauf des Timeouts, eine billige Autostart.exe, mit ihrem Programmpfad als Startparameter (ParamStr(0) + Parameter "-autostart" + Verzögerungszeit) und beenden sich selber. Die autostart.exe (die darf beim Update nicht angetastet/verändert werden, und wenn doch, dann bevor die Neustart initiiert wird) wartet dann etwas und startet die Clienten wieder. (wichtig für die BDEs, wo nicht immer wer davor steht und vorallem da wo kein Benutzer von irgendwas eine Ahnung hat :stupid: ) [edit] MakeFileNameFromTimeReadableCompact ist bestimmt eine "selbsgeschriebene" Funktion. Und ddas andere: Windows? oder siehe erstmal im MSDN, in welcher Headerdatei das definiert ist. Bzw. über Strg+Shift+F in deinen Delphi-Sourcen danach suchen :zwinker: |
AW: Welches Programm ist wo geöffnet?
Zitat:
|
AW: Welches Programm ist wo geöffnet?
Zitat:
|
AW: Welches Programm ist wo geöffnet?
Zitat:
|
AW: Welches Programm ist wo geöffnet?
Delphi-Quellcode:
CloseHandle kann mit 0 und INVALID_HANDLE_VALUE umgehen. Da könnte man das IF auch weglassen.
if (AppHandle <> INVALID_HANDLE_VALUE) and (AppHandle <> 0) then
CloseHandle(AppHandle); Wobei AppHandle dort ja eh niemals INVALID_HANDLE__VALUE sein dürfte, wegen dem IF in initialization, aber ich würde dieses IF weglassen, dann kann AppHandle niemals 0 sein (nach der Initialization, bzw. hinter Createfile). Also einfach ale diese IF weg und gut ist. PS: Wenn FILE_FLAG_DELETE_ON_CLOSE gesetzt ist und wenn man CloseHandle wegläßt, dann bekommt man sogar mit, wenn die Anwendung beim Runterfahren hängen bleibt, also nach dem "CloseHandle" (wenn man es hingeschrieben hätte). |
AW: Welches Programm ist wo geöffnet?
Zitat:
Um diese Datei dann auch von anderer Stelle öffnen zu können muss die Datei so angelegt werden:
Delphi-Quellcode:
Alle anderen greifen auf die Datei dann so zu:
CreateFile( PChar( FFileName ), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_DELETE, nil, CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, 0 );
Delphi-Quellcode:
Um also nun alle laufenden Instanzen des Programms zu ermitteln öffnet man einfach nacheinander diese Dateien, liest den Inhalt heraus und gibt das Handle wieder frei.
CreateFile( PChar( FFileName ), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, 0 );
Um in diese Dateien etwas schreiben oder heraus lesen zu können gibt es ![]() |
AW: Welches Programm ist wo geöffnet?
Ich denke ich muss an Inhalt gar nichts in die Dateien schreiben (?).
Ich bekomme als Startparameter sowieso die Benutzerid des aufrufenden Benutzers mitgegeben. Und für den Computernamen hab ich mir auch schon eine Funktion rausgesucht:
Delphi-Quellcode:
Also würde ich den Dateinamen einfach wie folgt zusammenstellen:
function ComputerName: String;
var Size: DWORD; begin Size := MAX_COMPUTERNAME_LENGTH + 1; SetLength(Result, Size); if GetComputerName(PChar(Result), Size) then SetLength(Result, Size) else Result := ''; end;
Delphi-Quellcode:
Damit hätte ich alle Infos direkt im Dateinamen.
'FFileName_'+ComputerName+'_'+Trim(ParamStr(1))+'.pid'
Trotzdem werde ich mich mal mit dem THandleStream auseinandersetzen falls ich doch mal was rein schreiben muss ;) |
AW: Welches Programm ist wo geöffnet?
ich habe extra nix in die Datei geschrieben um mir eine Verwaltung der ganzen Sache mit einem extra Programm erst mal zu vermeiden.
So schau ich einfach in das Verzeichnis und weiss sofort, wer was am laufen hat. |
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