GetProcAddress
Procesy explicitně propojují knihovnu DLL volání GetProcAddress k získání adresy exportované funkce v knihovně DLL. Vrácený ukazatel funkce použijete k volání funkce KNIHOVNY DLL. GetProcAddress přebírá jako parametry popisovač modulu KNIHOVNY DLL (vrácený LoadLibrary, AfxLoadLibrary
nebo GetModuleHandle) a přebírá buď název funkce, kterou chcete volat, nebo pořadové číslo funkce.
Vzhledem k tomu, že voláte funkci KNIHOVNY DLL ukazatelem a neexistuje žádná kontrola typu kompilace, ujistěte se, že jsou parametry funkce správné, takže nepřekročíte paměť přidělenou zásobníku a způsobí narušení přístupu. Jedním ze způsobů, jak zajistit bezpečnost typů, je podívat se na prototypy funkcí exportovaných funkcí a vytvořit odpovídající definice typedefs pro ukazatele funkce. Příklad:
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);
}
}
Způsob určení požadované funkce při volání GetProcAddress závisí na tom, jak byla vytvořena knihovna DLL.
Pořadové číslo můžete získat pouze v případě, že je knihovna DLL, na kterou odkazujete, sestavena se souborem definice modulu (.def) a pokud jsou ordinaly uvedeny s funkcemi v části EXPORT souboru DLL .def. Volání Metody GetProcAddress s pořadovým číslem exportu, na rozdíl od názvu funkce, je mírně rychlejší, pokud knihovna DLL obsahuje mnoho exportovaných funkcí, protože exportní ordinaly slouží jako indexy do tabulky exportu knihovny DLL. S pořadovým pořadím exportu může GetProcAddress vyhledat funkci přímo na rozdíl od porovnání zadaného názvu s názvy funkcí v tabulce exportu knihovny DLL. Měli byste však volat GetProcAddress s řadovým pořadím exportu pouze v případě, že máte kontrolu nad přiřazením ordinálů k exportovaným funkcím v souboru .def.