Laden...

Dynamisches Laden von DLLs -> Suchpfad von Windows ändern

Erstellt von peter.goessweiner vor 14 Jahren Letzter Beitrag vor 14 Jahren 6.113 Views
P
peter.goessweiner Themenstarter:in
56 Beiträge seit 2007
vor 14 Jahren
Dynamisches Laden von DLLs -> Suchpfad von Windows ändern

Hallo!

Ich lade meinen Bibliotheken mit der kernel32.dll Methode

private static extern IntPtr LoadLibraryEx(string dllFilePath, IntPtr hFile, uint dwFlags);

Damit lade ich eine 3rd party DLL, welche wiederum andere DLLs lädt.

Hier habe ich allerdings ein Problem, da die Suchreihenfolge zuerst im System32, System, WinRoot, Path Verzeichnissen durchsucht. Wenn bereits eine gleich lautende DLL in System32 drinnen ist, verwendet die 3rd Party Applikation die falsche DLL - es ist leider kein gutes Binding angegeben 😦

Ich habe jetzt zwar schon eine Lösung gefunden, mit der ich die Suchreihenfolge ändern kann. Und zwar indem ich bei LoadLibraryEx einen flag

static uint LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008;

angebe. Dann sucht er die DLLs der 3rd Party application auch im angegebenen Verzeichnis, mit der ich die Methode LoadLibraryEx aufrufe! Ich schätze mal, dass dieses Flag den Nebeneffekt hat, und generell die Suchreihenfolge von Windows für einen Prozess ändert.

Meine Frage:
Kann man die Suchreihenfolge auch mit einer anderen Kernel32 Methode ändern, ohne LoadLibrayEx aufzurufen?

Danke und lg

Peter

1.361 Beiträge seit 2007
vor 14 Jahren

Hi peter,

schaun wir mal, was uns die msdn zu LoadLibraryEx und im speziellen zum ersten Parameter sagt:

If the string specifies a full path, the function searches only that path for the module.

Ok, musst du also nur einen vollständigen Pfad angeben. Dazu musst du wahrscheinlich den Pfad deiner aktuellen Anwendung auslesen.

Zum einen gibt es Directory.GetCurrentDirectory(), allerdings muss das nicht dem StartPfad der Anwendung entsprechen und kann sich zudem auch ändern.

Deshalb hol dir über

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName

den vollständigen Pfad zu deiner Anwendung, und konstruiere dir mit Path.GetDirectoryName sowie Path.Combine den vollständigen Pfad zu deiner DLL.

beste Grüße
zommi

P
peter.goessweiner Themenstarter:in
56 Beiträge seit 2007
vor 14 Jahren

Hallo!

Danke für deine Antwort. Ich suche aber was anderes. Ich erkläre es am besten nochmal: 😃

Ich verwende eine 3rd Party Applikation, welche ich mit einen Plugin erweitere. Dieses Plugin verendet intern einen Browser (XULRUNNER und nicht den Standard Webbrowser - dieser ist viel zu langsam).

Tja soweit so gut...

Der xulrunner verweist wiederum auf andere DLLs, welche er benötigt.

Tja, ist noch immer gut...

Wenn ich nun die 3rd Party Applikation starte, wird mein Plugin initialisiert und die dlls von xulrunner werden geladen.

Und hier fängt das Problem an...

Sagen wir mal, dass mein Programm auf c:\foo liegt. Die xulrunner Dateien liegen unter c:\foo\xulrunner. Hier drinnen liegen auch sämtliche DLLs, welche XULRUNNER benötigt. Das Problem ist nun, dass Windows nach Bibliotheken zuerst in c:\foo, System32, System, Windows-Root,Path Umgebungsvariable und dann erst in c:\foobar\xulrunner sucht.

Sagen wir mal, dass xulrunner die DLL bar.dll benötigt. Wenn im System32 eine alte bar.dll liegt, wird xulrunner diese dll laden und nicht mehr in c:\foo\xulrunner nachschauen, ob eine neuere verfügbar ist (weil er diese ja schon gefunden hat). Falls diese geladene dll zu alt ist, crashed das Programm.

Mit der LoadLibraryEx Methode kann ich einen Parameter setzen, damit die Windows Suche geändert wird. Allerdings bin ich mit dieser Losung nicht ganz zufrieden, da der suchpfad nicht nur für die angegebene DLL, sondern gleich für den gesamten Prozess geändert wird. Das ist schlecht!

Daher nochmals meine Frage:

wie kann ich den suchpfad von Windows ändern, ohne die kernel32 Methode LoadLibraryEx aufzurufen? Hat jemand eine Idee?

Lh

Peter

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo peter.goessweiner,

siehe Eintrag zum Windows Path permanent hinzufügen.

herbivore

P
peter.goessweiner Themenstarter:in
56 Beiträge seit 2007
vor 14 Jahren

Hallo herbivore!

Habe schon die Environement-Path-Variable gesetzt. Auch wenn ich meinen Pfad zu beginn hinzufüge (für den aktuellen prozess) wird jedoch zuerst in System32, System, Windows-Root und dann erst in dem von mir angegeben Verzeichnis (Path-Variable) durchsucht.

Funktioniert bei mir also nicht..

Ich benötige daher wirklich so eine Funktion wie bei LoadLibraryEx.

Das muss doch irgendwie gehen..bei LoadLibraryEx geht es ja...nur möchte ich nicht eine Dummy-DLL laden müssen, damti der Suchpfad geändert ist...

Hat jemand ein Idee?

lg

Peter

1.361 Beiträge seit 2007
vor 14 Jahren

Hi peter,

bei LoadLibraryEx geht es ja...nur möchte ich nicht eine Dummy-DLL laden müssen, damti der Suchpfad geändert ist...

Dann versuchs mit SetDllDirectory.

beste Grüße
zommi

4.506 Beiträge seit 2004
vor 14 Jahren

Hallo Peter,

wird xulrunner diese dll laden und nicht mehr in c:\foo\xulrunner nachschauen, ob eine neuere verfügbar ist

Handelt es sich zufälligerweise um eine .NET Dll (Deine bar.dll)? Weil dann könntest Du eine bestimmte Version beim Laden anfordern.

Wenn Du es z.B. in VS per Referenz hinzufügen würdest, dann kann man dort auch "use specific version" einstellen. Das Ganze funktioniert auch bei einem Assembly.Load.

Falls es sich um keine .NET Dll handelt, dann wird mein Vorschlag nicht helfen.

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

P
peter.goessweiner Themenstarter:in
56 Beiträge seit 2007
vor 14 Jahren

Hi!

Also meine DLL (.NET) kann ich ja beliebig anpassen.

Aber leider binde ich eine 3rd Party DLL ein, welche ich nicht ändern kann. D.h. ich kann dieser leider nicht beibringen, nur bestimmte Versionen einer DLL zu laden.

Aber danke für den Hinweis! 😃

Ich werde heute mal die Version mit SetDLLDirectory testen und melde mich dann wieder.

lg

Peter

Gelöschter Account
vor 14 Jahren

ansonsten kannst du mal versuchen die benötigten dll´s mit absolutem pfad schon vorab manuell zu laden.

P
peter.goessweiner Themenstarter:in
56 Beiträge seit 2007
vor 14 Jahren

@JAck30lena:

Also das habe ich mit LoadLibraryEx versucht -> aber nur wenn ich den flag mit altered.... angebe, greift das programm sofort auf das richtige Verzeichnis zu.

Wie kann ich sonst die DLLs dynamisch laden, damit das Programm beim nächsten Zugriff nicht die lokalen Pfade durchsucht, sondern die DLL aus dem 'Cache' nimmt?

Gelöschter Account
vor 14 Jahren

aber das sollst du doch mit absolutem pfad machen, dann holt er sich schon das richtige und du musst das tun bevor er selbst versucht das zu tun.