Udostępnij za pośrednictwem


GetProcAddress

Przetwarza jawne łączenie do wywołania biblioteki DLL GetProcAddress w celu uzyskania adresu eksportowanych funkcji do biblioteki DLL.Można użyć wskaźnika zwróconej funkcji do wywołania funkcji DLL.GetProcAddress przyjmuje jako parametry uchwyty modułu DLL (zwrócone przez LoadLibrary, AfxLoadLibrary lub GetModuleHandle) i przyjmuje nazwę funkcji, którą chcesz wywołać, lub liczbę porządkową eksportu funkcji.

Ponieważ wywołujesz funkcję DLL za pomocą wskaźnika i nie ma żadnych typów w czasie kompilacji sprawdzania, upewnij się, parametry funkcji są poprawne, tak aby nie przekroczyć pamięć umieszczonej na stosie i powodować naruszenie zasad dostępu.Jednym ze sposobów zapewnienia bezpieczeństwa typu jest spojrzenie na prototypy funkcji eksportowanych tworzenie pasujących definicji typów dla wskaźników funkcji.Na 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ślenia odpowiedniej funkcji podczas wywoływania GetProcAddress zależy od konstrukcji biblioteki DLL.

Możesz uzyskać tylko eksport porządkowej, jeżeli DLL do którego łączysz jest zbudowany z plikiem definicji modułowej (.def) i jeżeli liczby porządkowe są wyszczególnione z funkcjami w sekcji EXPORTS pliku DLL .def.Wywołanie GetProcAddress z eksportową liczbą porządkową, w odróżnieniu od nazwy funkcji, jest nieco szybsze, jeśli biblioteka DLL ma wiele funkcji eksportowanych, ponieważ eksportowe liczebniki porządkowe służą jako indeksy do tabeli eksportowej biblioteki DLL.Z liczba porządkową eksportu, GetProcAddress może zlokalizować funkcje bezpośrednio w przeciwieństwie do porównywania określonej nazwy do nazw funkcji w tabeli eksportowej DLL.Jednakże należy wywołać GetProcAddress z eksportowaną liczbą porządkową tylko wtedy, gdy masz kontrolę nad przypisywaniem liczb porządkowych do eksportowanych funkcji w pliku .def.

Co chcesz zrobić?

O czym chcesz się dowiedzieć więcej?

Zobacz też

Koncepcje

Biblioteki DLL w programie Visual C++