Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

dll Suchpfad

12 views
Skip to first unread message

Philipp Kraus

unread,
Nov 23, 2012, 1:57:44 PM11/23/12
to
Hallo,

ich habe eine DLL unter MinGW / MSYS erzeugt, von der noch andere DLLs
abhängig sind.
Wenn ich nun diese DLL lade, müssen ja auch alle abhängigen DLLs
geladen werden. Nun sucht
Windows aber immer relativ zu dem Executable bzw in anderen Pfaden. Ich
möchte gerne, dass alle
abhängigen DLLs relativ zu der "Master-DLL" gesucht werden. Wie kann
ich das machen?

Ich habe also

c:\mydllproject\mydll.dll
c:\mydllproject\first.dll
c:\mydllproject\second.dll

c:\myexec\myexec.exe


Wenn mydll.dll geladen wird, soll relativ zu ihr selbst eben auch
first.dll und second.dll geladen werden.
Wie kann ich das realisieren?

Danke

Phil

Schmidt

unread,
Nov 24, 2012, 6:06:51 PM11/24/12
to
Am 23.11.2012 19:57, schrieb Philipp Kraus:

> ich habe eine DLL unter MinGW / MSYS erzeugt, von der noch andere DLLs
> abh�ngig sind.
> Wenn ich nun diese DLL lade, m�ssen ja auch alle abh�ngigen DLLs geladen
> werden. Nun sucht
> Windows aber immer relativ zu dem Executable bzw in anderen Pfaden. Ich
> m�chte gerne, dass alle
> abh�ngigen DLLs relativ zu der "Master-DLL" gesucht werden. Wie kann ich
> das machen?

Falls Du die "Master-Dll" mit Angabe eines absoluten Pfades
l�dtst, dann w�re LoadLibaryEx in Verbindung mit dem Flag:
LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008
interessant, um auch Satelliten-Abh�ngigkeiten verf�gbar
zu machen.

Link dazu:
>
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx

Olaf

Philipp Kraus

unread,
Nov 26, 2012, 8:14:03 AM11/26/12
to
Das klingt schon mal viel versprechend.
Also es geht im Prinzip im folgendes Problem:

Ich habe Java Code, der via JNI Funktionen einer DLL aufruft. Die DLL
ist Teil des Jars und wird
beim Aufruf aus der Jar entpackt und in einen festen Pfad gelegt. D.h.
der Pfad ist definitiv immer
fest vorgegeben. Wenn in dem Pfad schon eine DLL drin ist, wird die DLL
von dort geladen.
Die DLL selbst ist aber gegen weitere DLLs gelinkt, die ebenfalls in
diesem Pfad liegen.
Aktuell lade ich in Java nur meine "master DLL" via
System.LoadLibrary(absoluter Pfad zur DLL)

Danke

Phil

Schmidt

unread,
Nov 26, 2012, 7:33:58 PM11/26/12
to
Am 26.11.2012 14:14, schrieb Philipp Kraus:
> On 2012-11-25 00:06:51 +0100, Schmidt said:
>
>> Am 23.11.2012 19:57, schrieb Philipp Kraus:
>>
>>> ich habe eine DLL unter MinGW / MSYS erzeugt, von der noch andere DLLs
>>> abh�ngig sind.
>>> Wenn ich nun diese DLL lade, m�ssen ja auch alle abh�ngigen DLLs geladen
>>> werden. Nun sucht
>>> Windows aber immer relativ zu dem Executable bzw in anderen Pfaden. Ich
>>> m�chte gerne, dass alle
>>> abh�ngigen DLLs relativ zu der "Master-DLL" gesucht werden. Wie kann ich
>>> das machen?
>>
>> Falls Du die "Master-Dll" mit Angabe eines absoluten Pfades
>> l�dtst, dann w�re LoadLibaryEx in Verbindung mit dem Flag:
>> LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008
>> interessant, um auch Satelliten-Abh�ngigkeiten verf�gbar
>> zu machen.
>>
>> Link dazu:
>> >
>> http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx
>>
>
> Das klingt schon mal viel versprechend.

Das sollte eigtl. klappen, da ich die _Ex-Variante dieses
APIs in Verbindung mit dem erw�hnten Flag hier erfolgreich
immer da einsetze, wo ein normales LoadLibrary beim
indirekten Nachladen von Satelliten-Dlls versagt.

> Also es geht im Prinzip im folgendes Problem:
>
> Ich habe Java Code, der via JNI Funktionen einer DLL aufruft. Die DLL
> ist Teil des Jars und wird
> beim Aufruf aus der Jar entpackt und in einen festen Pfad gelegt. D.h.
> der Pfad ist definitiv immer
> fest vorgegeben. Wenn in dem Pfad schon eine DLL drin ist, wird die DLL
> von dort geladen.
> Die DLL selbst ist aber gegen weitere DLLs gelinkt, die ebenfalls in
> diesem Pfad liegen.
> Aktuell lade ich in Java nur meine "master DLL" via
> System.LoadLibrary(absoluter Pfad zur DLL)

Weiss nicht, was unter der Haube von System.LoadLibrary auf Win-
Sytemen da genau gewrappt wird - falls sich das o.a. Flag in der
einen oder anderen Form nicht in den entspr. Java-Namespaces
wiederfindet, m�sstest Du halt LoadLibraryEx ebenfalls �ber JNI
aufrufen.

Eine weitere Variante w�re noch, die Abh�ngigkeiten "von hinten
aufzurollen" mittels normalem LoadLibrary -> aber zuerst gegen
die Pfade der Satelliten-Dlls. Ein bereits in einen Prozess geladenes
(Dll-)Modul wird in aller Regel gut erkannt, und nicht zweimal
geladen (z.B. wenn das "erneute Laden" dann aus Deiner Master-Dll
heraus passiert).

Interessant in dem Zusammenhang (falls obige Herangehensweise
auch nicht hilft) w�re noch SetDllDirectory:
>
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686203(v=vs.85).aspx

Aber letztgenanntes vielleicht nur "in letzter Not" einsetzen -
bzw. "exakt nach Vorschrift" (inkl. R�cksetzens usw.)... ;-)



Olaf

Florian Haupt

unread,
Nov 27, 2012, 10:18:55 AM11/27/12
to
Hallo Philipp,

> c:\myexec\myexec.exe
>
>
> Wenn mydll.dll geladen wird, soll relativ zu ihr selbst eben auch
> first.dll und second.dll geladen werden.
> Wie kann ich das realisieren?

Erstelle auf dem Zielsystem einen entsprechenden AppPath Eintrag in der
Registry (HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\),
dieser kann auf deinen festen Pfad zeigen und so werden alle DLLs für
deine Anwendung gefunden.

Gruß
Florian


Philipp Kraus

unread,
Nov 30, 2012, 10:03:17 AM11/30/12
to
Das hatte ich gestet, das funktioniert sehr gut

Danke

Phil

Philipp Kraus

unread,
Nov 30, 2012, 10:05:40 AM11/30/12
to
On 2012-11-27 01:33:58 +0100, Schmidt said:

> Am 26.11.2012 14:14, schrieb Philipp Kraus:
>> On 2012-11-25 00:06:51 +0100, Schmidt said:
>>
>>> Am 23.11.2012 19:57, schrieb Philipp Kraus:
>>>
>>>> ich habe eine DLL unter MinGW / MSYS erzeugt, von der noch andere DLLs
>>>> abhängig sind.
>>>> Wenn ich nun diese DLL lade, müssen ja auch alle abhängigen DLLs geladen
>>>> werden. Nun sucht
>>>> Windows aber immer relativ zu dem Executable bzw in anderen Pfaden. Ich
>>>> möchte gerne, dass alle
>>>> abhängigen DLLs relativ zu der "Master-DLL" gesucht werden. Wie kann ich
>>>> das machen?
>>>
>>> Falls Du die "Master-Dll" mit Angabe eines absoluten Pfades
>>> lädtst, dann wäre LoadLibaryEx in Verbindung mit dem Flag:
>>> LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008
>>> interessant, um auch Satelliten-Abhängigkeiten verfügbar
>>> zu machen.
>>>
>>> Link dazu:
>>>>
>>> http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx
>>>
>>
>> Das klingt schon mal viel versprechend.
>
> Das sollte eigtl. klappen, da ich die _Ex-Variante dieses
> APIs in Verbindung mit dem erwähnten Flag hier erfolgreich
> immer da einsetze, wo ein normales LoadLibrary beim
> indirekten Nachladen von Satelliten-Dlls versagt.
>
>> Also es geht im Prinzip im folgendes Problem:
>>
>> Ich habe Java Code, der via JNI Funktionen einer DLL aufruft. Die DLL
>> ist Teil des Jars und wird
>> beim Aufruf aus der Jar entpackt und in einen festen Pfad gelegt. D.h.
>> der Pfad ist definitiv immer
>> fest vorgegeben. Wenn in dem Pfad schon eine DLL drin ist, wird die DLL
>> von dort geladen.
>> Die DLL selbst ist aber gegen weitere DLLs gelinkt, die ebenfalls in
>> diesem Pfad liegen.
>> Aktuell lade ich in Java nur meine "master DLL" via
>> System.LoadLibrary(absoluter Pfad zur DLL)
>
> Weiss nicht, was unter der Haube von System.LoadLibrary auf Win-
> Sytemen da genau gewrappt wird - falls sich das o.a. Flag in der
> einen oder anderen Form nicht in den entspr. Java-Namespaces
> wiederfindet, müsstest Du halt LoadLibraryEx ebenfalls über JNI
> aufrufen.
>
> Eine weitere Variante wäre noch, die Abhängigkeiten "von hinten
> aufzurollen" mittels normalem LoadLibrary -> aber zuerst gegen
> die Pfade der Satelliten-Dlls. Ein bereits in einen Prozess geladenes
> (Dll-)Modul wird in aller Regel gut erkannt, und nicht zweimal
> geladen (z.B. wenn das "erneute Laden" dann aus Deiner Master-Dll
> heraus passiert).
>
> Interessant in dem Zusammenhang (falls obige Herangehensweise
> auch nicht hilft) wäre noch SetDllDirectory:
> >
> http://msdn.microsoft.com/en-us/library/windows/desktop/ms686203(v=vs.85).aspx
>
>
> Aber letztgenanntes vielleicht nur "in letzter Not" einsetzen -
> bzw. "exakt nach Vorschrift" (inkl. Rücksetzens usw.)... ;-)

Ich habe das ganze jetzt so gelöst:
Da ich zur Compilezeit weiss für welches OS übersetzt wird und ich
damit auch die Reihenfolge
der zu ladenden DLLs kenne, kompiliere ich via Präprozessorflag eifnach
die Pfade ein, so dass
ich direkt aus der Javaklasse das LoadLibrary in der richtigen
Reihenfolge aufrufen kann, d.h.
in meinem Fall lade ich zuerst die Sateliten DLLs und zum Schluss die
Master DLL. Die Javaklasse
für das laden wird in Abhängigkeit von OS und Compileroptionen erzeugt

Danke für die hilfreichen Tips

Phil

0 new messages