Udostępnij za pośrednictwem


Informacje o bibliotekach Dynamic-Link

Łączenie dynamiczne umożliwia modułowi uwzględnienie tylko informacji potrzebnych do zlokalizowania wyeksportowanej funkcji DLL w czasie ładowania lub w czasie wykonywania. Łączenie dynamiczne różni się od bardziej znanego łączenia statycznego, w którym linker kopiuje kod funkcji biblioteki do każdego modułu, który ją wywołuje.

Typy linków dynamicznych

Istnieją dwie metody wywoływania funkcji w bibliotece DLL:

  • W dynamiczne łączenie w czasie ładowaniamoduł wykonuje jawne wywołania wyeksportowanych funkcji DLL tak, jakby były funkcjami lokalnymi. Wymaga to połączenia modułu z biblioteką importu dla biblioteki DLL zawierającej funkcje. Biblioteka importu dostarcza system z informacjami potrzebnymi do załadowania biblioteki DLL i zlokalizowania wyeksportowanych funkcji DLL po załadowaniu aplikacji.
  • W łączenia dynamicznego w czasie wykonywania moduł używa LoadLibrary lub LoadLibraryEx, aby załadować bibliotekę DLL w czasie wykonywania. Po załadowaniu biblioteki DLL moduł wywołuje funkcję GetProcAddress, aby uzyskać adresy wyeksportowanych funkcji DLL. Moduł wywołuje wyeksportowane funkcje DLL przy użyciu wskaźników funkcji zwracanych przez GetProcAddress. Eliminuje to konieczność importowania biblioteki.

Biblioteki DLL i zarządzanie pamięcią

Każdy proces, który ładuje bibliotekę DLL, mapuje ją na wirtualną przestrzeń adresową. Po załadowaniu biblioteki DLL do wirtualnego adresu procesu, proces może wywołać wyeksportowane funkcje biblioteki DLL.

System utrzymuje licznik odwołań dla każdego procesu w odniesieniu do każdej biblioteki DLL. Gdy wątek ładuje bibliotekę DLL, liczba odwołań jest zwiększana o jeden. Po zakończeniu procesu lub gdy liczba odwołań stanie się zerowa (dotyczy tylko łączenia dynamicznego w czasie wykonywania), biblioteka DLL zostaje usunięta z wirtualnej przestrzeni adresowej procesu.

Podobnie jak każda inna funkcja, wyeksportowana funkcja DLL jest uruchamiana w kontekście wątku, który go wywołuje. W związku z tym obowiązują następujące warunki:

  • Wątki procesu, który wywołał bibliotekę DLL, mogą używać dojścia otwartych przez funkcję DLL. Podobnie dojścia otwierane przez dowolny wątek procesu wywołującego mogą być używane w funkcji DLL.
  • Biblioteka DLL korzysta ze stosu wątku wywołującego oraz z wirtualnej przestrzeni adresowej procesu wywołującego.
  • Biblioteka DLL przydziela pamięć z wirtualnej przestrzeni adresowej procesu, który ją wywołuje.

Aby uzyskać więcej informacji na temat bibliotek DLL, zobacz następujące tematy: