Andrzej Marciniak - cs.put.poznan.pl · Procedury i funkcje mog¹ byæ pobierane z bibliotek DLL do...
Transcript of Andrzej Marciniak - cs.put.poznan.pl · Procedury i funkcje mog¹ byæ pobierane z bibliotek DLL do...
Zaawansowaneprogramowanie
w (pakiecie) Delphi
DEL-3(1 z 65)
Andrzej Marciniak
Prezentacja multimedialna przygotowana za pomoc¹ systemu Corel® Presentations 11 i X3Copyright © 2004 - 2010 by Andrzej Marciniak
DEL420
cobs³uga warunków i stanów wyj¹tkowychc instrukcja wywo³ywania stanów wyj¹tkowych
(raise)c instrukcja try ... exceptc instrukcja try ... finallyc predefiniowane warunki i stany wyj¹tkowe
cokienka z komunikatami
Na poprzednim wyk³adzie ...
DEL-3(2 z 65)
cprogramowanie bibliotek ³¹czonychdynamiczniec dostêp do funkcji i procedurc modu³y importowec importowanie statyczne i dynamicznec tworzenie bibliotek DLLc b³êdy wykonania w bibliotekach DLL
c funkcje i proceduryc rodzaje parametrówc konwencje wywo³aniac przeci¹¿anie
Na tym wyk³adzie ...
DEL-3(3 z 65)
Biblioteki DLL
Biblioteki ³¹czone dynamicznie (w skrócie: bibliotekiDLL – od ang. dynamic-link libraries) s³u¿¹ dowspólnego u¿ywania kodów programowych i zasobów(danych definiuj¹cych wizualne czêœci programówuruchamianych w œrodowisku Windows) przez ró¿neprogramy i inne biblioteki DLL.
Jêzyk Delphi Pascal umo¿liwia zarówno korzystanie z istniej¹cych bibliotek DLL, jak i zaprogramowanieprzez u¿ytkownika w³asnych bibliotek tego typu.
DEL-3(4 z 65)
Biblioteki DLL
Biblioteka ³¹czona dynamicznie jest wykonywaln¹jednostk¹ programow¹ zawieraj¹c¹ kod programowylub zasoby. W postaci skompilowanej jest pamiêtanaw zbiorze dyskowym o rozszerzeniu nazwy DLL.
Podobieñstwo bibliotek DLL do modu³ów:
obie struktury programowe zawieraj¹ procedury i funkcje wykorzystywane przez programy, modu³y i inne biblioteki DLL
DEL-3(5 z 65)
csposób do³¹czania do jednostek programowych(programów, modu³ów i innych bibliotek DLL),
cmodu³y umo¿liwiaj¹ nie tylko wykorzystanie w programie procedur i funkcji, ale tak¿elitera³ów, typów i zmiennych w nichzdefiniowanych (w czêœci opisowej), a z bibliotek DLL mog¹ byæ „eksportowane”tylko procedury i funkcje.
Biblioteki DLL
Ró¿nice pomiêdzy bibliotekami DLL i modu³ami:
DEL-3(6 z 65)
Biblioteki DLLDostêp do procedur i funkcji
W celu u¿ycia w programie (module, bie¿¹cejbibliotece ³¹czonej dynamicznie) procedury lub funkcjizdefiniowanej w danej bibliotece DLL nale¿y w czêœciopisowej programu (modu³u, bie¿¹cej biblioteki DLL)zadeklarowaæ dan¹ procedurê lub funkcjê z dyrektyw¹external.
Dyrektywa external okreœla odpowiedni¹ bibliotekêDLL i wi¹¿e deklaracjê z procedur¹ lub funkcj¹, którajest w niej zdefiniowana.
DEL-3(7 z 65)
Biblioteki DLLDostêp do procedur i funkcji
Przyk³ad
function okienko_komunikatu (identyfikator : Integer;
komunikat, nag³ówek : PChar; znaczniki : Integer) : Integer;
stdcall; external ’user32.dll’ name ’MessageBoxA’;
Dyrektywa jêzyka stdcall okreœla konwencjê wywo³aniafunkcji.
DEL-3(8 z 65)
Biblioteki DLLDostêp do procedur i funkcji
Dla bibliotek DLL napisanych w jêzyku Delphi Pascal, którebêd¹ wywo³ywane tylko w jednostkach programowych(programach, modu³ach i innych bibliotekach DLL)napisanych tak¿e w tym jêzyku, okreœlanie konwencjiwywo³ania nie jest konieczne (domyœln¹ konwencjê okreœladyrektywa register).
W przypadku korzystania z bibliotek DLL napisanych w innych jêzykach lub w bibliotekach pisanych w jêzykuDelphi Pascal, ale przeznaczonych do wykorzystania w innych jêzykach programowania, nale¿y w deklaracjachfunkcji i procedur podawaæ dyrektywê stdcall.
DEL-3(9 z 65)
cnazwê,
cnow¹ (inn¹) nazwê,
cliczbê porz¹dkow¹.
Biblioteki DLLDostêp do procedur i funkcji
Program (modu³, bie¿¹ca biblioteka DLL) napisany w jêzyku Delphi Pascal mo¿e pobraæ procedurê lubfunkcjê z danej biblioteki DLL przez :
W ka¿dym z tych sposobów postaæ dyrektywyexternal jest inna.
DEL-3(10 z 65)
Biblioteki DLLDostêp do procedur i funkcji
Import poprzez nazwê oznacza, ¿e w tablicy nazwodpowiedniej biblioteki DLL bêdzie poszukiwanyidentyfikator danej procedury lub funkcji (poprzekszta³ceniu wszystkich ma³ych liter na wielkie).
Dyrektywa external ma w tym przypadku postaæexternal nazwa-biblioteki;
gdzie nazwa biblioteki w ogólnoœci oznacza sta³ewyra¿enie ³añcuchowe.
Uwaga: Ró¿nice pomiêdzy Windows 98, Me i XP a NT i 2000.
DEL-3(11 z 65)
Biblioteki DLLDostêp do procedur i funkcji
Przyk³ady
1) procedure proc_a; external ’PROCDLL.DLL’;
Jeœli wczeœniej zdefiniujemy sta³¹ ³añcuchow¹ biblioteka_1nastêpuj¹co:
const biblioteka_1 = ’PROCDLL.DLL’;to podan¹ deklaracjê procedury proc_a mo¿na zast¹piædeklaracj¹ procedure proc_a; external biblioteka_1;
2) function NWP (const a, b : Longint) : Longint; external ’NUMLIB.DLL’;
DEL-3(12 z 65)
Biblioteki DLLDostêp do procedur i funkcji
Jeœli nazwa procedury lub funkcji w programie(module, bie¿¹cej bibliotece DLL) ma byæ inna ni¿nazwa, za pomoc¹ której eksportuje siê j¹ z danejbiblioteki, to nale¿y zastosowaæ importowanie przeznow¹ (inn¹) nazwê.
Dyrektywa external ma w tym przypadku postaæ
external nazwa-biblioteki name nazwa-importowa;
DEL-3(13 z 65)
Biblioteki DLLDostêp do procedur i funkcji
Przyk³ad
function podzielnik (const a, b : Longint) : Longint; external ’NUMLIB.DLL’ name ’NWP’;
DEL-3(14 z 65)
Biblioteki DLLDostêp do procedur i funkcji
Import przez liczbê porz¹dkow¹ jest najbardziejefektywny, gdy¿ w tym przypadku odpowiedniidentyfikator nie jest poszukiwany w tablicy nazwbiblioteki.
Liczba porz¹dkowa procedury lub funkcji jest w bibliotece DLL ustalona za pomoc¹ klauzuliexports (bêdzie dalej). Dyrektywa externalodwo³uj¹ca siê do tej liczby ma postaæ
external nazwa-biblioteki index liczba-porz¹dkowa;
DEL-3(15 z 65)
Biblioteki DLLDostêp do procedur i funkcji
Przyk³ad
procedure proc_b; external ’PROCDLL.DLL’ index 15;
Jeœli wczeœniej okreœlono nastêpuj¹ce sta³e:
const biblioteka_1 = ’PROCDLL.DLL’; liczba_porz = 15;
to podan¹ deklaracjê mo¿na zast¹piæ deklaracj¹
procedure proc_b; external biblioteka_1 index liczba_porz;
DEL-3(16 z 65)
Biblioteki DLLModu³y importowe
Procedury i funkcje mog¹ byæ pobierane z bibliotek DLL doprogramów (modu³ów, innych bibliotek DLL) w sposóbbezpoœredni (opisany bli¿ej) lub w sposób poœredni – z modu³ów, które zawieraj¹ odpowiednie deklaracje.Modu³y takie nazywamy modu³ami importowymi.
Zalety stosowania modu³ów importowych:a) mo¿liwoœæ umieszczania w ich czêœciach opisowych definicjii deklaracji sta³ych, typów i zmiennych, które u³atwiaj¹ dostêp doprocedur i funkcji (bezpoœrednie odwo³anie siê w programie do sta³ych, typów i zmiennych zdefiniowanych w bibliotece DLL nie jest mo¿liwe),
b) po modyfikacji jakiejœ biblioteki wystarczy zmieniæ tylko odpowiednimodu³, a nie wszystkie programy (inne modu³y, biblioteki DLL), którekorzystaj¹ z danej biblioteki.
DEL-3(17 z 65)
Biblioteki DLLModu³y importowe
Przyk³ad
unit cplcproc;interfacetype complex = record
re, im : Extendedend;
function addcplx (const a, b : complex) : complex;function subcplx (const a, b : complex) : complex;function multcplx ( const a, b : complex) : complex;function divcplx ( const a, b : complex) : complex;implementation function addcplx; external ’CPLXPROC.DLL’ index 1; function subcplx; external ’CPLXPROC.DLL’ index 2; function multcplx; external ’CPLXPROC.DLL’ index 3; function divcplx; external ’CPLXPROC.DLL’ index 4;end. DEL-3(18 z 65)
Biblioteki DLLImportowanie statyczne i dynamiczne
Zastosowanie w programie (module, innej bibliotece DLL)dyrektywy jêzyka external z nazw¹ danej biblioteki powodujeustalenie biblioteki, z której bêd¹ pobierane procedury lubfunkcje w sposób jawny. Pobieranie takie, zwaneimportowaniem statycznym, dotyczy zawsze tej samej pro-cedury lub funkcji w tej samej bibliotece.
Jêzyk Delphi Pascal umo¿liwia tak¿e ustalenie biblioteki i pobieranej z niej procedury lub funkcji dopiero podczaswykonywania programu. Ten sposób okreœlania biblioteki iprocedury lub funkcji nazywa siê importowaniemdynamicznym.
DEL-3(19 z 65)
cLoadLibrary,
cGetProcAddress,
cFreeLibrary,
Biblioteki DLLImportowanie statyczne i dynamiczne
Do przeprowadzenia importowania dynamicznegos³u¿¹ trzy funkcje standardowe:
które s¹ zdefiniowane w module Windows.
DEL-3(20 z 65)
Biblioteki DLLImportowanie statyczne i dynamiczne
Funkcja LoadLibrary s³u¿y do wczytania biblioteki DLL dopamiêci. Jej wywo³anie ma postaæ
LoadLibrary (nazwa-zbioru-bibliotecznego)
Argument (typu PAnsiChar) wskazuje na ³añcuch, któryzawiera nazwê zbioru dyskowego z wczytywan¹ bibliotek¹.
Gdy wczytanie biblioteki zakoñczy siê pomyœlnie, towartoœci¹ funkcji jest jej identyfikator w pamiêci. Wartoœæfunkcji równa 0 oznacza b³¹d podczas wczytywaniabiblioteki.Ka¿de wywo³anie funkcji LoadLibrary dla danej bibliotekizwiêksza wewnêtrzny licznik odwo³añ do niej o jeden .
DEL-3(21 z 65)
Biblioteki DLLImportowanie statyczne i dynamiczne
Do zwolnienia pamiêci zajêtej przez bibliotekê s³u¿y funkcjaFreeLibrary, której wywo³anie ma postaæ
FreeLibrary (identyfikator)Identyfikator oznacza argument bêd¹cy wartoœci¹ funkcjiLoadLibrary, która wczyta³a dan¹ bibliotekê do pamiêci.
Wartoœæ funkcji jest o tyle nieistotna, ¿e zwykle funkcjêFreeLibrary wywo³uje siê jak procedurê.
Wywo³anie funkcji FreeLibrary powoduje zmniejszeniewewnêtrznego licznika odwo³añ do danej biblioteki o jeden i jeœli licznik ten osi¹gnie wartoœæ zero – zwolnienie pamiêcizajêtej przez bibliotekê .
DEL-3(22 z 65)
Biblioteki DLLImportowanie statyczne i dynamiczne
Dostêp (dynamiczny) do funkcji i procedur biblioteki DLL,która zosta³a wczytana do pamiêci, jest mo¿liwy poprzezadres, do którego otrzymania s³u¿y funkcja GetProcAddress.Jej wywo³anie jest nastêpuj¹ce:
GetProcAddress (identyfikator, nazwa-funkcji-lub-procedury)
gdzie identyfikator jest wartoœci¹ funkcji LoadLibrary, a drugiargument (typu identycznego z PAnsiChar) wskazuje na ³añcuch, któryzawiera nazwê ¿¹danej funkcji lub procedury lub te¿ podaje jej liczbêporz¹dkow¹. W drugim przypadku bardziej znacz¹ce s³owo musi byæzerem, a s³owo mniej znacz¹ce – podawaæ odpowiedni¹ liczbê.
Wartoœci¹ funkcji GetProcAddress jest adres ¿¹danej funkcji lubprocedury, lub wartoœæ nil, gdy funkcji lub procedury nie odnaleziono.
DEL-3(23 z 65)
Biblioteki DLLImportowanie statyczne i dynamiczne
Przyk³adprogram programDLL;{$APPTYPE CONSOLE}uses SysUtils, Windows;...type complex = record
re, im : Extendedend;
var ident_1, ident_2 : HMODULE;addcplx : function (const a, b : complex) : complex;min : function (const a, b : Extended) : Extended;
...
deklaracja zmiennychdo przechowywania
identyfikatorów bibliotek
deklaracja zmiennych proceduralnychreprezentuj¹cych w programie funkcje z biblioteki
DEL-3(24 z 65)
Biblioteki DLLImportowanie statyczne i dynamiczne
begin ident_1:=LoadLibrary(’C:\DELPHI\BIBL\CPLXPROC.DLL’); ident_2:=LoadLibrary(’A:\MIN_MAX.DLL’);
if ident_1<>0 then @addcplx:= GetProcAddress(ident_1, PAnsiChar(1));
Przyk³ad (cd.)
wczytanie bibliotekdo pamiêci
import dynamicznyprzez liczbê porz¹dkow¹
DEL-3(25 z 65)
Biblioteki DLLImportowanie statyczne i dynamiczne
if ident_2<>0 then @min:=GetProcAddress(ident_2, ’MIN’);
if @addcplx<> nil then begin
...end;
if @min<>nil then begin
...end;
Przyk³ad (cd.)
import dynamicznyprzez nazwê
mo¿liwoœæ wywo³ania funkcji addcplx
mo¿liwoœæ wywo³ania funkcji minDEL-3(26 z 65)
Biblioteki DLLImportowanie statyczne i dynamiczne
if (@addcplx<> nil) and (@min<>nil) then begin
...end;
FreeLibrary (ident_1); FreeLibrary (ident_2); ...end.
Przyk³ad (cd.)
mo¿liwoœæ wywo³ania obu funkcji
usuniêcie bibliotek z pamiêci
DEL-3(27 z 65)
Biblioteki DLLTworzenie bibliotek DLL
Struktura biblioteki DLL jest nastêpuj¹ca:
library nazwa-biblioteki;deklaracje-modu³ówczêœæ-opisowabegin ci¹g-instrukcjiend.
Sposób przekazywniaprocedur i funkcjieksportowanych z bibliotekido programów lub modu³ówjest okreœlony w czêœciopisowej dodatkowymiklauzulami exports.
Czêœæ wykonawcza bloku spe³nia rolê czêœci inicjuj¹cejbiblioteki DLL.
DEL-3(28 z 65)
Biblioteki DLLTworzenie bibliotek DLL
W czêœci opisowej biblioteki wystêpuj¹ definicje funkcji i procedur eksportowalnych oraz (po nich) klauzule exports:
exports lista-eksportowa;Elementy listy eksportowej oddziela siê przecinkami, a ka¿dyz nich mo¿e mieæ jedn¹ z nastêpuj¹cych postaci:
identyfikatoridentyfikator index liczba-porz¹dkowaidentyfikator index liczba-porz¹dkowa name nazwaidentyfikator name nazwa
Dodatkowo na koñcu ka¿dego elementu listy eksportowejmo¿e wyst¹piæ s³owo (dyrektywa jêzyka) resident.
DEL-3(29 z 65)
Biblioteki DLLTworzenie bibliotek DLL
Identyfikator wystêpuj¹cy w ka¿dym elemencie listy klauzuliexports jest nazw¹ odpowiedniej funkcji lub proceduryeksportowej.
Jeœli w elemencie listy klauzuli exports wystêpuje dyrektywajêzyka index, oznacza to, ¿e eksport funkcji lub procedurymo¿e odbyæ siê poprzez podan¹ liczbê porz¹dkow¹. Liczba ta jest sta³¹ ca³kowit¹ i mo¿e mieæ wartoœæ od 1 do2 147 483 647.
DEL-3(30 z 65)
Biblioteki DLLTworzenie bibliotek DLL
Wyst¹pienie dyrektywy jêzyka name umo¿liwia eksportfunkcji lub procedury za pomoc¹ wyspecyfikowanej nazwy,któr¹ podaje siê w postaci ³añcucha.
Brak dyrektywy name oznacza, ¿e nazw¹ eksportow¹ jestidentyfikator danej funkcji lub procedury, którego wszystkiema³e litery zosta³y zamienione na wielkie.
Nazwa wystêpuj¹ca w dyrektywie name elementu listyklauzuli exports jest t¹ sam¹ nazw¹, któr¹ podaje siê pos³owie name w dyrektywie external w deklaracjiimportowanej funkcji lub procedury w programie, module lub innej bibliotece DLL.
DEL-3(31 z 65)
Biblioteki DLLTworzenie bibliotek DLL
Po wczytaniu biblioteki DLL do pamiêci dla elementów listyklauzuli exports, zawieraj¹cych s³owo resident, informacje o ich nazwach eksportowych s¹ przechowywane w pamiêci,co powoduje skrócenie czasu dostêpu do funkcji i procedurimportowanych przez nazwê.
Podane dalej przyk³ady przedstawiaj¹ ró¿ne sposobyustanawiania ³¹cz pomiêdzy bibliotek¹ i programem w zale¿noœci od postaci klauzuli exports w bibliotece.
DEL-3(32 z 65)
Biblioteki DLLTworzenie bibliotek DLL
Przyk³ad
library min_max;function min (const a, b : Extended) : Extended;begin ...end;function max (const a, b : Extended) : Extended;begin ...end;exports min, max;beginend.
DEL-3(33 z 65)
Biblioteki DLLTworzenie bibliotek DLL
Przyk³adDeklaracje w programie:
function min (const a, b : Extended) : Extended;external ’MIN_MAX.DLL’;
function max (const a, b : Extended) : Extended;external ’MIN_MAX.DLL’;
Z uwagi na standardowe przyjêcie nazw eksportowych w bibliotece,deklaracje funkcji min i max w programie mog¹ byæ tak¿e nastêpuj¹ce:
function min (const a, b : Extended) : Extended;external ’MIN_MAX.DLL’ name ’MIN’;
function max (const a, b : Extended) : Extended; external ’MIN_MAX.DLL’ name 'MAX';
DEL-3(34 z 65)
Biblioteki DLLTworzenie bibliotek DLL
Przyk³adNastêpuj¹ce deklaracje s¹ b³êdne:
function min (const a, b : Extended) : Extended; external ’MIN_MAX.DLL’ index 1;
function max (const a, b : Extended) : Extended; external ’MIN_MAX.DLL’ index 2;
Podczas wykonywania programu wyst¹pi warunek b³êduEAccessViolation.
Poniewa¿ importowanie funkcji odbywa siê przez nazwy, w celuskrócenia czasu dostêpu do nich mo¿na w klauzulê exports zapisaæ w postaci:
exports min resident , max resident; DEL-3(35 z 65)
Biblioteki DLLTworzenie bibliotek DLL
Przyk³ad
Dla klauzuli exports postaciexports min name ’MINAB’ resident , max name ’MAXAB’ resident;
deklaracje funkcji w programie powinny byæ nastêpuj¹ce:
function min (const a, b : Extended) : Extended; external ’MIN_MAX.DLL’ name ’MINAB’;
function max (const a, b : Extended) : Extended;external ’MIN_MAX.DLL’ name ’MAXAB’;
DEL-3(36 z 65)
Biblioteki DLLTworzenie bibliotek DLL
Przyk³ad
Mo¿liwe jest te¿ nadanie tym funkcjom w programie nowych nazw:
function minimum (const a, b : Extended) : Extended;external ’MIN_MAX.DLL’ name ’MINAB’;
function maximum (const a, b : Extended) : Extended;external ’MIN_MAX.DLL’ name ’MAXAB’;
Nazwa funkcji (lub procedury) w bibliotece, nazwa eksportowa i nazwafunkcji (procedury) w programie (lub module) mog¹ byæ ró¿ne!
DEL-3(37 z 65)
Biblioteki DLLTworzenie bibliotek DLL
Przyk³adJe¿eli klauzula exports bêdzie mia³a postaæ
exports min index 1, max index 2;
to w programie poprawna bêdzie ka¿da z poni¿szych deklaracji:function minimum (const a, b : Extended) : Extended;
external ’MIN_MAX.DLL’ index 1;function maximum (const a, b : Extended) : Extended;
external ’MIN_MAX.DLL’ index 2;function minimum (const a, b : Extended) : Extended;
external ’MIN_MAX.DLL’ name ’MIN’;function maximum (const a, b : Extended) : Extended;
external ’MIN_MAX.DLL’ name ’MAX’;DEL-3(38 z 65)
Biblioteki DLLTworzenie bibliotek DLL
Przyk³adJe¿eli klauzula exports bêdzie mia³a postaæ
exports min index 1, max index 2;
to w programie poprawna bêdzie ka¿da z poni¿szych deklaracji:function min (const a, b : Extended) : Extended;
external ’MIN_MAX.DLL’ index 1;function max (const a, b : Extended) : Extended;
external ’MIN_MAX.DLL’ index 2;function min (const a, b : Extended) : Extended;
external ’MIN_MAX.DLL’ name ’MIN’;function max (const a, b : Extended) : Extended;
external ’MIN_MAX.DLL’ name ’MAX’;DEL-3(39 z 65)
Biblioteki DLLTworzenie bibliotek DLL
Biblioteki ³¹czone dynamiczniemog¹ sk³adaæ siê z proceduri funkcji zdefiniowanychw kilku modu³ach. Zazwyczajw takich przypadkachbiblioteka sk³ada siê tylkoz deklaracji modu³ów, klauzuliexports i czêœci inicjuj¹cej. Jejstruktura jest wówczasnastêpuj¹ca:
library nazwa-biblioteki ;uses modu³-1, modu³-2, ... , modu³-n;exports modu³-1.nazwa-11 index 1, ... modu³-1.nazwa-1k index k, ... modu³-n.nazwa-n1 index m!nl+n1, ... modu³-n.nazwa-nl index m;begin instrukcje-inicjuj¹ceend.
DEL-3(40 z 65)
Biblioteki DLLTworzenie bibliotek DLL
Instrukcje czêœci inicjuj¹cej biblioteki s¹ wykonywane tylkoraz, podczas wczytywania biblioteki do pamiêci. W chwiliwprowadzania do programu kolejnego programuwykorzystuj¹cego dan¹ bibliotekê jest zwiêkszany specjalnylicznik jej wykorzystania.
Biblioteka pozostaje w pamiêci dopóty, dopóki licznik ten mawartoœæ wiêksz¹ od zera. Dla wartoœci licznika równej zerujest wykonywana procedura wyjœcia (zamkniêcia) biblioteki,której adres jest pamiêtany w predefiniowanej zmiennejExitProc.
DEL-3(41 z 65)
c instalacjê w³asnej procedury wyjœcia,
c instrukcje przypisuj¹ce wartoœci pocz¹tkowe zmiennymglobalnym biblioteki,
c instrukcje rejestruj¹ce klasy okienek (dotyczy bibliotekwykorzystywanych w programach okienkowych, które napisanoprzy u¿yciu biblioteki VCL),
c instrukcjê sygnalizuj¹c¹ wyst¹pienie b³êdu (najczêœciej jest onapo³¹czona ze sprawdzeniem wartoœci predefiniowanej zmiennejExitCode, której wartoœæ 0 oznacza bezb³êdne zainicjowaniebiblioteki, a wartoœæ tej zmiennej ró¿na od 0 powoduje usuniêciebiblioteki z pamiêci, a program, który j¹ wywo³a³, sygnalizujeb³¹d wczytywania biblioteki).
Biblioteki DLLTworzenie bibliotek DLL
Czêœæ inicjuj¹ca zawiera zwykle:
DEL-3(42 z 65)
Biblioteki DLLTworzenie bibliotek DLL
Przyk³ad (zainstalowanie w³asnej procedury wyjœcia)
library Test;var SaveExit : Pointer;procedure LibExit; { w³asna procedura wyjœcia biblioteki }begin ... { instrukcje wykonywane przed usuniêciem
biblioteki z pamiêci } ExitProc:=SaveExitend;begin ... { inicjowanie biblioteki } SaveExit:=ExitProc; { zapamiêtanie wskaŸnika procedury wyjœcia } ExitProc:=@LibExit { zainstalowanie procedury wyjœcia LibExit }end.
DEL-3(43 z 65)
Biblioteki DLLB³êdy wykonania w bibliotekach DLL
W przypadku wyst¹pienia w bibliotece DLL, w którejzadeklarowano modu³ SysUtils, warunku b³êdu lubstanu wyj¹tkowego i nieobs³u¿enia go, warunek tenjest propagowany na zewn¹trz biblioteki .
Gdy biblioteka zosta³a wywo³ana z programunapisanego w jêzyku Delphi Pascal, to warunek mo¿ebyæ w nim obs³u¿ony za pomoc¹ instrukcjitry...except.
DEL-3(44 z 65)
Biblioteki DLLB³êdy wykonania w bibliotekach DLL
Jeœli jednak dan¹ bibliotekê wywo³a programnapisany w innym jêzyku, to nale¿y go w nimobs³u¿yæ jako warunek b³êdu œrodowiska Windows o kodzie $0EEDFACE.
Informacja o adresie b³êdu jest zawarta w pierwszymelemencie tablicy ExceptionInformation rekordu œrodowiskaWindows o nazwie Exception_Record (informacje znajduj¹ siê w systemie pomocy). Drugi element tej tablicyzawiera odwo³anie do obiektu reprezentuj¹cego b³¹d w jêzyku Delphi Pascal.
DEL-3(45 z 65)
Biblioteki DLLB³êdy wykonania w bibliotekach DLL
Jeœli w bibliotece DLL nie zadeklarowano modu³uSysUtils, to po wyst¹pieniu w niej b³êduwykonywanie programu, który wywo³a³ bibliotekê,zostanie przerwane (program zostanie usuniêty z pamiêci).
Z tego powodu nale¿y dok³adnie przetestowaæ tak¹bibliotekê, aby jakiekolwiek b³êdy wykonania niemog³y w niej wyst¹piæ.
DEL-3(46 z 65)
cparametry przekazywane przez wartoœci,
cparametry przekazywane przez sta³e okreœlonego typu,
cparametry przekazywane przez zmienne okreœlonegotypu,
cparametry przekazywane przez sta³e nieokreœlonegotypu,
cparametry przekazywane przez zmienne nieokreœlonegotypu,
Funkcje i proceduryRodzaje parametrów
W zale¿noœci od sposobu przekazywania wartoœci do procedurylub funkcji, tj. zastêpowania parametrów formalnychargumentami, wyró¿niamy 10 rodzajów parametrów:
DEL-3(47 z 65)
cparametry wyjœciowe okreœlonego typu,
cparametry wyjœciowe nieokreœlonego typu,
cparametry otwarte,
cotwarte parametry tablicowe typu wariantowego,
cparametry o domyœlnej wartoœci.
Funkcje i proceduryRodzaje parametrów
W zale¿noœci od sposobu przekazywania wartoœci do procedurylub funkcji, tj. zastêpowania parametrów formalnychargumentami, wyró¿niamy 10 rodzajów parametrów:
DEL-3(48 z 65)
Funkcje i proceduryParametry przekazywane przez wartoœci
Deklaracja:
lista-parametrów : typPoszczególne parametry listy parametrów oddziela siê przecinkami.Typ oznacza identyfikator typu lub s³owo kluczowe string.Dla parametrów typu ³añcuchowego ( string) nie jest dozwolonaspecyfikacja d³ugoœci ³añcucha.
Je¿eli parametr jest przekazywany przez wartoœæ, tow wywo³aniu procedury (funkcji) odpowiadaj¹cymu argument mo¿e byæ wyra¿eniem .Parametry przekazywane przez wartoœci nie mog¹ byæ typu plikowego i typu strukturalnego o elementach sk³adowych typu plikowego.
DEL-3(49 z 65)
Funkcje i proceduryParametry przekazywane
przez sta³e okreœlonego typu
Deklaracja:
const lista-parametrów : typParametry tego rodzaju s¹ w treœci procedury lub funkcji traktowanejako zmienne lokalne przeznaczone tylko do odczytu.
Argument wywo³ania odpowiadaj¹cy parametrowiprzekazywanemu przez sta³¹ okreœlonego typuw ogólnoœci mo¿e byæ wyra¿eniem , ale jego typ musibyæ zgodny w sensie przypisania z typem parametruformalnego.Dla parametrów typu ³añcuchowego i strukturalnego zaleca siê stosowaæ parametryprzekazywane przez sta³e zamiast przekazywanych przez wartoœci, gdy¿ kompilator generujedla nich bardziej efektywny kod wynikowy.
DEL-3(50 z 65)
Funkcje i proceduryParametry przekazywane
przez zmienne okreœlonego typu
Deklaracja:
var lista-parametrów : typ
Argumenty odpowiadaj¹ce parametromprzekazywanym przez zmienn¹ okreœlonego typumusz¹ byæ zmiennymi .
Typ odpowiedniej zmiennej musi byæ przy tymidentyczny z typem parametru formalnego.Zastosowanie tych parametrów do przekazywania elementów tablicwariantowych nie jest dozwolone.Parametry typu plikowego mog¹ byæ przekazywane tylko przezzmienn¹.
DEL-3(51 z 65)
Funkcje i proceduryParametry przekazywane
przez sta³e i zmienne nieokreœlonego typu
Deklaracje:const lista-parametrówvar lista-parametrów
Argumenty im odpowiadaj¹ce mog¹ byæ litera³amilub zmiennymi dowolnych typów .W treœci procedury (funkcji) parametry te nie s¹ zgodne z ¿adnymiinnymi zmiennymi. Zgodnoœæ tê uzyskuje siê za pomoc¹ konstrukcjizmiany typu zmiennej , która „nadaje” parametrom odpowiednie typy.
Parametry nieokreœlonego typu s³u¿¹ g³ównie do konstrukcji procedur i funkcji przetwarzaj¹cych podobne struktury danych, ale o ró¿nychrozmiarach.
DEL-3(52 z 65)
Funkcje i proceduryParametry wyjœciowe
Deklaracje:out lista-parametrów : typout lista-parametrów
Argument odpowiadaj¹cy parametrowiwyjœciowemu musi byæ zmienn¹ .Parametry te s¹ przeznaczone do przekazywania wartoœci z procedury lub funkcji na zewn¹trz.
Jakiekolwiek wartoœci nadane argumentom odpowiadaj¹cymparametrom wyjœciowym przed wywo³aniem procedury(funkcji) po przekazaniu do procedury (funkcji) s¹anulowane.
DEL-3(53 z 65)
Funkcje i proceduryParametry otwarte
Deklaracje:var parametr : array of identyfikator-typuconst parametr : array of identyfikator-typuparametr : array of identyfikator-typu
Zastosowanie tych parametrów umo¿liwia przekazywanie dotej samej procedury lub funkcji tablic o ró¿nych rozmiarach.
Parametr aktualny (argument) odpowiadaj¹cy tablicowemuparametrowi otwartemu musi byæ zmienn¹ typu okreœlonegoprzez identyfikator typu lub tablic¹ elementów o typie okreœlonym przez ten identyfikator.
DEL-3(54 z 65)
Funkcje i proceduryParametry otwarte
W treœci procedury lub funkcji tablicowy parametr otwartyjest traktowany tak, jakby by³ zadeklarowany za pomoc¹konstrukcji
array [0..n!1] of identyfikator-typugdzie n oznacza liczbê elementów argumentu.
Jeœli argument jest zmienn¹ typu okreœlonego przezidentyfikator typu, to traktuje siê go jak tablicêjednoelementow¹ o tym typie.
W treœci funkcji lub procedury do okreœlenia liczbyelementów tablicy otwartej stosuje siê funkcjê standardow¹High.
DEL-3(55 z 65)
Funkcje i proceduryOtwarte parametry tablicowe typu wariantowego
S³u¿¹ do przekazywania do procedury lub funkcjitablic zawieraj¹cych wartoœci ró¿nych typów.Typ takiego parametru powinien byæ okreœlony za pomoc¹konstrukcji
array of constktóra odpowiada konstrukcji
array of TVarRec
gdzie TVarRec oznacza wariantowy typ rekordowy(predefiniowany w module System), który mo¿ereprezentowaæ wartoœci ró¿nych (ale nie wszystkich) typów.
DEL-3(56 z 65)
Funkcje i proceduryParametry o domyœlnej wartoœci
Deklaracje:
const parametr : typ = wyra¿enie-sta³eparametr : typ = wyra¿enie-sta³e
Parametry z domyœlnymi wartoœciami musz¹wyst¹piæ jako ostatnie na liœcie parametrów.
Ka¿dy parametr z domyœln¹ wartoœci¹ musi byæprzy tym specyfikowany oddzielnie (u¿ycie listyparametrów nie jest dozwolone).
DEL-3(57 z 65)
ckolejnoœci przekazywania parametrów,
cautomatycznego usuwania parametrów ze stosu,
cu¿ywania rejestrów przez parametry,
cobs³ugi warunków b³êdów i stanówwyj¹tkowych.
Funkcje i proceduryKonwencje wywo³ania
W jêzyku Delphi Pascal wystêpuje piêæ dyrektyw(register, pascal, cdecl, stdcall i safecall), za pomoc¹których ustala siê sposób przekazywania parametróww funkcjach, procedurach i metodach. Ustalenia te,zwane konwencjami wywo³ania , dotycz¹:
DEL-3(58 z 65)
Funkcje i proceduryKonwencje wywo³ania
register – dyrektywa domyœlna (nie wymaga okreœlania);parametry s¹ przekazywane od strony lewej do prawej, a wiêcw kolejnoœci ich wyspecyfikowania; przy przekazywaniuparametrów zostanie wykorzystanych od jednego do trzechrejestrów procesora (EAX, EDX oraz ECX); po wykonaniufunkcji lub procedury wszystkie parametry zostan¹automatycznie usuniête ze stosu
pascal – jw., ale rejestry procesora nie bêd¹ u¿ywane
DEL-3(59 z 65)
Funkcje i proceduryKonwencje wywo³ania
stdcall – przekazywanie parametrów od strony prawej dolewej i brak u¿ywania w tym procesie rejestrów procesora; pozakoñczeniu wykonywania funkcji lub procedury parametryzostan¹ usuniête ze stosu
cdecl – jw., ale usuniêcie parametrów ze stosu musi byæzabezpieczone w miejscu wywo³ania danej funkcji lubprocedury (po jej wykonaniu i przekazaniu z niej sterowania);zaprogramowanie odpowiednich instrukcji (zwykle w asemblerze) jest zadaniem programisty.
safecall – dotyczy wy³¹cznie metod ³¹cz dualnych (pomijamy)
DEL-3(60 z 65)
Funkcje i proceduryKonwencje wywo³ania
Domyœlna konwencja wywo³ywania ( register ) jest najbardziejefektywna, gdy¿ wskutek wykorzystywania rejestrówprocesora czêsto nie potrzeba umieszczaæ parametróww stosie (dzieje siê tak zawsze, gdy liczba parametrów nieprzekracza trzech).
Konwencje okreœlone dyrektywami pascal i cdecl stosuje siêzwykle przy wywo³ywaniu funkcji i procedur z bibliotek³¹czonych dynamicznie napisanych w jêzykach C, C++ lubinnych.
W przypadku wywo³ywania funkcji œrodowiska Windowsstosuje siê konwencjê okreœlon¹ dyrektyw¹ stdcall.
DEL-3(61 z 65)
Funkcje i proceduryPrzeci¹¿anie
W obrêbie tego samego zakresu wa¿noœciidentyfikatorów mo¿na zdefiniowaæ wiêcej ni¿ jedn¹funkcjê i (lub) procedurê o takiej samej nazwie.
Wielokrotne definiowanie funkcji i procedur o takichsamych nazwach nazywa siê przeci¹¿aniem (ang.overloading).
W definicjach funkcji i procedur przeci¹¿anych jestkonieczne wyspecyfikowanie dyrektywy jêzykaoverload .
DEL-3(62 z 65)
Funkcje i proceduryPrzeci¹¿anie
Jeœli dwie lub wiêcej funkcji i (lub) procedurprzeci¹¿onych ma tak¹ sam¹ nazwê, to powstajepytanie: w jaki sposób nastêpuje identyfikacjaodpowiedniej funkcji i (lub) procedury w chwiliwywo³ania?
Odpowiedzi¹ na to pytanie jest regu³a, ¿e takiefunkcje i procedury musz¹ ró¿niæ siê liczb¹ lubtypami parametrów. W chwili wywo³ania funkcji lubprocedury przeci¹¿onej w³aœnie po liczbie lub typachargumentów nastêpuje odpowiednia identyfikacja.
DEL-3(63 z 65)
Funkcje i proceduryPrzeci¹¿anie
Przyk³adZa³ó¿my, ¿e zdefiniowanodwie funkcje przeci¹¿one:
function suma (a, b, c : Real) : Real; overload ;
begin Result:=a+b+c end;
function suma (a, b, c : Integer) : Integer; overload ;
begin Result:=a+b+c end;
W instrukcji
x:=suma(1, 2, 3);
zostanie wywo³ana drugafunkcja suma , a w instrukcji
z:=suma(1, 2, 3.0);
– pierwsza (pierwsze dwaargumenty zostan¹zamienione na typ Real).
DEL-3(64 z 65)