GetProcAddress
Zpracuje explicitní propojení s voláním knihovny DLL GetProcAddress a získá tak adresu exportované funkce v knihovně DLL.Použijete ukazatele vrácené funkce pro volání funkce knihovny DLL.GetProcAddress přijímá jako parametry popisovač DLL modulu (vrácený buď LoadLibrary, AfxLoadLibrary, nebo GetModuleHandle) a přebírá buď název funkce, kterou chcete volat, nebo exportní pořadové číslo funkce.
Protože funkci DLL voláte prostřednictvím ukazatele a neexistuje žádná kontrola typu v čase kompilace, ujistěte se, že jsou parametry funkce správné, aby nedošlo k překročení paměti přidělené v zásobníku a nedošlo k narušení přístupu.Jedním způsobem, jak zajistit bezpečnost typů, je podívat se na funkční prototypy exportovaných funkcí a vytvořit odpovídající výrazy typedef pro ukazatele na 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);
}
}
Jak určit funkci, kterou chcete, při volání funkce GetProcAddress závisí na tom, jak byla sestavena knihovna DLL.
Můžete si opatřit pouze ordinální export pouze pokud je propojované DLL sestaveno pomocí souboru modulu definice (.def) a pokud jsou ordinály uvedeny s funkcemi v části EXPORTS části souboru .def knihovny DLL.Volání GetProcAddress s exportním číslem, nikoli s názvem funkce, je mírně rychlejší, pokud má knihovna DLL mnoho exportovaných funkcí, protože exportní čísla slouží jako indexy v tabulce exportů v knihovně DLL.S ordinálním exportem GetProcAddress lze nalézt funkci přímo na rozdíl od porovnání zadaného názvu s názvy funkcí v tabulce exportu knihovny DLL.Nicméně, měli byste zavolat GetProcAddress s exportním ordinálním číslem pouze v případě, že máte kontrolu nad přiřazením řadové číslovky do exportovaných funkcí v .def souboru.