Änderungen an der Hilfsfunktion für das verzögerte Laden von DLLs seit Visual C++ 6.0
Aktualisiert: November 2007
Wenn verschiedene Versionen von Visual C++ auf dem Computer verwendet werden oder wenn eine eigene Hilfsfunktion definiert wird, können die an der Hilfsfunktion für verzögertes Laden von DLLs vorgenommenen Änderungen Auswirkungen aufweisen. Beispiel:
__delayLoadHelper ist jetzt __delayLoadHelper2
__pfnDliNotifyHook ist jetzt __pfnDliNotifyHook2
__pfnDliFailureHook ist jetzt __pfnDliFailureHook2
__FUnloadDelayLoadedDLL ist jetzt __FUnloadDelayLoadedDLL2
Hinweis: |
---|
Wenn die Standardhilfsfunktion verwendet wird, werden sich die Änderungen nicht auswirken. Es sind keine Änderungen beim Aufruf des Linkers zu berücksichtigen. |
Mehrere Versionen von Visual C++
Stellen Sie sicher, dass der Linker delayimp.lib entspricht, wenn Sie verschiedene Versionen von Visual C++ auf dem Computer verwenden. Ist das nicht der Fall, wird ein Linkerfehler auftreten, der darüber informiert, dass es sich entweder bei ___delayLoadHelper2@8 oder ___delayLoadHelper@8 um ein nicht aufgelöstes externes Symbol handelt. Die erste Meldung bedeutet, dass Sie einen neuen Linker mit einer alten Version von delayimp.lib verwenden. Die zweite Meldung bedeutet, dass Sie einen alten Linker mit einer neuen Version von delayimp.lib verwenden.
Tritt ein nicht aufgelöster Linkerfehler auf, führen Sie dumpbin /linkermember:1 für die Datei delayimp.lib aus, die die Hilfsfunktion erwartungsgemäß enthält. Auf diese Weise ermitteln Sie, welche Hilfsfunktion stattdessen definiert wurde. Die Hilfsfunktion kann auch in einer Objektdatei definiert sein. Rufen Sie dumpbin /symbols auf, und suchen Sie nach delayLoadHelper(2).
Wenn Sie den Linker von Visual C++ 6.0 verwenden, gehen Sie folgendermaßen vor:
Führen Sie dumpbin für die LIB-Datei oder die OBJ-Datei der Hilfsfunktion für verzögertes Laden aus, um festzustellen, ob __delayLoadHelper2 in ihr definiert wird. Wenn nicht, tritt beim Verknüpfen ein Fehler auf.
Definieren Sie __delayLoadHelper in der LIB-Datei oder der OBJ-Datei der Hilfsfunktion für verzögertes Laden.
Benutzerdefinierte Hilfsfunktion
Wenn Sie eine eigene Hilfsfunktion definiert haben und die aktuelle Version von Visual C++ verwenden, gehen Sie folgendermaßen vor:
Benennen Sie die Hilfsfunktion in __delayLoadHelper2 um.
Da die Zeiger im Verzögerungsdeskriptor (ImgDelayDescr in delayimp.h) von absoluten Adressen (VAs) zu relativen Adressen (RVAs) geändert wurden, um sowohl in 32-Bit-Programmen als auch in 64-Bit-Programmen erwartungsgemäß zu funktionieren, müssen Sie diese in Zeiger zurückkonvertieren. Eine neue Funktion, PFromRva, wurde eingeführt und ist in delayimp.h enthalten. Sie können diese Funktion für jedes der Felder im Deskriptor verwenden, um es entweder in 32-Bit- oder 64-Bit-Zeiger zu konvertieren. Die Standardhilfsfunktion für verzögertes Laden stellt weiterhin eine gute Vorlage dar, um sie als Beispiel zu verwenden.
Laden aller Importe für eine verzögert geladene DLL
Der Linker kann alle Importe aus einer DLL laden, die als verzögert geladen festgelegt wurde. Weitere Informationen finden Sie unter Laden aller Importe für eine verzögert geladene DLL.