Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DLL mehrmals laden / mehrere Instanzen bei einem Prozess (https://www.delphipraxis.net/70268-dll-mehrmals-laden-mehrere-instanzen-bei-einem-prozess.html)

Thomas233 27. Mai 2006 23:02


DLL mehrmals laden / mehrere Instanzen bei einem Prozess
 
Hallo und guten Abend,

in meinem derzeitigen Projekt müsste ich eine Dll mehrmals laden können. Wenn ich eine Dll aber nun per "LoadLibrary" Aufruf mehrmals diesselbe Dll im Hauptpgoramm laden will so bekomme ich immer dasselbe Handle zurück, d.h. die Dll wird tatsächlich nur einmal in den Speicher geladen. Mein Programm erfordert es aber das diese mehrmals geladen werden müsste (es handelt sich dabei um eine Plugin-Dll die mehrmals und gleichzeitig mit verschiedenen Zuständen/Daten arbeiten müsste).
Leider ist das nicht anders möglich da die Verwaltung der verschiedenen Instanzen und damit Daten in der Dll um einiges aufwändiger und auch Speicherintensiver wäre (ich weiss natürlich das man das normalerweise nicht so machen sollte).

Ich hoffe ihr habt mein Problem verstanden.

D.h. nun meine Frage an euch: Wie könnte ich das bewerkstelligen ?

Es handelt sich übrigens um eine Win32-Dll welche zu anderen Programmiersprachen kompatibel ist.

Für einen Tipp wäre ich euch sehr dankbar !

Vielen Dank im Voraus !

Lg,
Thomas

Olli 28. Mai 2006 01:00

Re: DLL mehrmals laden / mehrere Instanzen bei einem Prozess
 
Zitat:

Zitat von Thomas233
in meinem derzeitigen Projekt müsste ich eine Dll mehrmals laden können. Wenn ich eine Dll aber nun per "LoadLibrary" Aufruf mehrmals diesselbe Dll im Hauptpgoramm laden will so bekomme ich immer dasselbe Handle zurück, d.h. die Dll wird tatsächlich nur einmal in den Speicher geladen. Mein Programm erfordert es aber das diese mehrmals geladen werden müsste (es handelt sich dabei um eine Plugin-Dll die mehrmals und gleichzeitig mit verschiedenen Zuständen/Daten arbeiten müsste).

Und wieso kann die nicht gleichzeitig als eine Instanz in verschiedenen Zuständen arbeiten? Das hätte ich doch mal gern erklärt.

Zitat:

Zitat von Thomas233
Leider ist das nicht anders möglich da die Verwaltung der verschiedenen Instanzen und damit Daten in der Dll um einiges aufwändiger und auch Speicherintensiver wäre (ich weiss natürlich das man das normalerweise nicht so machen sollte).

Häh? :shock:
Speicheraufwendiger wird's, wenn du die DLL wirklich mehrfach an verschiedenen Stellen in den Prozeß lädst.

Zitat:

Zitat von Thomas233
D.h. nun meine Frage an euch: Wie könnte ich das bewerkstelligen ?

Umbenennen der DLL on-the-fly (kannst auch andere Endungen als .dll benutzen).

Aber nochmal: das ist Quark, weil dann garantiert alle anderen Instanzen deiner DLL reloziert werden müssen. Außerdem bin ich mir jetzt nicht ganz sicher, weil es in der Exporttabelle m.E. nach den Namen der DLL nochmal im Orginal gibt - den bekommste durch Umbenennen auch nicht weg.

Thomas233 28. Mai 2006 10:56

Re: DLL mehrmals laden / mehrere Instanzen bei einem Prozess
 
Nunja, mein Ziel war es eigentlich die Verwaltung mehrer Zustände/Daten (ich sag einfach mal so dazu) von der Dll fern zu halten da ich das ganze nicht zu kompliziert machen möchte, vor allem deshalb weil später vielleicht auch einmal andere Personen solche Dlls selbst schreiben können sollen.

In der Dll befinden sich nähmlich meistens Fenster/Formulare die nun ohne mehrmaliges laden der Dll auch manuell mehrmals erstellt werden müssten (ich meine jetzt in der Dll durch den Author selbst).
Ausserdem müsste man bei jedem Funktionsaufruf in der Dll unterscheiden können welches Formular/Fenster angezeigt werden soll bzw. welches gerade aktiv ist oder ob eben ein neues erstellt werden soll.
In Delphi wäre das ja z.b. anhand von Arrays oder Listen kein grosses Problem, aber z.b. in C stelle ich mir das nicht so einfach vor.

Dadurch das nun ausserdem verschiedene Dlls verwendet werden müsste ich im Hauptprogramm selbst irgendwie einen Zähler integrieren der herausfindet welches Fenster der aktuellen Dll gerade angezeigt werden soll und die entsprechende Id dann an die Dll übergibt.

Beispiel:
Modul 1)irgendwas.dll -> Fenster 1 (=Fenster-Id 1)
Modul 2)irgendwasanderes.dll -> Fenster 1 (=Fenster-Id 1)
Modul 3)irgendwas.dll -> Fenster 2 (=Fenster-Id 2)

Das würde bedeuten das eine Instanz von irgendwas.dll zwei Fenster verwalten müsste. Im Hauptprogramm selbst musste ich nun z.b. bei Modul 3) eine Funktion in irgendwas.dll aufrufen und gleichzeitig die Fenster-Id "2" mitgeben damit die Dll weiss das mit dem zweiten Fenster gearbeitet wird.

So, ich befürchte das war jetzt etwas etwas kompliziert und evtl. unverständlich, aber anders konnte ich es leider nicht erklären.

Falls jemand eine Idee hat wie man das einfacher lösen könnte (das war halt jetzt einmal meine Idee) dann würde ich mich über eine entsprechende Antwort sehr erfreut.

Vielen Dank !

Mfg.
Thomas

Olli 28. Mai 2006 11:58

Re: DLL mehrmals laden / mehrere Instanzen bei einem Prozess
 
Zitat:

Zitat von Thomas233
Nunja, mein Ziel war es eigentlich die Verwaltung mehrer Zustände/Daten (ich sag einfach mal so dazu) von der Dll fern zu halten da ich das ganze nicht zu kompliziert machen möchte, vor allem deshalb weil später vielleicht auch einmal andere Personen solche Dlls selbst schreiben können sollen.

Alo da gäbe es erstmal verschiedene Herangehensweisen:
1.) die DLL exportiert für jeden Zustand eine Funktion
2.) Stackvariablen werden ja nicht in der DLL sondern im Prozeß verwaltet, also kann man sehr wohl eine Funktion mehrfach "instanziieren". Nichts anderes tust du mit jedem Aufruf einer Funktion in einer DLL. Nur weil CreateFile() in einer DLL realisiert wurde, muß die DLL nicht die vielen vielen Aufrufe verwalten oder gar koordinieren.

Zitat:

Zitat von Thomas233
In der Dll befinden sich nähmlich meistens Fenster/Formulare die nun ohne mehrmaliges laden der Dll auch manuell mehrmals erstellt werden müssten (ich meine jetzt in der Dll durch den Author selbst).

Durch "TFormX.Create()", jupp. und wo ist das Problem? Wenn du bis jetzt deine Formulare bereits in DllMain (zwischen "begin end.") erstellst, machst du was ganz großartig falsch. Wer sagt denn beispielsweise, daß das Plugin nachher wirklich angezeigt wird? Niemand! Aber du erzeugst es womöglich bei jedem Laden der DLL - sinnloserweise.

Zitat:

Zitat von Thomas233
Ausserdem müsste man bei jedem Funktionsaufruf in der Dll unterscheiden können welches Formular/Fenster angezeigt werden soll bzw. welches gerade aktiv ist oder ob eben ein neues erstellt werden soll.

Ähem ja. Da die DLL sicherlich eine Funktion exportiert, sollte es ja wohl kein Problem sein ihr einen Parameter mitzugeben der der DLL mitteilt welches Formular gewünscht wird?!

Zitat:

Zitat von Thomas233
In Delphi wäre das ja z.b. anhand von Arrays oder Listen kein grosses Problem, aber z.b. in C stelle ich mir das nicht so einfach vor.

Listen? Arrays? Wozu denn?

Zitat:

Zitat von Thomas233
Dadurch das nun ausserdem verschiedene Dlls verwendet werden müsste ich im Hauptprogramm selbst irgendwie einen Zähler integrieren der herausfindet welches Fenster der aktuellen Dll gerade angezeigt werden soll und die entsprechende Id dann an die Dll übergibt.

Richtig, man assoziiert ein eigenes "Handle" (das man der DLL ebenfalls übergibt) mit einem Objekt. So kann man intern immer von einem aufs andere abbilden.

Zitat:

Zitat von Thomas233
Beispiel:
Modul 1)irgendwas.dll -> Fenster 1 (=Fenster-Id 1)
Modul 2)irgendwasanderes.dll -> Fenster 1 (=Fenster-Id 1)
Modul 3)irgendwas.dll -> Fenster 2 (=Fenster-Id 2)

Das würde bedeuten das eine Instanz von irgendwas.dll zwei Fenster verwalten müsste. Im Hauptprogramm selbst musste ich nun z.b. bei Modul 3) eine Funktion in irgendwas.dll aufrufen und gleichzeitig die Fenster-Id "2" mitgeben damit die Dll weiss das mit dem zweiten Fenster gearbeitet wird.

Ja und?

Zitat:

Zitat von Thomas233
Falls jemand eine Idee hat wie man das einfacher lösen könnte (das war halt jetzt einmal meine Idee) dann würde ich mich über eine entsprechende Antwort sehr erfreut.

Siehe oben.

Thomas233 28. Mai 2006 13:39

Re: DLL mehrmals laden / mehrere Instanzen bei einem Prozess
 
Hallo,

Zitat:

Zitat von Olli
Zitat:

Zitat von Thomas233
Nunja, mein Ziel war es eigentlich die Verwaltung mehrer Zustände/Daten (ich sag einfach mal so dazu) von der Dll fern zu halten da ich das ganze nicht zu kompliziert machen möchte, vor allem deshalb weil später vielleicht auch einmal andere Personen solche Dlls selbst schreiben können sollen.

Alo da gäbe es erstmal verschiedene Herangehensweisen:
1.) die DLL exportiert für jeden Zustand eine Funktion
2.) Stackvariablen werden ja nicht in der DLL sondern im Prozeß verwaltet, also kann man sehr wohl eine Funktion mehrfach "instanziieren". Nichts anderes tust du mit jedem Aufruf einer Funktion in einer DLL. Nur weil CreateFile() in einer DLL realisiert wurde, muß die DLL nicht die vielen vielen Aufrufe verwalten oder gar koordinieren.

Also das kappiere ich jetzt leider nicht ganz. Die DLL muss ja die verschiedenen Funktionsaufrufe ja auch gar nicht verwalten, sie muss nur immer wissen mit welchem Zustand/Fenster gerade gearbeitet wird.

Zitat:

Zitat:

Zitat von Thomas233
In der Dll befinden sich nähmlich meistens Fenster/Formulare die nun ohne mehrmaliges laden der Dll auch manuell mehrmals erstellt werden müssten (ich meine jetzt in der Dll durch den Author selbst).

Furch "TFormX.Create()", jupp. und wo ist das Problem? Wenn du bis jetzt deine Formulare bereits in DllMain (zwischen "begin end.") erstellst, machst du was ganz großartig falsch. Wer sagt denn beispielsweise, daß das Plugin nachher wirklich angezeigt wird? Niemand! Aber du erzeugst es womöglich bei jedem Laden der DLL - sinnloserweise.
Ich erstelle die Fenster natürlich erst dann wenn sie wirklich gebraucht werden (nicht in Dllmain).

Zitat:

Zitat:

Zitat von Thomas233
In Delphi wäre das ja z.b. anhand von Arrays oder Listen kein grosses Problem, aber z.b. in C stelle ich mir das nicht so einfach vor.

Listen? Arrays? Wozu denn?
Ja wie soll ich den sonst auf die Fenster zugreifen können (ich meine jetzt ohne Api-Funktionen) bzw. wie soll ich den sonst wissen wieviele Fenster ich wo erstellt habe.


Inzwischen habe ich das ganze übrigens wie in meinem vorherigen Thread beschrieben gelöst. Ist zwar nicht die Optimallösung, funktioniert aber immerhin recht gut.

Trotzdem Danke !

Lg,
Thomas

PS: ABWESEND BIS ZUM 04.06.06

Olli 28. Mai 2006 14:13

Re: DLL mehrmals laden / mehrere Instanzen bei einem Prozess
 
Zitat:

Zitat von Thomas233
Also das kappiere ich jetzt leider nicht ganz. Die DLL muss ja die verschiedenen Funktionsaufrufe ja auch gar nicht verwalten, sie muss nur immer wissen mit welchem Zustand/Fenster gerade gearbeitet wird.

Genau. Und dazu wären Callbacks oder andere Methoden geeignet (z.B. könnte es eine Regel sein, daß ein Fenster eines Plugins bestimmte von dir definierte Nachrichten verarbeiten muß).

Zitat:

Zitat von Thomas233
Ich erstelle die Fenster natürlich erst dann wenn sie wirklich gebraucht werden (nicht in Dllmain).

Dann kannst du doch aber bei mehrfachem Aufruf der entsprechenden Funktion auch mehrfach Fenster erzeugen1

Zitat:

Zitat von Thomas233
Ja wie soll ich den sonst auf die Fenster zugreifen können (ich meine jetzt ohne Api-Funktionen) bzw. wie soll ich den sonst wissen wieviele Fenster ich wo erstellt habe.

Durch die Tabelle mit den zuvor beschriebenen Handles. Definiere dir einfach eine Tabelle mit Handles, in der du ein Handle (welches nur dir was sagt) und die Daten des Plugins in Relation setzen kannst.

Thomas233 15. Jun 2006 12:09

Re: DLL mehrmals laden / mehrere Instanzen bei einem Prozess
 
Ja ok, vielen Dank !


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