2 Stimmen

Automatisches DLL-Laden in C++ abschalten

Mein Szenario ist wie folgt: meine Anwendung hängt von einer bestimmten DLL (ich verwende es ist lib während Verknüpfung). Jedoch, wenn meine Anwendung ausgeführt wird, möchte ich explizit diese DLL mit LoadLibrary laden. Wenn der Code jedoch einen Bereich erreicht, in dem diese DLL benötigt wird, sucht die Umgebung standardmäßig automatisch nach ihr und lädt sie dann. Ich möchte dieses Verhalten deaktivieren, und wenn die Anwendung einen Punkt erreicht, an dem sie Code ausführen möchte, der zu dieser DLL gehört, ziehe ich es vor, dass sie abstürzt, anstatt sie automatisch zu laden (die DLL wird also nur geladen, weil ich LoadLibrary explizit aufgerufen habe).
In der Zwischenzeit verwende ich die Delay-Load-Fähigkeit (so dass der Load-Trigger nur dann erfolgt, wenn die DLL tatsächlich geladen werden muss). Ich würde es jedoch vorziehen, dass die Anwendung einfach abstürzt, wenn die DLL noch nicht geladen wurde.

Vielleicht kennt jemand von Ihnen eine Möglichkeit, dies zu erreichen?

6voto

Cat Plus Plus Punkte 119072

Wenn Sie Folgendes verwenden möchten LoadLibrary , dann verknüpfen Sie die Anwendung nicht mit der Importbibliothek. Das PE-Format unterstützt keine unaufgelösten Externals, also verwenden Sie entweder Header und dllimport ou LoadLibrary , GetProcAddress und Zeigern auf Funktionen.

4voto

ChrisW Punkte 53239

(Ich verwende seine Lib während der Verknüpfung)

Wenn Sie es manuell laden möchten, verwenden Sie LoadLibrary y GetProcAddress dann sollten Sie nicht seine *.lib Datei an Ihren Linker übergeben.

2voto

Ferruccio Punkte 96076

Sie können das automatische Laden verhindern, indem Sie nicht gegen die Importbibliothek der DLL (die .lib-Datei) linken. Sie können dann LoadLibrary verwenden, um die DLL manuell zu laden, wenn Sie sie benötigen.

Ich habe einen Blogeintrag über diese Art von Dingen veröffentlicht ici .

1voto

MSalters Punkte 166675

Sie können den Delayload-Mechanismus einschalten. einstellen __pfnDliNotifyHook2 an eine von Ihnen bereitgestellte Funktion übergeben, und mit diesem Hook wird Ihre Anwendung einfach beendet.

0voto

Joel Lucsy Punkte 8402

Die Delayload-Funktionalität lädt eine DLL erst bei ihrem ersten Funktionsaufruf, nicht im Anwendungsbereich. Wenn Sie globale Initialisierungen haben, die diese DLL aufrufen, dann ist das vielleicht der Grund, warum Sie denken, dass es auf dem Anwendungsbereich basiert. Meine Firma verwendet die Technik des Aufrufs von LoadLibrary vor der Verwendung ohne Probleme. Ich schlage vor, dass Sie Ihrem Problem weiter auf den Grund gehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X