Andrzej Marciniak - cs.put.poznan.pl · Procedury i funkcje mog¹ byæ pobierane z bibliotek DLL do...

65
Zaawansowane programowanie w (pakiecie) Delphi DEL-3(1 z 65) Andrzej Marciniak Prezentacja multimedialna przygotowana za pomoc¹ systemu Corel® Presentations 11 i X3 Copyright © 2004 - 2010 by Andrzej Marciniak DEL420

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)

... toju¿(dopiero)koniecnadzisiaj ...

DEL-3(65 z 65)