Partager via


GetProcAddress

Traite explicitement la liaison à un appel DLL GetProcAddress pour obtenir l’adresse d’une fonction exportée dans la DLL. Vous utilisez le pointeur de fonction retourné pour appeler la fonction DLL. GetProcAddress prend comme paramètres le handle de module DLL (retourné par LoadLibrary, AfxLoadLibraryou GetModuleHandle) et prend le nom de la fonction que vous souhaitez appeler ou l’ordinal d’exportation de la fonction.

Étant donné que vous appelez la fonction DLL par le biais d’un pointeur et qu’il n’existe aucune vérification de type au moment de la compilation, assurez-vous que les paramètres de la fonction sont corrects afin de ne pas dépasser la mémoire allouée sur la pile et de provoquer une violation d’accès. Une façon de fournir une sécurité de type consiste à examiner les prototypes de fonction des fonctions exportées et à créer des typesdefs correspondants pour les pointeurs de fonction. Par exemple :

typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
...

HINSTANCE hDLL;               // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
DWORD dwParam1;
UINT  uParam2, uReturnVal;

hDLL = LoadLibrary("MyDLL");
if (hDLL != NULL)
{
   lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
                                           "DLLFunc1");
   if (!lpfnDllFunc1)
   {
      // handle the error
      FreeLibrary(hDLL);
      return SOME_ERROR_CODE;
   }
   else
   {
      // call the function
      uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
   }
}

La façon dont vous spécifiez la fonction souhaitée lors de l’appel de GetProcAddress dépend de la façon dont la DLL a été générée.

Vous ne pouvez obtenir l’ordinal d’exportation que si la DLL à laquelle vous établissez une liaison est générée avec un fichier de définition de module (.def) et si les ordinaux sont répertoriés avec les fonctions de la section EXPORT du fichier .def de la DLL. L’appel de GetProcAddress avec un ordinal d’exportation, par opposition au nom de la fonction, est légèrement plus rapide si la DLL a de nombreuses fonctions exportées, car les ordinaux d’exportation servent d’index dans la table d’exportation de la DLL. Avec un ordinal d’exportation, GetProcAddress peut localiser la fonction directement au lieu de comparer le nom spécifié aux noms de fonction dans la table d’exportation de la DLL. Toutefois, vous devez appeler GetProcAddress avec un ordinal d’exportation uniquement si vous avez le contrôle sur l’affectation des ordinals aux fonctions exportées dans le fichier .def.

Que voulez-vous faire ?

Sur quels éléments souhaitez-vous obtenir des informations supplémentaires ?

Voir aussi

Création de DLL C/C++ dans Visual Studio