Udostępnij za pośrednictwem


GetProcAddress

Przetwarza jawne łączenie z wywołaniem biblioteki DLL GetProcAddress w celu uzyskania adresu wyeksportowanej funkcji w bibliotece DLL. Zwracany wskaźnik funkcji służy do wywoływania funkcji DLL. Polecenie GetProcAddress przyjmuje jako parametry dojścia modułu DLL (zwracane przez moduł LoadLibrary, AfxLoadLibrarylub GetModuleHandle) i przyjmuje nazwę funkcji, którą chcesz wywołać, lub porządkową funkcji eksportu.

Ponieważ wywołujesz funkcję DLL za pomocą wskaźnika i nie ma sprawdzania typów w czasie kompilacji, upewnij się, że parametry funkcji są poprawne, aby nie przekraczać pamięci przydzielonej na stosie i spowodować naruszenie dostępu. Jednym ze sposobów zapewnienia bezpieczeństwa typu jest przyjrzenie się prototypom funkcji wyeksportowanych funkcji i utworzeniu pasujących definicji typów dla wskaźników funkcji. Przykład:

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

Sposób określania żądanej funkcji podczas wywoływania metody GetProcAddress zależy od tego, jak została skompilowana biblioteka DLL.

Liczbę porządkową eksportu można uzyskać tylko wtedy, gdy biblioteka DLL, z którą łączysz, została skompilowana przy użyciu pliku definicji modułu (.def) i jeśli reguły są wyświetlane z funkcjami w sekcji EKSPORTy pliku DEF biblioteki DLL. Wywoływanie metody GetProcAddress z porządkowym eksportem, w przeciwieństwie do nazwy funkcji, jest nieco szybsze, jeśli biblioteka DLL ma wiele wyeksportowanych funkcji, ponieważ reguły eksportu służą jako indeksy do tabeli eksportu biblioteki DLL. Dzięki porządkowi eksportu polecenie GetProcAddress może zlokalizować funkcję bezpośrednio, w przeciwieństwie do porównywania określonej nazwy z nazwami funkcji w tabeli eksportu biblioteki DLL. Należy jednak wywołać metodę GetProcAddress z porządkowym eksportem tylko wtedy, gdy masz kontrolę nad przypisywaniem wartości domyślnych do wyeksportowanych funkcji w pliku .def.

Co chcesz zrobić?

Co chcesz dowiedzieć się więcej?

Zobacz też

Tworzenie bibliotek DLL języka C/C++ w programie Visual Studio