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.
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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
procedure SayHello(zmp:string); stdcall; external 'DllFull.dll'; |
b)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
procedure DoSomethingReallyCool; stdcall; external 'DllFull.dll'; |
c)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function ShowForm: integer; stdcall; external 'DllFull3.dll'; |
d)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |
- Na skutek naciśnięcia przycisku BitBtn3, ładuje się DYNAMICZNIE biblioteka DllFull2.dll (DLL dynamiczna) z funkcją SayHelloDyn
-
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
DllInstance := LoadLibrary('DllFull2.dll'); |
-
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
if DllInstance = 0 then |
-
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@Say := GetProcAddress(DllInstance, 'SayHelloDyn'); |
-
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
if @Say <> nil then |
-
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
FreeLibrary(DllInstance); |
Przykładowa biblioteka DLL jej konstrukcja, jest przedstawiona poniżej - biblioteka DllFull2.dll:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
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:
Brak komentarzy - Zabacz wszystkie komentarze.
Prześlij komentarz