Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

sh17 6. Nov 2012 10:14

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);

Mazen 6. Nov 2012 10:26

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?

himitsu 6. Nov 2012 10:30

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:

Sir Rufo 6. Nov 2012 10:35

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

Zitat von sh17 (Beitrag 1189928)
Delphi-Quellcode:
 
finalization

  if (AppHandle <> INVALID_HANDLE_VALUE) and (AppHandle <> 0) then
    CloseHandle(AppHandle);

Den Teil kannst du dir getrost sparen ... aber es sieht irgendwie richtiger aus ;)

sh17 6. Nov 2012 10:39

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

Zitat von Sir Rufo (Beitrag 1189938)
Zitat:

Zitat von sh17 (Beitrag 1189928)
Delphi-Quellcode:
 
finalization

  if (AppHandle <> INVALID_HANDLE_VALUE) and (AppHandle <> 0) then
    CloseHandle(AppHandle);

Den Teil kannst du dir getrost sparen ... aber es sieht irgendwie richtiger aus ;)

Warum?

Sir Rufo 6. Nov 2012 10:41

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

Zitat von sh17 (Beitrag 1189940)
Zitat:

Zitat von Sir Rufo (Beitrag 1189938)
Zitat:

Zitat von sh17 (Beitrag 1189928)
Delphi-Quellcode:
 
finalization

  if (AppHandle <> INVALID_HANDLE_VALUE) and (AppHandle <> 0) then
    CloseHandle(AppHandle);

Den Teil kannst du dir getrost sparen ... aber es sieht irgendwie richtiger aus ;)

Warum?

Weil das Handle auf die Datei beim Beenden der Anwendung automatisch losgelassen wird, sonst würde die Datei bei einem Absturz auch noch auf der Platte herumliegen ... und bei einem Absturz ist die Datei trotzdem weg, obwohl dein Code in finalization nicht aufgerufen wird ;)

himitsu 6. Nov 2012 11:02

AW: Welches Programm ist wo geöffnet?
 
Delphi-Quellcode:
  if (AppHandle <> INVALID_HANDLE_VALUE) and (AppHandle <> 0) then
    CloseHandle(AppHandle);
CloseHandle kann mit 0 und INVALID_HANDLE_VALUE umgehen. Da könnte man das IF auch weglassen.

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).

Sir Rufo 6. Nov 2012 11:28

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

Zitat von sh17 (Beitrag 1189928)
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;

Auch dieser Monster_Unglaublich_Lange_Mit_Informationen_Gespic kte_Dateiname ist nicht nötig, denn man kann diese Informationen einfach in die Datei schreiben. Für den Dateinamen selber nimmt man einfach eine GUID.

Um diese Datei dann auch von anderer Stelle öffnen zu können muss die Datei so angelegt werden:
Delphi-Quellcode:
CreateFile( PChar( FFileName ), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_DELETE, nil, CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, 0 );
Alle anderen greifen auf die Datei dann so zu:
Delphi-Quellcode:
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 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.

Um in diese Dateien etwas schreiben oder heraus lesen zu können gibt es Delphi-Referenz durchsuchenTHandleStream.

Mazen 6. Nov 2012 11:35

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:
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;
Also würde ich den Dateinamen einfach wie folgt zusammenstellen:

Delphi-Quellcode:
'FFileName_'+ComputerName+'_'+Trim(ParamStr(1))+'.pid'
Damit hätte ich alle Infos direkt im Dateinamen.
Trotzdem werde ich mich mal mit dem THandleStream auseinandersetzen falls ich doch mal was rein schreiben muss ;)

sh17 6. Nov 2012 11:46

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.
Seite 2 von 3     12 3      

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