2016-06-13 8 views
1

Ich habe eine statische Bibliothek geschrieben, die von 3 Librarys a.lib, b.lib, c.dll abhängt. Jetzt habe ich ein Testprojekt geschrieben und es funktioniert gut mit diesem Projekt. Aber es gibt ein anderes Projekt, das diese statische Bibliothek in einer seiner dll say x.dll und später diese DLL im Projekt verwenden.LoadLibrary nie in Visual Studio 2013 C++ Projekt

Jetzt, wenn das Projekt versucht, x.dll mit LoadLibrary zu laden, kehrt es nie zurück und wartet weiter. Ich habe c.dll b.lib und a.lib alle am selben Ort noch immer nicht laden können. Mit Abhängigkeits-Walker versucht, aber kann nicht viel Unterschied mit vor und nach dem Einschließen dieser Bibliothek sehen.

Wie soll ich das Problem identifizieren? Kann ich zufällig jede Abhängigkeit in .lib einschließen? Ich fühlte, seit seiner statischen Bibliothek sollte es alle Abhängigkeiten in sich enthalten. Vielen Dank im Voraus für Ihre Hilfe. Das Projekt ist visuelle C++ in Visual Studio 2013.

+0

Wenn Sie den Deadlock Ihres Programms auf LoadLibrary() sehen, haben Sie immer nur eine Erklärung: Sie haben zu viel Code in Ihren DllMain() - Einstiegspunkt geschrieben. Google "Dllmain Loader Lock" für grundlegende Hilfe. –

Antwort

1

LoadLibrary Aufrufe DllMain() einer DLL-Datei. Es ist wie ein main() für DLL. In DllMain muss etwas festgefahren sein.

Hinweis: Manchmal gibt es keinen DllMain im DLL-Code, aber der Compiler würde automatisch einen erstellen, um globale Variablen mit Konstruktoren zu initialisieren, was ebenfalls zu dem Problem führen könnte.

Um zu klären, könnten Sie LoadLibraryEx mit DONT_RESOLVE_DLL_REFERENCES Set verwenden. Das Flag deaktiviert DllMain und deaktiviert Ladeabhängigkeiten. Wenn es gelingt, ist das Problem in DllMain. (Aber Sie können die DLL nicht jetzt verwenden, fast alle modernen DLLs verhalten incorretly ohne DllMain)

Zum Debuggen, können Ntdll.LdrpCallInitRoutine Breakpoint könnte, wird DllMain() in dieser Funktion aufgerufen.

+0

Danke Keyu. In der Tat scheint das Problem bei DllMain zu liegen. Ich habe LoadLibraryEx mit DONT_RESOLVE_DLL_REFERENCES gesetzt und konnte die Bibliothek laden. Aber wie werde ich dieses Problem los? Sie sagten, dass die DLL damit unbrauchbar sein wird. Kann ich meine Bibliothek irgendwie so kompilieren, dass sie mit LoadLibrary selbst funktioniert? – user888270

+0

Ja, du kannst. Aber Sie müssen eine Menge Code ändern. 1) Sie müssen Ihren Projekttyp von statischer Bibliothek zu dynamischer Bibliothek ändern. 2) markieren Sie alle öffentlichen Funktionen, Mitglieder, Klassen mit dllexport-Deskriptor und Sie müssen möglicherweise eine extra exports.def erstellen, um exportierte Dinge zu klären. Und neu kompilieren. 3) Link-Header-Datei und lib (sie sind nur Verweise auf DLLs, im Gegensatz zu statischen) Dateien zu Ihrem Projekt. 4) Wenn Sie LoadLibrary anstelle einer lib-Datei verwenden müssen, müssen Sie alle exportierten Funktionen als Funktionszeiger deklarieren. Und rufen Sie GetProcAddress auf, um sie zu füllen. –

+0

Außerdem können Sie versuchen, die 'unbrauchbare' DLL zu verwenden. In sehr wenigen Fällen ist es in Ordnung zu verwenden. –

Verwandte Themen