Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
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.