Utilizarea și crearea DLL-urilor în Delphi
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 ar trebui să acordați atenție acestui lucru), această metodă are un dezavantaj semnificativ - dacă biblioteca utilizată de program nu este găsită, programul pur și simplu nu va porni, emite o eroare și raportează că resursa DLL nu a fost găsită. Și biblioteca va fi căutată: în directorul curent, în directorul de programe, în directorul 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 funcției (sau procedurii) care va fi utilizată în programul dvs.;
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;
externe "DLLNAME.DLL" este o directivă care specifică numele DLL-ului extern din care va fi importată această funcție sau procedură (î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 este cantitatea de cod necesară pentru implementarea acestei tehnici, iar dificultatea este că funcția importată din DLL este disponibilă numai atunci când acest DLL este încărcat și este î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:
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.
Crearea pluginurilor
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.
Karikh Nikolay. Regiunea Moscova, orașul Zhukovsky