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