GetProcAddress

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.

Co chcete udělat?

O čem chcete vědět víc?

Viz také

Vytváření knihoven DLL jazyka C/C++ v sadě Visual Studio