Aplicații pentru DLL-uri
Deci, de ce avem nevoie de DLL-uri și de unde sunt folosite? Vom enumera doar câteva dintre domeniile aplicației:
- Biblioteci individuale. conținând funcții suplimentare utile pentru programatori. De exemplu, funcții pentru lucrul cu șiruri de caractere sau - biblioteci complexe pentru conversia imaginilor.
- Resurse de stocare. În DLL puteți stoca nu numai programe și funcții, ci și diverse resurse - icoane, desene, șir de șir, meniuri etc.
- Biblioteci de suport. De exemplu, există biblioteci de astfel de pachete cunoscute ca: DirectX. ICQAPI (API pentru ICQ), OpenGL etc.
- Părți ale programului. De exemplu, într-un DLL, puteți stoca ferestre de programe (formulare) și așa mai departe.
- Plugins (Pluginuri). - Aici este domeniul real pentru gândurile programatorului! Pluginurile sunt adăugiri la programul care extind capabilitățile acestuia. De exemplu, în acest articol, vom examina teoria creării unui plug-in pentru propriul program.
- Resursă partajată. DLL (Dynamic Link Library) poate fi utilizat simultan de mai multe programe sau procese (așa-numita resursă partajată partajată)
O scurtă descriere a funcțiilor și tehnicilor de lucru cu DLL-uri
Deci, care sunt trucurile și funcțiile pe care trebuie să le utilizați pentru a lucra cu DLL-ul? Să analizăm două metode de import de funcții din bibliotecă:
1 fel. Bind DLL la program. Aceasta este metoda cea mai simplă și cea mai simplă pentru utilizarea funcțiilor importate dintr-un DLL. Cu toate acestea (și acest lucru ar trebui remarcat), această metodă are un dezavantaj foarte important - în cazul în care biblioteca, care este utilizat de program nu este găsit, atunci programul pur și simplu nu va începe, da eroare și a raportat că resursa DLL nu a fost găsit. O căutare bibliotecă va fi efectuată: în directorul curent, în directorul programului, în WINDOWS \ SYSTEM, etc.
Deci, pentru început - forma generală a acestei tehnici:
punerea în aplicare
.
funcția Nume_funcțional (Par1: Par1Tip; Par2: Par2Tip ;.): ReturnType; stdcall; nume extern 'DLLNAME.DLL' nume 'FunName' index FuncIndex;
// sau (dacă nu o funcție, ci o procedură):
procedură ProcedurăName (Par1: Par1Type; Par2: Par2Type;); stdcall; nume extern "DLLNAME.DLL" nume de procedură "index" ProcIndex;
Aici: FunctionName (sau ProcedureName) - numele functiei (sau procedurii) care va fi folosita in programul dumneavoastra;
Par1, Par2. - numele parametrilor unei funcții sau unei proceduri;
Par1Type, Par2Type. - tipurile de parametri ai unei funcții sau proceduri (de exemplu, Integer);
ReturnType - tipul valorii returnate (numai pentru funcție);
stdcall - o directivă care ar trebui să se potrivească exact cu cea utilizată în DLL în sine;
externă „DLLNAME.DLL“ - directivă specifică numele unui DLL extern, care vor fi importate din funcția sau procedura (în acest caz - DLLNAME.DLL);
nume "FunctionName" ("ProcedureName") - o directivă care indică numele exact al funcției în DLL-ul propriu-zis. Aceasta este o directivă opțională care vă permite să utilizați o funcție în program care are un alt nume decât cel adevărat (pe care îl are în bibliotecă);
index FunctionIndex (ProcedureIndex) - o directivă care indică numărul de ordine al unei funcții sau proceduri în DLL. Aceasta este, de asemenea, o directivă facultativă.
2 fel. Încărcarea dinamică a DLL. Aceasta este o metodă mult mai complicată, dar și mai elegantă. El nu are dezavantajul primei metode. Singurul lucru care este neplăcut - cantitatea de cod necesare pentru punerea în aplicare a acestei metode, dificultatea este că funcția de DLL viewable.END_BOLD importate numai atunci când acest DLL este încărcat și stocat în memorie. Puteți vedea un exemplu de mai jos, dar pentru moment - o scurtă descriere a funcțiilor WinAPI utilizate de această metodă:
LoadLibrary (LibFileName: PChar) - Încarcă librăria specificată LibFileName în memorie. La finalizarea cu succes, funcția returnează un mâner (THandle) în DLL din memorie.
GetProcAddress (Modul: THandle; ProcName: PChar) - citește adresa funcției bibliotecii expirate. La terminarea cu succes, funcția returnează mânerul (TFarProc) al funcției în DLL-ul încărcat.
FreeLibrary (LibModule: THandle) - invalidează LibModule și eliberează memoria asociată cu aceasta. Trebuie menționat faptul că după ce ați apelat la această procedură, funcțiile acestei biblioteci nu mai sunt disponibile.
Practică și exemple
Ei bine, acum este timpul să dați câteva exemple de utilizare a metodelor și tehnicilor de mai sus:
Exemplu 1. Bind DLL la program
Dacă doriți să plasați o formă non-modală în DLL, trebuie să faceți două funcții - deschiderea și închiderea formularului. Procedând astfel, trebuie să faceți DLL-ul să rețină descriptorul acestui formular.
Aici nu ne vom uita la pluginuri în detaliu, pentru că exemplele de mai sus vă vor ajuta să înțelegeți cu ușurință partea de leu a programării DLL. Vă reamintesc doar că plug-in-ul este o completare a programului, care își extinde capabilitățile. În același timp, programul în sine trebuie să prevadă astfel de adăugiri și să le permită să își îndeplinească misiunea.