DLL (Dynamic Link Library) działa jako wspólna biblioteka funkcji, które mogą być wywoływane przez wiele aplikacji i innych bibliotek DLL. Delphi pozwala tworzyć i używać bibliotek DLL abyś mógł wywoływać te funkcje do woli. Musisz jednak zaimportować te procedury, aby móc do nich zadzwonić.
Funkcje wyeksportowane z biblioteki DLL można zaimportować na dwa sposoby - albo deklarując zewnętrzną procedurę lub funkcję (statyczna), albo poprzez bezpośrednie wywołanie funkcji API specyficznych dla DLL (dynamicznych).
Rozważmy prostą bibliotekę DLL. Poniżej znajduje się kod dla pliku „circle.dll” eksportującego jedną funkcję o nazwie „CircleArea”, która oblicza powierzchnię koła na podstawie podanego promienia:
Po utworzeniu pliku circle.dll możesz użyć wyeksportowanej funkcji „CircleArea” z aplikacji.
Ładowanie statyczne
Najprostszym sposobem na zaimportowanie procedury lub funkcji jest zadeklarowanie jej za pomocą zewnętrznej dyrektywy:
Jeśli dołączysz tę deklarację do części interfejsu jednostki, plik circle.dll zostanie załadowany raz podczas uruchamiania programu. Podczas 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 LoadLibrary, FreeLibrary, i GetProcAddress. Funkcje te są zadeklarowane w Windows.pas.
Oto jak wywołać funkcję CircleArea za pomocą ładowania dynamicznego:
Podczas importowania przy użyciu ładowania dynamicznego biblioteka DLL nie jest ładowana, dopóki nie zostanie wywołane LoadLibrary. Biblioteka jest rozładowywana przez połączenie z FreeLibrary.
Przy ładowaniu statycznym biblioteka DLL jest ładowana, a jej sekcje inicjujące wykonywane przed uruchomieniem sekcji inicjujących aplikacji wywołującej. Odwraca się to przy ładowaniu dynamicznym.
Czy powinieneś używać statycznego czy dynamicznego?
Oto proste spojrzenie na zalety i wady statycznego i dynamicznego ładowania DLL:
Ładowanie statyczne
Plusy:
- Łatwiej dla początkującego programisty; nie „brzydka” Wywołania API.
- Biblioteki DLL są ładowane tylko raz, gdy program się uruchamia.
Cons:
- Aplikacja nie uruchomi się, jeśli brakuje bibliotek DLL lub nie można ich znaleźć. Pojawi się następujący komunikat o błędzie: „Uruchomienie tej aplikacji nie powiodło się, ponieważ nie znaleziono pliku„ missing.dll ”. Ponowne zainstalowanie aplikacji może rozwiązać ten problem". Zgodnie z projektem kolejność wyszukiwania DLL z łączeniem statycznym obejmuje katalog, z którego aplikacja załadowany, katalog systemowy, katalog Windows i katalogi wymienione w środowisku PATH zmienna. Należy również pamiętać, że kolejność wyszukiwania może być różna dla różnych wersji systemu Windows. Zawsze oczekuj, że wszystkie biblioteki DLL będą znajdować się w katalogu, w którym znajduje się aplikacja wywołująca.
- Zużywa się więcej pamięci, ponieważ wszystkie biblioteki DLL są ładowane, nawet jeśli nie będziesz korzystać z niektórych funkcji
Ładowanie dynamiczne
Plusy:
- Możesz uruchomić swój program, nawet jeśli niektóre używane przez niego biblioteki nie są obecne.
- Mniejsze zużycie pamięci, ponieważ biblioteki DLL są używane tylko w razie potrzeby.
- Możesz podać pełną ścieżkę do biblioteki DLL.
- Może być stosowany do aplikacji modułowych. Aplikacja udostępnia (ładuje) moduły (biblioteki DLL) „zatwierdzone” dla użytkownika.
- Możliwość dynamicznego ładowania i zwalniania biblioteki jest podstawą systemu wtyczek, który umożliwia programistom 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. Najpierw wykrywanie wersji systemu Windows, a następnie dynamiczne łączenie w oparciu o to, na czym działa aplikacja, umożliwia obsługę większej liczby wersje systemu Windows i zapewniają obejścia dla starszych systemów operacyjnych (a przynajmniej z wdzięcznym wyłączeniem funkcji, których nie możesz wsparcie.)
Cons:
- Wymaga więcej kodu, co nie zawsze jest łatwe dla początkującego programisty.