Megosztás:


GetProcAddress

Azok a folyamatok, amelyek kifejezetten a GetProcAddress hívást használják a DLL-ben lévő exportált függvény címének megszerzéséhez. A visszaadott függvénymutatóval meghívhatja a DLL-függvényt. A GetProcAddress paraméterként veszi át a DLL-modul leíróját (amelyet a LoadLibraryAfxLoadLibrary vagy a GetModuleHandle ad vissza), és vagy a meghívni kívánt függvény nevét vagy a függvény exportálási sorszámát veszi fel.

Mivel egy mutatón keresztül hívja meg a DLL-függvényt, és nincs fordítási idő típusú ellenőrzés, győződjön meg arról, hogy a függvény paraméterei helyesek, hogy ne lépje túl a veremen lefoglalt memóriát, és ne okozzon hozzáférés-megsértést. A típusbiztonság biztosításának egyik módja, ha megnézzük az exportált függvények függvény prototípusait, és egyező típusdefiniteket hozunk létre a függvénymutatókhoz. Például:

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);
   }
}

A GetProcAddress hívásához használni kívánt függvény megadása a DLL felépítésétől függ.

Az exportálási sorszámot csak akkor szerezheti be, ha a hivatkozott DLL moduldefiníciós (.def) fájllal van létrehozva, és ha az ordinálok a DLL .def fájljának EXPORT szakaszában szereplő függvényekkel vannak felsorolva. A GetProcAddress parancs meghívása a függvény nevével ellentétben kissé gyorsabb, ha a DLL számos exportált függvényt tartalmaz, mert az exportálási sorszámok indexként szolgálnak a DLL exportálási táblájában. Az exportálási sorszámmal a GetProcAddress közvetlenül megkeresheti a függvényt, nem pedig összehasonlíthatja a megadott nevet a DLL exportálási táblájának függvényneveivel. A GetProcAddress parancsot azonban csak akkor kell meghívnia egy exportálási sorszámmal, ha ön szabályozza a .def fájlban az exportált függvényekhez rendelt sorszámok kiosztását.

Mit kíván tenni?

Miről szeretne többet tudni?

Lásd még

C/C++ DLL-ek létrehozása a Visual Studio