Modifications apportées à la fonction d'assistance du chargement différé des DLL depuis Visual C++ 6.0
Mise à jour : novembre 2007
Si plusieurs versions de Visual C++ sont installées sur votre ordinateur ou si vous avez défini votre propre fonction d'assistance, vous risquez d'être touché par les modifications apportées à la fonction d'assistance du chargement différé des DLL. Par exemple :
__delayLoadHelper est maintenant __delayLoadHelper2
__pfnDliNotifyHook est maintenant __pfnDliNotifyHook2
__pfnDliFailureHook est maintenant __pfnDliFailureHook2
__FUnloadDelayLoadedDLL est maintenant __FUnloadDelayLoadedDLL2
Remarque : |
---|
Si vous utilisez la fonction d'assistance par défaut, ces modifications ne vous concernent pas. Les modalités d'appel de l'éditeur de liens restent inchangées. |
Plusieurs versions de Visual C++
Si vous utilisez plusieurs versions de Visual C++ sur votre ordinateur, vérifiez que l'éditeur de liens établit une correspondance avec delayimp.lib. Dans le cas contraire, vous obtenez une erreur de l'éditeur de liens indiquant ___delayLoadHelper2@8 ou ___delayLoadHelper@8 comme un symbole externe non résolu. Le premier symbole implique un nouvel éditeur de liens avec une ancienne bibliothèque delayimp.lib, le dernier implique un éditeur de liens ancien avec une nouvelle bibliothèque delayimp.lib.
Si vous obtenez une erreur d'éditeur de liens non résolue, exécutez dumpbin /linkermember:1 sur la bibliothèque delayimp.lib susceptible de contenir la fonction d'assistance pour savoir quelle est la fonction d'assistance définie à la place. La fonction d'assistance peut également être définie dans un fichier objet ; exécutez dumpbin /symbols et recherchez delayLoadHelper(2).
Si vous êtes certain de disposer de l'éditeur de liens de Visual C++ 6.0 :
Exécutez dumpbin dans le fichier .lib ou .obj de l'assistance de chargement différé pour savoir si elle définit __delayLoadHelper2. Si ce n'est pas le cas, vous constatez une défaillance du lien.
Définissez __delayLoadHelper dans le fichier .lib ou .obj de l'assistance de chargement différé.
Fonction d'assistance définie par l'utilisateur
Si vous avez défini votre propre fonction d'assistance et que vous utilisez la version actuelle de Visual C++, procédez de la façon suivante :
Renommez la fonction d'assistance en __delayLoadHelper2.
Étant donné que les pointeurs du descripteur de différé (ImgDelayDescr dans delayimp.h) ont changé, avec un remplacement des adresses absolues (VA) par des adresses relatives (RVA) qui permet comme prévu un fonctionnement tant dans les programmes à 32 bits que dans ceux qui sont à 64 bits, vous devez les reconvertir en pointeurs. Une nouvelle fonction a été introduite : PFromRva. Elle se trouve dans delayhlp.cpp. Vous pouvez appliquer cette fonction à chacun des champs du descripteur pour les reconvertir en pointeurs 32 ou 64 bits. La fonction d'assistance de chargement différé par défaut reste un bon modèle à utiliser comme exemple.
Chargement de toutes les importations pour une DLL à chargement différé
L'éditeur de liens peut charger toutes les importations à partir d'une DLL à chargement différé. Pour plus d'informations, consultez Chargement de toutes les importations pour une DLL à chargement différé.