www.mamboteam.com
Project1.pl Advertisement
Start arrow Artykuły arrow Praktyczne wykorzystanie Delphi arrow Pisanie i obsługa bibliotek DLL
piątek, 10 wrzesień 2010
 
 
Menu główne
Start
Artykuły
FAQ
Download
Kontakt
Ciekawe linki
Mapa serwisu
Logowanie





Zapomniałeś hasła?
Nie masz konta? Załóż sobie
Pisanie i obsługa bibliotek DLL Drukuj E-mail
Oceny: / 0
KiepskiBardzo dobry 
Napisał: Berl   
środa, 07 wrzesień 2005
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. Zmmniejsza 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 pizomu 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 poczatku 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 wiecej 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 nalezy dodać do sekcji uses.

Słowo stdcall pojawiające sie po nazwie procedury jest dyrektywą, jak ma być wywoływana procedura. istnieją cztery podstawowe dyrektywy :

stdcall - dyrektywa ta zapewnia kompatybilność, jeżeli biblioteka i wykorzystujący ją program są napisane w innych językach programowania;
safecall - dyrektywa ta oznacza, że każdy wyjątek w działaniu procedury zostanie przekazany programowi, który wykorzystuje tą bibliotekę;
register - jest to dyrektywa domyślna. Według programistów z Borlanda zapewnia ona największą efektywność działania;
pascal, cdecl - dyrektywy te zapewniają kompatybylność z wybranym językiem programowania - pascal lub c;

Należy teraz podać jakąś informację dla zewnętrznego programu, wykorzystującego naszą bibliotekę, jakie procedury są w niej zawarte. Nazywa się to eksportowaniem procedury. Po prostu po słowie exports wypisujemy nazwy eksportowanych procedur :
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 bibioteki 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.

Zajmijmy się teraz napisaniem programu, który wykorzysta procedurę zawartą w naszej bibliotece DLL. Wybieramy File/New Application, następnie na formie umieszczamy pole TEdit oraz jeden przycisk (TButton). Nastepnie zapisujemy naszą aplikację w tym samym folderze co biblotekę DLL, nazywając ją Tester, a okno plik z oknem programu nazywając TesterFrm.pas. W Oknie edycji powinien pojawić się taki kod :
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.
Komentarze

Aby dodać komentarz zaloguj się. Jeśli nie masz konta, załóż je sobie.
Tylko zarejestrowani użytkownicy mogą pisać komentarze.

 
wstecz   dalej »
LINKUJ PRO
Gościmy
Odwiedza nas 1 gość
Licznik odwiedzin
117622
 
Góra Góra