Dela via


GetProcAddress

Processer som uttryckligen länkar till ett DLL-anrop GetProcAddress för att hämta adressen till en exporterad funktion i DLL:en. Du använder den returnerade funktionspekaren för att anropa DLL-funktionen. GetProcAddress tar som parametrar DLL-modulhandtaget (returneras av antingen LoadLibrary, AfxLoadLibraryeller GetModuleHandle) och tar antingen namnet på den funktion som du vill anropa eller funktionens exportordning.

Eftersom du anropar DLL-funktionen via en pekare och det inte finns någon kontroll av kompileringstidstyp kontrollerar du att parametrarna för funktionen är korrekta så att du inte överskrider det minne som allokerats i stacken och orsakar en åtkomstöverträdelse. Ett sätt att ge typsäkerhet är att titta på funktionsprototyperna för de exporterade funktionerna och skapa matchande typedefs för funktionspekarna. Till exempel:

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);
   }
}

Hur du anger vilken funktion du vill använda när du anropar GetProcAddress beror på hur DLL:en skapades.

Du kan bara hämta exportordningen om DLL-filen som du länkar till skapas med en moduldefinitionsfil (.def) och om ordningstalen visas med funktionerna i avsnittet EXPORTER i DLL-filen .def. Att anropa GetProcAddress med en exportordinal, till skillnad från funktionsnamnet, är något snabbare om DLL:en har många exporterade funktioner eftersom exportordningarna fungerar som index i DLL:ets exporttabell. Med en exportordning kan GetProcAddress hitta funktionen direkt i stället för att jämföra det angivna namnet med funktionsnamnen i DLL:s exporttabell. Du bör dock anropa GetProcAddress med en exportordning endast om du har kontroll över att tilldela ordningstalen till de exporterade funktionerna i .def-filen.

Vad vill du göra?

Vad vill du veta mer om?

Se även

Skapa DLL:er för C/C++ i Visual Studio