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 2 von 3     12 3      
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.640 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 11:14
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);
Sven Harazim
--
  Mit Zitat antworten Zitat
Mazen

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

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 11:26
Welche uses muss ich für "MakeFileNameFromTimeReadableCompact", "GetLocalComputerName" und "GetLocalUserName" implementieren?
Oder sind das Funktionen welche du dir selbst gestrickt hast?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Welches Programm ist wo geöffnet?

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


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

Geändert von himitsu ( 6. Nov 2012 um 11:33 Uhr)
  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
 
#14

AW: Welches Programm ist wo geöffnet?

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

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.640 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 11:39
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?
Sven Harazim
--
  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
 
#16

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 11:41
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
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.031 Beiträge
 
Delphi 12 Athens
 
#17

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 12:02
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).
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
 
#18

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 12:28
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:
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:
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.
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
Mazen

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

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 12:35
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:

'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
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.640 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 12:46
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.
Sven Harazim
--
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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:46 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