Partager via


Modifications apportées à la fonction d'assistance du chargement différé des DLL depuis Visual C++ 6.0

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

Notes

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 disposez de plusieurs versions de Visual C++ sur votre ordinateur, vérifiez que l'éditeur de liens correspond à delayimp.lib. En cas de non-concordance, l'éditeur de liens génère une erreur signalant ___delayLoadHelper2@8 ou ___delayLoadHelper@8 en tant que 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, qui 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é.

Voir aussi

Référence

Présentation de la fonction d'assistance