2009-09-07 4 views
6

Ich brauche dringend Hilfe, ich muss eine Anwendungsabhängigkeit in Visual Studio verwalten. Die Anwendung verweist nur auf eine bestimmte Windows-Version auf eine DLL, sagen wir Windows 7. Und in anderen Umgebungen sollte die DLL nicht geladen werden. Wie kann ich das mit DLL Delay Loading erreichen, da dieses Thema für mich völlig neu ist und es für dieses spezielle Thema keine guten Referenzen gibt.Delay Loading DLLs

Grüße

+1

Fragen Sie, wie verzögertes Laden funktioniert oder wie Sie es anwenden können? – xtofl

Antwort

8

Ihr Projekt können festlegen, dass eine DLL hängt es von soll aber bei Bedarf geladen werden, indem es in dem Linker/Input/Delay geladenen DLLs Feld angeben. Diese Einstellung kann für verschiedene Buildkonfigurationen unterschiedlich sein.

+0

Thx für die Antwort Mann, aber Sie können giva ein Beispiel oder Code-Schnipsel, wenn es anwendbar :) –

+4

Das ist der Punkt der Verzögerung laden: Es ist eine Konfiguration Sache, keine Code-Sache. – xtofl

+0

Der Wortlaut scheint falsch zu sein: Wenn Sie sagen, dass die DLL, von der Sie abhängig sind, mit der Ladekapazität für Verzögerungen verknüpft sein sollte, beziehen Sie sich anscheinend auf die Erstellung dieser DLL aus den zugehörigen OBJ-Dateien. Das Flag/DELAY wird tatsächlich auf das Modul angewendet, das das Modul _importing_ ausführt, nicht das Modul _imported_. Das ist auch der Grund, warum Sie Windows 2000 DLLs verzögern können, die ohne diese Unterstützung erstellt worden wären. – MSalters

1

Anstatt die Verzögerung beim Laden zu verwenden, haben Sie in Betracht gezogen, dynamicloading mit LoadLibrary und GetProcAddress zu verwenden? Dies ist wahrscheinlich einfacher zu verwenden.

typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); 

// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise. 

PGNSI pGNSI; 
SYSTEM_INFO si; 

ZeroMemory(&si, sizeof(SYSTEM_INFO)); 

pGNSI = (PGNSI) GetProcAddress(
    GetModuleHandle(TEXT("kernel32.dll")), 
    "GetNativeSystemInfo"); 
if(NULL != pGNSI) 
    pGNSI(&si); 
else GetSystemInfo(&si); 
+9

Wie ist es einfacher, Code zu schreiben, der vom Linker automatisch erzeugt werden kann? – xtofl

+2

ist in Ordnung, wenn Sie nur 1 Funktion haben, die Sie anrufen möchten ... sonst ist es eine einfache schlechte Wahl, imo. – Goz

+3

-1 - die Unterstützung für das Laden von Verzögerungen im Linker soll speziell verhindern, dass Sie LoadLibrary() und GetProcAddress() behandeln müssen! – Bids

10

MSDN hat eine ziemlich gute Beschreibung here.

Grundsätzlich, was Sie tun, ist die DLL in Frage zu setzen, um in der Verzögerung laden Abschnitt sein. Es wird dann diese DLL nicht laden, bis Sie eine Funktion aufrufen, die sich in dieser DLL befindet.

Aus dem obigen Link:

Der Visual C++ Linker unterstützt nun die verzögerte Laden von DLLs. Dieses befreit Sie von der Notwendigkeit, die Windows SDK-Funktionen LoadLibrary und GetProcAddress zu verwenden, verzögerte DLL laden zu implementieren.

Vor Visual C++ 6.0 war die einzige Möglichkeit zum Laden einer DLL zur Laufzeit mit LoadLibrary und GetProcAddress; Das Betriebssystem würde die DLL laden, wenn die ausführbare Datei oder DLL, die es verwendet, geladen wurde. Wenn Sie mit Visual C++ 6.0 eine statische Verknüpfung mit einer DLL herstellen, bietet der Linker Optionen zum Verzögern des Ladens der DLL, bis das Programm eine Funktion in dieser DLL aufruft.

Eine Anwendung kann verzögern laden eine DLL mithilfe der /DELAYLOAD (Delay Load Import) Linker-Option mit einer Hilfsfunktion (Standardimplementierung von Visual C++ bereitgestellt). Die Hilfefunktion lädt die DLL bei Ausführung Zeit durch Aufrufen von LoadLibrary und GetProcAddress für Sie.

Sie sollten Verzögerung Laden einer DLL betrachten, wenn

Ihr Programm keine Funktion in der DLL aufrufen kann.

Eine Funktion in der DLL wird möglicherweise erst spät in der Ausführung Ihres Programms aufgerufen.

Das verzögerte Laden einer DLL kann während der Erstellung von entweder ein .EXE- oder ein .DLL-Projekt angegeben werden. Ein .DLL-Projekt, das das Laden einer oder mehrerer DLLs verzögert, sollte einen verzögerungsgeladenen Einstiegspunkt in Dllmain nicht selbst aufrufen.