DLL Instanzenzähler auslesen
-
WAS hast Du denn genau vor? Warum willst Du das wissen?
Du kannst natürlich eine Variable deklarieren, welche dann im Shared-Memory landet... und dann von allen Instanzen der DLL verwendet werden kann.
-
Du könntest auch einen Semaphore nehmen um die Zählung durchzuführen.
Nur was nützt Dir die Info, wenn der Usage Count im Moment n ist. Genau in diesem Moment ist die Information schon wieder veraltet und ein Prozess kann Deine DLL geladen haben...

-
Jochen Kalmbach schrieb:
WAS hast Du denn genau vor? Warum willst Du das wissen?
Muss ich kurz ausholen. Die DLL bietet neben weiteren 2 Funktionen an, die eine bestimmte Aktion anstarten bzw. wieder beenden.
Sinnvoll wäre hier also wohl ein gemeinsamer Zähler, auf den alle geladenen DLL-Instanzen gemeinsam zugreifen können (statische Variable?).
Ich möchte nun beim Aufruf der Funktion, welche die Aktion startet wissen, wie oft dies verteilt über alle geladenen DLL-Instanzen bereits passiert ist. Dazu wird der gemeinsame Zähler ausgelesen.
Beim Aufruf der Funktion, welche die Aktion beendet soll der gemeinsame Zähler wieder dekrementiert werden.
Die Frage ist nun, wie man diesen gemeinsamen Zähler innerhalb einer DLL programmiert und zwar auch so, dass nebenläufige Zugriffe sequenziert werden (nur eine DLL-Instanz soll zu einem Zeitpunkt den Zähler lesen oder schreiben können).
Geht das denn, ohne dass man ein Risiko schafft, dass eine DLL-Instanz an dem Semaphor (oder was immer dann zum Einsatz kommt) ewig wartet, weil die Instanz, die gerade den Zugriff auf den gemeinsamen Zähler hat abgeschossen wurde oder abgestürzt ist oder andere Probleme hat?
Ciao
-
Es ist sicherlich einfach es so zu gewährleisten das nur ein Prozess inkrementiert oder ausliest.
Aber das ist nicht Dein Problem. Du musst gewährleisten, dass für den Zeitraum in dem Du das ganze prüfst (als Lesen, Test und Reaktion) kein weiterer Prozess dazukommt.
Da ist es aber längst dazu gekommen,dass ein anderer Prozess die DLL evtl. schon iweder geladen hat...IMHO ist das auf Low-Level Ebene in der DLL nicht zu erreichen.
-
Mit einem "named" Semaphore sollte das aber gehen...
CreateSemaphore / WaitForSingleObject / ReleaseSemaphore
-
Eine noch nicht genannte Möglichkeit für einen Instanzenzähler können auch Mutex-Objekte bieten. Jede neue Instanz versucht der Reihe nach die namentlich festgelegten Mutex-Objekte einzurichten. Belegte Objekte liefern einen Fehler. Das erste freie Objekt ist dann der Instanzenzähler, den aber dann nur diese Instanz kennt. Ob dieser sehr einfache Weg ausreicht, kann ich nicht beurteilen. Für alles weitere braucht man in irgendeiner Form Shared Memory, notfalls in einer temporären Datei.
Ich weiss, Mutex-Objekte sollen anderen Zwecken dienen. Da sie systemglobal sind, lassen sie ich aber durchaus auch hierfür problemlos einsetzen. Der erforderliche Aufwand ist gering.
-
lol
-
asdca schrieb:
lol
Du schon wieder! Hast du nichts anderes zu tun und was heisst 'lol' - 'Lasse Opel laufen'? Mein Hinweis ist geeignet und könnte dem Fragesteller vielleicht helfen. Jedenfalls geht es!
-
Mein Hinweis ist geeignet
nein.
-
Dann probiere es oder verwende die von asdca vorgeschlagenen Funktion lol(...). Diese findet sich weder bei C noch in der WinApi.
-
bernie du bist mir ne frisbee ey.