GetProcAddress
Jawne dołączanie do wywołanie biblioteki DLL procesów GetProcAddress uzyskać adres wyeksportowanej funkcji w bibliotece DLL.Wskaźnik funkcji zwracane służy do wywołania funkcji DLL.GetProcAddress przyjmuje jako parametry uchwyt modułu DLL (zwracany przez LoadLibrary, AfxLoadLibrary, lub GetModuleHandle) i pobiera nazwę funkcji do wywołania lub funkcji eksportu porządkowej.
Ponieważ są wywołanie funkcji DLL za pomocą wskaźnika, a nie istnieje żaden typ kompilacji, sprawdzanie, upewnij się, parametry funkcji są poprawne, tak aby nie overstep pamięć zaalokowana na stosie i powodować naruszenie zasad dostępu.Jednym ze sposobów zapewnienia bezpieczeństwa typu jest przyjrzeć prototypy funkcji eksportowanych funkcji i utworzyć pasujące definicje TypeDef dla wskaźników funkcji.Na przykład:
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);
}
}
Jak określić funkcji podczas wywoływania GetProcAddress zależy od tego, jaki został zbudowany biblioteki DLL.
Liczebniki eksportu można uzyskać tylko jeśli biblioteki DLL, łącząc się jest zbudowany z plik definicji (DEF) modułu i liczby porządkowe wymieniono funkcje w wywóz sekcji pliku .def biblioteki DLL.Wywołanie GetProcAddress z wywóz jest nieznacznie szybciej, jeśli biblioteka DLL ma wiele funkcji eksportowanych ponieważ porządkowe wywóz służą jako indeksy do biblioteki DLL eksportowania tabeli porządkowych, w przeciwieństwie do nazwy funkcji.Z porządkowej wywóz GetProcAddress można zlokalizować funkcji bezpośrednio w przeciwieństwie do porównywania określonej nazwy do nazwy funkcji w tabeli eksportu biblioteki DLL.Jednakże należy wywołać GetProcAddress z porządkową wywozu, tylko jeśli masz kontrolę nad Przypisywanie liczb porządkowych do eksportowanych funkcji w pliku .def.