Sdílet prostřednictvím


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, AfxLoadLibrarynebo 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.

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