Co to jest biblioteka DLL dynamiczna i statyczna, program biblioteki DLL Delphi

Co to jest biblioteka DLL?

DLL (Dynamic Link Library) - Wykonywalny moduł programu (pod program), pełniący określone funkcje. Biblioteki DLL są powszechnie wykorzystywane w systemie Windows. Nie są one wywoływane bezpośrednio przez użytkowników, lecz przez aktualnie uruchomione programy (program). Biblioteka DLL rozszerza funkcjonalność programu. Mogą one być dość proste - tak, jak biblioteka pozwalająca narysować trójwymiarową ramkę wokół okna dialogowego (CTL3DV2.DLL) lub bardzo złożone, jak na przykład w pełni rozbudowany interpreter języka Visual Basic (VBRUN400.DLL).
Biblioteka DLL projektowana jest zazwyczaj w ten sposób, żeby z zawartej w niej funkcji mogło korzystać kilka programów naraz (np. kod wielobieżny). System Windows zawiera wiele bibliotek DLL wykorzystywanych przez aplikację (wystarczy poszukać w folderze \WINDOWS\SYSTEM plików z rozszerzeniami .DLL). Aplikacje mogą też mieć własne biblioteki, przechowywane w folderze instalacyjnym danego programu lub w folderze \WINDOWS\SYSTEM.
W systemie DOS nigdy nie istniał żaden oficjalny mechanizm pozwalający na dynamiczne łączenie (dynamiczna DLL) i współdzielenie zasobów w czasie rzeczywistym. Co prawda tworzono w tym celu programy ISR i TSR, ale takie działania nie były nigdy popierane przez Microsoft i często doprowadzały do konfliktów programowych. Niestety również w świecie bibliotek DLL pojawiają się konflikty.


Tworzymy komplet bibliotek DLL (statyczna DLL i dynamiczna) w Delphi 2010.



Opis:
1. DllF - program z którego uruchamiamy wszystkie 3 bliblioteki DLL.
  a)
procedure SayHello(zmp:string); stdcall; external 'DllFull.dll';
view raw blog-27 hosted with ❤ by GitHub
- funkcja SayHello, pobrana statycznie z pierwszej biblioteki DLL o nazwie DllFull.dll
  b)
procedure DoSomethingReallyCool; stdcall; external 'DllFull.dll';
view raw blog-28 hosted with ❤ by GitHub
- funkcja DoSomethingReallyCool, pobierana statycznie również z pierwszej biblioteki DLL o nazwie DllFull.dll
  c)
function ShowForm: integer; stdcall; external 'DllFull3.dll';
view raw blog-29 hosted with ❤ by GitHub
- funkcja ShowForm, pobrana w sposób statyczny z trzeciej biblioteki DLL o nazwie DllFull3.dll

  d)
procedure TForm1.BitBtn3Click(Sender: TObject);
type
TSayHelloDyn = procedure (zmp:string); stdcall;
var
DllInstance: THandle;
Say: TSayHelloDyn;
begin
DllInstance := LoadLibrary('DllFull2.dll');
if DllInstance = 0 then
Exit;
@Say := GetProcAddress(DllInstance, 'SayHelloDyn');
if @Say <> nil then
Say('SayHelloDyn - Marek Bilski')
else
MessageBox(0, 'Nie pobrano funkcji z procedury.', 'Uwaga', 0);
FreeLibrary(DllInstance);
end;
view raw blog-25 hosted with ❤ by GitHub

- Na skutek naciśnięcia przycisku BitBtn3, ładuje się DYNAMICZNIE biblioteka DllFull2.dll (DLL dynamiczna) z funkcją SayHelloDyn
  -
DllInstance := LoadLibrary('DllFull2.dll');
view raw blog-30 hosted with ❤ by GitHub
- załadowanie biblioteki dynamicznie
  -
if DllInstance = 0 then
view raw blog-31 hosted with ❤ by GitHub
- sprawdzenie czy biblioteka się załadowała
  -
@Say := GetProcAddress(DllInstance, 'SayHelloDyn');
view raw blog-32 hosted with ❤ by GitHub
- pobranie z załadowanej biblioteki funkcji SayHelloDyn
  -
if @Say <> nil then
view raw blog-33 hosted with ❤ by GitHub
- jeśli załadowane wykonaj funkcje
  -
FreeLibrary(DllInstance);
view raw blog-34 hosted with ❤ by GitHub
- zwolni bibliotekę załadowaną dynamicznie z pamięci.


Przykładowa biblioteka DLL jej konstrukcja, jest przedstawiona poniżej - biblioteka DllFull2.dll:
library DllFull2;
uses
ShareMem,
SysUtils,
Classes,
Forms,
Windows;
{$R *.res}
procedure SayHelloDyn(zmp:string); stdcall;
begin
MessageBox(0, PChar(zmp), 'Uwaga', 0);
end;
exports
SayHelloDyn;
begin
end.
view raw blog-26 hosted with ❤ by GitHub

Każda biblioteka DLL zaczyna się od:
library i jej nazwy.

Na samym końcu mamy:
exports, w którym podajemy jakie funkcje biblioteka DLL ma przekazać na zewnątrz do innych programów.


Różnica między biblioteką ładowaną w sposób statyczny (statyczna DLL) a dynamiczny (dynamiczna DLL), polega na tym, że biblioteka DLL dynamiczna ładujemy do pamięci program-u wtedy gdy zaistnieje taka potrzeba, zaś statyczna DLL jest już ładowana przy kompilacji program-u!



Wszystkich zainteresowanych chcących pogłębić wiedzę o bibliotekach DLL, np. o stworzenie jednej biblioteki DLL, która jest wykorzystywana zarówno przez Delphi jak i C++ Builder zapraszam do:

Międzyplatformowe dynamiczne biblioteki DLL



Pliki do pobrania:
1. Źródła i exe:
-pobierz
2. EXE:
-pobierz