Ładowanie statycznej i dynamicznej biblioteki linków

Kobieta pracująca na laptopie

Omar Havana / Getty Images





DLL (Dynamic Link Library) działa jako współdzielona biblioteka funkcji, które mogą być wywoływane przez wiele aplikacji i innych bibliotek DLL. Delphi ci pozwala tworzyć i używać bibliotek DLL tak, że możesz wywoływać te funkcje do woli. Musisz jednak zaimportować te procedury, zanim będziesz mógł je wywołać.

Funkcje wyeksportowane z biblioteki DLL można importować na dwa sposoby — albo przez zadeklarowanie zewnętrznej procedury lub funkcji (statyczne) albo przez bezpośrednie wywołania funkcji API specyficznych dla biblioteki DLL (dynamiczne).



Rozważmy prostą bibliotekę DLL. Poniżej znajduje się kod dla 'circle.dll' eksportującego jedną funkcję o nazwie 'CircleArea', która oblicza pole koła na podstawie podanego promienia:

Gdy masz już plik circle.dll, możesz użyć wyeksportowanej funkcji „CircleArea” z Twojej aplikacji.



Ładowanie statyczne

Najprostszym sposobem na zaimportowanie procedury lub funkcji jest zadeklarowanie jej za pomocą dyrektywy zewnętrznej:

Jeśli umieścisz tę deklarację w części interfejsu jednostki, plik circle.dll zostanie załadowany raz podczas uruchamiania programu. W trakcie wykonywania programu funkcja CircleArea jest dostępna dla wszystkich jednostek korzystających z jednostki, w której znajduje się powyższa deklaracja.

Ładowanie dynamiczne

Możesz uzyskać dostęp do procedur w bibliotece poprzez bezpośrednie wywołania interfejsów API Win32, w tym Załaduj bibliotekę , Darmowa biblioteka , oraz PobierzProcAdres . Te funkcje są zadeklarowane w Windows.pas.

Oto jak wywołać funkcję CircleArea przy użyciu dynamicznego ładowania:



Podczas importowania przy użyciu dynamicznego ładowania biblioteka DLL nie jest ładowana do momentu wywołania LoadLibrary. Biblioteka jest rozładowywana przez zadzwoń do FreeLibrary .

W przypadku ładowania statycznego biblioteka DLL jest ładowana, a jej sekcje inicjujące są wykonywane przed wykonaniem sekcji inicjujących aplikacji wywołującej. Jest to odwracane przy dynamicznym ładowaniu.



Czy powinieneś używać statycznego czy dynamicznego?

Oto proste spojrzenie na zalety i wady zarówno statycznego, jak i dynamicznego ładowania DLL:

Ładowanie statyczne



Plusy:

  • Łatwiejsze dla początkującego programisty; bez „brzydkiego”Wywołania API.
  • Biblioteki DLL są ładowane tylko raz, podczas uruchamiania programu.

Cons:



  • Aplikacja nie uruchomi się, jeśli brakuje jakichkolwiek bibliotek DLL lub nie można ich znaleźć. Pojawi się taki komunikat o błędzie: „Ta aplikacja nie została uruchomiona, ponieważ nie znaleziono pliku „missing.dll”. Ponowne zainstalowanie aplikacji może rozwiązać ten problem'. Zgodnie z projektem kolejność wyszukiwania bibliotek DLL z łączem statycznym obejmuje katalog, z którego została załadowana aplikacja, katalog systemowy, katalog Windows i katalogi wymienione w zmiennej środowiskowej PATH. Należy również zauważyć, że kolejność wyszukiwania może być inna w różnych wersjach systemu Windows. Zawsze oczekuj, że wszystkie biblioteki DLL znajdują się w katalogu, w którym znajduje się aplikacja wywołująca.
  • Używana jest większa ilość pamięci, ponieważ wszystkie biblioteki DLL są ładowane, nawet jeśli nie będziesz używać niektórych funkcji .functions

Ładowanie dynamiczne

Plusy:

  • Możesz uruchomić swój program nawet wtedy, gdy niektóre z używanych przez niego bibliotek nie są obecne.
  • Mniejsze zużycie pamięci, ponieważ biblioteki DLL są używane tylko w razie potrzeby.
  • Możesz określić pełną ścieżkę do biblioteki DLL.
  • Może być używany do zastosowań modułowych. Aplikacja udostępnia tylko (ładuje) moduły (DLL) „zatwierdzone” dla użytkownika.
  • Możliwość dynamicznego ładowania i rozładowywania biblioteki jest podstawą systemu wtyczek, który umożliwia programiście dodawanie dodatkowych funkcji do programów.
  • Kompatybilność wsteczna ze starszymi wersjami systemu Windows, w których systemowe biblioteki DLL mogą nie obsługiwać tych samych funkcji lub być obsługiwane w ten sam sposób. Wykrywanie najpierw wersji systemu Windows, a następnie dynamiczne łączenie na podstawie tego, na czym działa Twoja aplikacja, umożliwia obsługę większej liczby wersji systemu Windows i zapewnia obejścia dla starszych systemów operacyjnych (lub przynajmniej wdzięczne wyłączanie funkcji, których nie możesz obsługiwać).

Cons:

  • Wymaga więcej kodu, co nie zawsze jest łatwe dla początkującego programisty.