
Logowanie
| Pisanie i obsługa bibliotek DLL |
|
|
| Wpisany przez Berl | |||
| środa, 07 września 2005 15:19 | |||
|
Jak ogólnie wiadomo, DLL to skrót od Dynamic Link Library. Biblioteka DLL jest plikiem, w którym przechowywany jest skompilowany kod źródłowy, który możemy wykorzystac z poziomu innej aplikacji. Biblioteki DLL stosuje się między innymi po to, aby dużą aplikację rozbić na części. W ten sposób możemy uzyskać mały plik wykonywalny EXE, a procedury będą umieszczone wewnątrz bibliotek DLL, która będzie dynamicznie ładowana do pamięci w razie potrzeby, a potrzebna nam funkcja będzie z niej importowana. Zmniejsza to znacznie zużycie pamięci przez program. Biblioteki DLL są również przydatne przy unowocześnianiu i modyfikowaniu programu - jeśli korzystasz z bibliotek DLL, to nie musisz zmieniać całego programu - wystarczy, że zmienisz i skompilujesz samą bibliotekę DLL. Jedną z ważniejszych zalet bibliotek jest to, że biblioteki napisane w jednym języku programowania da się wykorzystywać z poziomu zupełnie innego języka. Jeśli mamy bibliotekę napisaną w C++, to możemy wykorzystać procedury w niej zawarte także z poziomu Delphi.
Na początku musimy sobie taką bibliotekę napisać. Wybieramy więc File/New, a następnie klikamy na DLL Library. Pojawi się okno, w którym będzie kod szkieletu biblioteki DLL. Powinno to wyglądać mniej więcej tak : procedure Procedura(argument : string); stdcall; begin ShowMessage('Wpisałeś : ' + argument); end; Należy pamiętać, że procedura ShowMessage pochodzi z modułu Dialogs, więc moduł ten należy dodać do sekcji uses. exports Procedura name 'ProceduraWypisujacaArgument'; Ostatnim sposobem eksportowania procedury jest eksportowanie przez indeks. Eksportowanie przez indeks wygląda tak : exports Procedura index 1; Kod całej biblioteki będzie wyglądał tak : library biblioteka; uses Windows, Dialogs; procedure Procedura(argument : string); stdcall; begin ShowMessage('Wpisałeś : ' + argument); end; exports Procedura; begin end. Zapisujemy naszą bibliotekę pod nazwą biblioteka.dpr, i kompilujemy. W folderze, gdzie ją zapisaliśmy, powinien pojawić się plik Biblioteka.dll. unit testerfrm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} end. Teraz musimy wskazać programowi, z jakiej biblioteki ma pobrać procedurę, i jaka to ma być procedura. Nazywa się to importowaniem procedury z biblioteki DLL. Wygląda to mniej więcej tak : procedure Procedura(argument : string); stdcall external 'biblioteka.dll' index 1; Przedstawiony sposób ładowania biblioteki DLL jest sposobem łatwym, lecz posiadającym wadę, mianowicie biblioteka dll jest ładowana do pamięci od razu przy starcie programu. O wiele bardziej efektywnym sposobem jest dynamiczne ładowanie biblioteki DLL do pamięci. Kod ładujący bibliotekę oraz funkcję do pamięci, wykonujący funkcję oraz zwalniający pamięć wygląda tak : var DLL : THandle; Procedura : procedure(argument : string); stdcall; begin DLL := LoadLibrary('biblioteka.dll'); try @Procedura := GetProcAddress(DLL, 'Procedura'); if @Procedura = nil then raise Exception.Create('Nie ma takiej '+ 'procedury w bibliotece.'); Procedura(Edit1.Text); finally FreeLibrary(DLL); end; end; Funkcja LoadLibrary Zwraca uchwyt do biblioteki DLL, można powiedzieć, że za pomocą tej funkcji ładujemy bibliotekę DLL do pamięci, podobnie jak funkcja GetProcAddress, która ładuje do pamięci konkretną procedurę. FreeLibrary zwalnia pamięć, użytą przez bibliotekę DLL. Kod ten należy umieścić w zdarzeniu OnClick Buttona. Cały kod programu testującego do naszej biblioteki DLL wygląda tak : unit testerfrm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var DLL : THandle; Procedura : procedure(argument : string); stdcall; begin DLL := LoadLibrary('biblioteka.dll'); try @Procedura := GetProcAddress(DLL, 'Procedura'); if @Procedura = nil then raise Exception.Create('Nie ma takiej '+ 'procedury w bibliotece.'); Procedura(Edit1.Text); finally FreeLibrary(DLL); end; end; end. I teraz po naciśnięciu przycisku na formie, procedura zawarta w bibliotece DLL wypisze nam tekst wpisany w polu TEdit.
|
Statystyka
Użytkowników : 99Artykułów : 76
Odsłon : 99786




