2013-07-02 6 views
5

Ich bin neu in den „hidden/dark places“ von C++ und ich frage mich, wie eine DLL-Datei aus einem anderen Verzeichnis laden oder ein Unterverzeichnis innerhalb des einen, wo meine aktuelle ausführbare Datei istC++ DLL aus einem Unterverzeichnis laden?

Ex läuft :

./MyAppDirectory 
    /MyApp.exe 
    /SomeDLL.dll 
    /AnotherDLL.dll 
    /SubDirectory 
    /SomeDLL2.dll 
    /AnotherDLL2.dll 
    /YetAnotherDLL.dll 
    /... 

So „MyApp.exe“ lädt automatisch „SomeDLL.dll“ und „AnotherDLL.dll“ von ihrem Stammordner „MyAppDirectory“ ist aber ich möchte in die Lage, auch „SomeDLL2.dll“ zu laden ", AnotherDLL2.dll "," YetAnotherDLL.dll "usw. aus dem Ordner" SubDirectory "im Ordner" MyAppDirectory ".

Ich habe einige Recherchen getan und von dem, was ich die einzigen Lösungen gefunden haben:

  • 1) das Arbeitsverzeichnis der ausführbaren Datei ändern.
  • 2) Legen Sie die DLL-Dateien in das Windows-Stammverzeichnis.
  • 3) Ändern Sie die Umgebungsvariable PATH.

Aber alle von ihnen haben einige schlechte Seiten (nicht erwähnenswert hier) und es ist nicht das, was ich wirklich brauche. Auch eine andere Lösung ist durch "Application Specific Paths!" Das beinhaltet die Arbeit mit der Windows-Registrierung und scheint etwas besser als die zuvor genannten zu sein.

Allerdings muss ich in der Lage sein, dies in "MyApp.exe" mit C++ ohne die Notwendigkeit, externe Methoden zu verwenden.

Ich benutze MinGW 4.7.2 und meine IDE ist Code :: Blocks 12.11 auch mein Betriebssystem ist Windows XP SP3 Pro x86.

Jede Referenz, Tutorial, Dokumentation, Beispiel usw. akzeptiert und danken Ihnen für Ihre Zeit: D

+0

Alle drei Ihrer aufgeführten Liste sind schlechte Ideen. Tu nichts davon. –

+0

mögliches Duplikat von [Ändernder DLL-Suchpfad für statisch verknüpfte DLL] (http://stackoverflow.com/questions/3832290/altering-dll-search-path-for-static-linked-dll) – MSalters

Antwort

2

Wenn Sie nicht explizit sind, um die DLL (in Ihrem Code „von Hand“, mit LoadLibrary(...)) geladen wird, dann müssen Sie die DLL in einem Ort haben, die Windows für DLL aussehen wird, whihc ziemlich viel bedeutet ein von den drei Optionen, über die Sie in Ihrer Frage sprechen.

Bei Verwendung von LoadLibrary können Sie einen relativen oder absoluten Pfad zur DLL angeben.

Beachten Sie, dass es ganz anders ist DLL explizit zu laden und implizit - im expliziten Fall, müssen Sie die LoadLibrary verwenden, und dann GetProcAddress verwenden, um die Adresse der Funktion zu finden, und Sie werden Funktionszeiger verwenden, um rufen Die Funktionen - Dies wird normalerweise nur für Plug-Ins oder ähnliche Funktionen verwendet, wo die DLL eine kleine Anzahl von Funktionen bietet (oft nur eine Factory-Funktion zum Erstellen von Objekten für etwas mit einer generischen Interface-Klasse, und jede DLL hat die gleiche Art von Funktion, um ein Objekt zu erzeugen, um zu tun, was auch immer es tun soll.

Im impliziten Laden müssen Sie in Ihrem Code nichts tun, um die DLL zu verwenden, und die Funktionen aus der DLL scheinen nur so zu sein, als wären sie fest in die Anwendung eingebunden.

+0

Vielen Dank für die erweiterte Antwort, die meine Frage beantwortet: D –

+0

Wenn dies Ihre Frage beantwortet, bitte markieren Sie es als solche. –

+0

Entschuldigung für den Fehler. Ich wurde von jemandem abgelenkt, während ich weiter auf deine Antwort dokumentierte und vergessen habe zu bestätigen. –

0

Sie

LoadLibrary("subFolder\\dynamicLibrary.dll"); 

, die auf DLLs die explizite Verbindung ist, ist es ein wenig härter verwenden sollte als die implizite Verknüpfung (die ich denke, es ist das, was Sie verwenden), aber ich glaube, dass dies der richtige Weg ist, Ihr Ziel zu erreichen

explicit

implicit

+0

Ist diese Methode spezifisch für MSVC oder ich kann es in anderen Compilern wie MinGW (gcc) verwenden? –

+0

Es ist eine WinAPI, so dass Sie in jedem Compiler verwenden können, müssen Sie nur und Kernel32.lib verknüpfen Offensichtlich funktioniert es nur in Windows –

+0

Nein. Sie sollten einen absoluten Pfad verwenden. –