Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Procesy explicitně volají funkci GetProcAddress k získání adresy exportované funkce v knihovně DLL. Ukazatel na funkci vrácený použijete k volání funkce DLL.
GetProcAddress přijímá jako parametry popisovač modulu DLL knihovny (vrácený funkcemi LoadLibrary, AfxLoadLibrary nebo GetModuleHandle) a buď název funkce, kterou chcete volat, nebo její exportní pořadové číslo.
Jelikož voláte funkci DLL knihovny pomocí ukazatele a neexistuje žádná kontrola typů během kompilace, ujistěte se, že jsou parametry funkce správné, abyste nepřekročili paměť přidělenou na zásobníku a nezpůsobili 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 pořadová čísla uvedena s funkcemi v části EXPORTS souboru .def knihovny DLL. Volání GetProcAddress s exportním pořadovým číslem, na rozdíl od názvu funkce, je mírně rychlejší, pokud knihovna DLL obsahuje mnoho exportovaných funkcí, protože exportní pořadová čísla slouží jako indexy v tabulce exportu knihovny DLL. S pořadovým číslem exportu může GetProcAddress funkci najít přímo, místo porovnávání specifikovaného názvu s názvy funkcí v DLL exportní tabulce. Měli byste však volat GetProcAddress s exportním ordinálem pouze v případě, že máte kontrolu nad přiřazováním ordinálů k exportovaným funkcím v souboru .def.