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
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: Welches Programm ist wo geöffnet?

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

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 11: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.682 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 11: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
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 11:50
Jo, und wenn das Programm mehrfach von dem Benutzer an dem Rechner gestartet wird, dann klappert das so nicht.

Dein Aufruf müsste dann wie folgt sein:

CreateFile( PChar( FFileName ), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, 0 );
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
 
#5

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 11:54
Das das Programm an einem Rechner mehrmals gestartet werden kann hab ich schon mit Hilfe von "CreateMutex" unterbunden
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

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

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 11:56
Jo, und wenn das Programm mehrfach von dem Benutzer an dem Rechner gestartet wird, dann klappert das so nicht.

Dein Aufruf müsste dann wie folgt sein:

CreateFile( PChar( FFileName ), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, 0 );
Doch, das klappt, da die aktuelle Zeit im Dateinamen enthalten ist. Und auf die genaue Millisekunde bekommt das kein Benutzer doppelt hin.
Sven Harazim
--
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 14:03
Jo, und wenn das Programm mehrfach von dem Benutzer an dem Rechner gestartet wird, dann klappert das so nicht.
Es sei dem einem reicht es zu wissen, daß "mindestens" ein Programm an dieser Stelle gestartet ist.

Wird das letzte Programm beendet, dann wird auch automatisch die Datei gelöscht.

FILE_FLAG_DELETE_ON_CLOSE bezieht sich nur auf das erste FileHandle, über welches die Datei erstellt wurde. (danach sollte es IMHO keine Wirkung mehr haben)
Und es zeigt erst seine Wirkung, nachdem kein Handle mehr auf die Datei zeigt (egal wem diese Handles gehörten).
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

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

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 14:17
Na da hab ich mal wieder was gelernt
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
 
#9

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 14:18
Jo, und wenn das Programm mehrfach von dem Benutzer an dem Rechner gestartet wird, dann klappert das so nicht.
Es sei dem einem reicht es zu wissen, daß "mindestens" ein Programm an dieser Stelle gestartet ist.

Wird das letzte Programm beendet, dann wird auch automatisch die Datei gelöscht.

FILE_FLAG_DELETE_ON_CLOSE bezieht sich nur auf das erste FileHandle, über welches die Datei erstellt wurde. (danach sollte es IMHO keine Wirkung mehr haben)
Und es zeigt erst seine Wirkung, nachdem kein Handle mehr auf die Datei zeigt (egal wem diese Handles gehörten).
Nu joar ... das ist alles nicht so wie gedacht ...

Man kann solange ein Handle auf diese Datei bekommen, bis der erste das Handle (mit Flag FILE_FLAG_DELETE_ON_CLOSE) schließt.
Ab diesem Zeitpunkt hat die Datei den Status "Sobald mich keiner mehr sieht, verdufte ich" und jeder Versuch ein Handle auf diese Datei zu bekommen führt zu einem INVALID_HANDLE_VALUE.

Also muss jede Instanz seine eigene Datei verwalten.
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 stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.356 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Welches Programm ist wo geöffnet?

  Alt 6. Nov 2012, 19:00
Die Idee mit den Files ist nicht schlecht!

Ich habe mal in einer DB-Anwendung infach eine Log-Tabelle eingeführt, in der sich die Clients eintragen und zyklisch einen Zeitstempel aktualisieren (dadurch fallen auch "veraltete" Einträge auf).
Beim Schließen tragen sich die Client natürlich aus.

Um einen Wartungsmodus einzustellen erzeuge ich eine ReadOnly.txt bei der Exe (da steht drin, dass die Programmdaten nur noch gelesen werden können).
In einem Timer wird auf die Existenz der Datei geprüft und dann die Txt angezeigt, die Tabellen auf ReadOnly gesetzt und die Form eingefärbt.
Als zweite Möglichkeit wird eine KillAll.txt erzeugt, worauf sich alle Programme beenden (außer meins im AdminModus).

Ist nicht wirklich genial, funktioniert aber ganz zuverlässig.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:55 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