Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL doppelt nutzen (https://www.delphipraxis.net/209519-dll-doppelt-nutzen.html)

norwegen60 16. Dez 2021 13:31

DLL doppelt nutzen
 
Hallo,

ich habe eine Treiber-DLL die per RS232 auf ein Messgerät zugreift. Die Anworten des Geräts werden per CallBack an die übergeordnete EXE zurück gegeben.

Ist es möglich, aus einer zweiten EXE festzustellen, ob diese DLL bereits geladen ist und sie auch von dieser zweiten EXE aus zu nutzen?

Mögliches Konflikt-Potential ist kein Problem, da die zweite Anwendung keine Settings vornimmt sondern nur die aktuelle angezeigten Werte auch mitbekommen soll.

Eigenständiges Laden der DLL ist natürlich keine Lösung da der COM besetzt wäre.

Grüße
Gerd

Uwe Raabe 16. Dez 2021 13:50

AW: DLL doppelt nutzen
 
Obwohl die DLL nur einmal geladen wird, wenn sie von zwei Prozessen benutz wird, verwaltet sie für jeden Prozess einen eigenen Datenbereich. Heißt, der Code ist zwar nur einmal da, aber z.B. alle globalen Variablen gibt es für jeden Prozess separat.

Selbst wenn man das irgendwie lösen könnte, steht da immer noch das Problem der gleichzeitigen Verwendung. So könnten beide Prozesse gleichzeitig Daten über den COM-Port lesen oder schreiben. Ich glaube kaum, dass das gut gehen kann.

Ohne genaue Kenntnis des Aufbaus und der Arbeitsweise der DLL kann man aber auch kaum valide Aussagen machen. Eventuell muss man einen Wrapper-Service um die DLL herum bauen, die das alles sauber für mehrere Clients verarbeitet.

Incocnito 16. Dez 2021 13:53

AW: DLL doppelt nutzen
 
Wenn zwei Anwendungen die gleiche DLL benutzen, heißt es quasi nur, dass die den gleichen Programmablauf benutzen.
Jeder mit seinem eigene Head, Cache, RAM, whatever.
Für sowas bliebe dir nur eine eigene EXE zu bauen, die mit dem COM spricht und Aufrufe des COM dann (beispielsweise per REST) mit der Gemeinschaft teilt. Das wäre in deinem Fall zumindest mit höchster Wahrscheinlichkeit das Mittel zur Wahl.

LG Incocnito

Uwe war schneller 😂

norwegen60 16. Dez 2021 14:11

AW: DLL doppelt nutzen
 
Vielen Dank für die schnellen Antworten. Ich hatte geahnt, dass es nicht geht, aber oft gibt es eben doch ein Hintertürchen.

Das Konflikt-Potential ist mir bewusst. Deshalb hatte ich es extra erwähnt.

Ein Wrapper oder eine anderst geartete Zwischenschicht ist nicht möglich, da die eigentliche Anwendung existiert und nicht angefasst werden soll.

Ziel war es, parallel zu dieser Erstanwendung ein Logger zu hängen, der bei bestimmten Grenzwerten/Ereignissen anfängt die Messdaten zu loggen. Wenn man die Anwendung oder DLL ändern könnte, könnte man das direkt dort implementieren. Schön wäre es eben gewesen, ich könnte die Log.exe wie ein Snifferkabel parallel hängen.

himitsu 16. Dez 2021 14:13

AW: DLL doppelt nutzen
 
Du kannst schauen, ob der COM Port frei (du ihn also öffnen kannst) ,
dann wäre die DLL nicht geladen (wenn sie auf den Port zugreift)

Du könntest dir in der EXE selber ein globales "Flag" setzen, wenn dort die DLL geladen wird und das prüfen.
MSDN-Library durchsuchenCreateMutex

Oder du müsstest eben die anderen Prozesse durchgehen, dir da die DLLs auflisten und nachsehn
EnumProcesses OpenProcess MSDN-Library durchsuchenEnumProcessModules GetModuleFileNameEx

[add]
Du könntest auch die TreiberDLL umgenennen,
eine eigene DLL mit den selben öffentlichen Schnittstellen erstellen, welche den Zugriff zur eigentlichen DLL durchreicht.
Und während die Anwendung nicht auf die DLL zugreift, könntest du in deiner DLL oder via IPC zur LoggerEXE die Grenzwerte abfragen/prüfen.

Oder in der NeuenDLL der LogggerEXE mitteilen, wann sie starten kann oder sich beenden soll.
-> wird das Programm gestartet, läd deine DLL (eigentlich die TreiberDLL), dann dem Logger sagen "aufhören" und deine TreiberDLL freigeben, damit das Programm drauf zugreifen kann.
-> wird das Programm wieder beendet (deine DLL entladen), dann "hey Logger, du kannst wieder"
-> und ansonsten einfach nur alle Funktionsaufrufe/Callbacks zwischen TreiberDLL und Programm durchreichen/weiterleiten

Uwe Raabe 16. Dez 2021 15:45

AW: DLL doppelt nutzen
 
Zitat:

Zitat von norwegen60 (Beitrag 1499218)
Schön wäre es eben gewesen, ich könnte die Log.exe wie ein Snifferkabel parallel hängen.

Sowas habe ich schon mal mit Virtuellen Com-Ports realisiert. Man legt zwei virtuelle Ports an und verbindet die mit einem virtuellen Null-Modem Kabel. Die Applikation wird auf den einen virtuellen Port eingestellt und der Sniffer lauscht auf dem anderen und schleift alles auf den realen Port weiter (und umgekehrt). Es gibt aber auch schon fertige Sniffer-Tools für diesen Zweck.

TBx 16. Dez 2021 17:07

AW: DLL doppelt nutzen
 
Wenn ich Dich richtig verstanden habe, dann ist das ein typisches Szenario für einen Proxy.

In dem Fall baust Du Dir eine DLL mit den gleichen öffentlichen Schnittstellen wie die bestehende. Deine DLL macht dann nichts anderes, als alle Aufrufe an die ursprüngliche DLL weiter zu leiten. Dann kannst Du alle Daten, die durch Deine Proxy-DLL laufen beliebig mitloggen.

Wenn es zeitkritisch ist, würde ich den ganzen Datenstrom mitloggen und separat auswerten.

Dann brauchst Du Deine DLL dem Programm nur noch unterzujubeln.

zeras 17. Dez 2021 06:49

AW: DLL doppelt nutzen
 
Wenn du eine weitere serielle Schnittstelle an dem Rechner hast, kannst du das auch hardwareseitig lösen. Dann einfach den RX Port der ersten Schnittstelle mit dem RX Port der 2. Schnittstelle verbinden. Wenn dann der Rechner schnell genug ist und keine Daten verliert, kannst du mit der 2. Schnittstelle alles mitlesen. Es darf dann aber kein Handshake benötigt werden. Das musst du halt sehen, was da an Daten ankommt.
Ist ähnlich den oben beschriebenen, hier nur auf Hardwareebene.
Habe ich auch schon einmal realisiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:38 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