Dezvoltarea DLL în Borland Delphi
Procedurile de apel și funcțiile încărcate din DLL.
Modul în care numiți proceduri și funcții depinde de modul în care ați încărcat biblioteca dinamică în care sunt localizate aceste rutine.
Cuvântul cheie extern indică compilatorului că această procedură poate fi găsită în biblioteca dinamică (în cazul nostru, myfirstdll.dll). Apoi, apelul la această procedură arată astfel:
Atunci când importați funcții și proceduri, fiți deosebit de atenți când scrieți numele și interfețele! Faptul este că, în procesul de elaborare a cererii nu se efectuează verificări privind corectitudinea numelor de obiecte, care sunt exportate din DLL, nu vor fi efectuate, și dacă ați descris incorect o anumită funcție, atunci o excepție va fi generată numai în timpul rulării.
Importul din DLL poate fi realizat prin numele procedurii (funcția), numărul secvenței sau alocarea unui nume diferit.
În primul caz, pur și simplu să declare numele procedurii și biblioteca din care importul său (așa cum sa discutat mai sus). Importul prin numărul de serie vă solicită să specificați acest număr:
În acest caz, numele pe care îl dați procedurii când importați nu trebuie să se potrivească cu cel specificat pentru aceasta în DLL-ul însuși. Ie Se înregistrează mijloacele de mai sus pe care le importă din myfirstdll.dll procedură librăria dinamică, care a fost exportat către cincisprezecelea, și în același timp, ca parte a cererii dumneavoastră această procedură este dat numele sayHello.
Dacă din anumite motive nu utilizați metoda de import descrisă mai sus, dar totuși doriți să modificați numele funcției importate (procedură), puteți utiliza a treia metodă:
Aici procedeul importat CoolProcedure este denumit DoSomethingReallyCool. Procedurile de apelare și funcțiile importate din bibliotecile încărcate dinamic sunt oarecum mai complicate decât metoda discutată mai sus. În acest caz, trebuie să declarați un indicator pentru funcția sau procedura pe care o veți utiliza. Amintiți-vă procedura HelloWorld? Să vedem ce trebuie făcut pentru a determina executarea acesteia în cazul încărcării dinamice a DLL-ului. În primul rând, trebuie să declarați un tip care descrie această procedură:
Acum trebuie să încărcați o bibliotecă de legături dinamice, folosind GetProcAddress pentru a obține un pointer la un apel de procedură această procedură pentru a efectua, și în cele din urmă descărca DLL-ul din memorie. Mai jos este un cod care demonstrează modul în care se poate face acest lucru:
După cum sa menționat mai sus, unul dintre dezavantajele încărcării DLL statice este incapacitatea de a continua rularea aplicației în absența uneia sau a mai multor biblioteci. În cazul încărcării dinamice, puteți să gestionați programatic aceste situații și să împiedicați ca programul să cadă pe cont propriu. Pe valorile returnate de valorile LoadLibrary și GetProcAddress, puteți determina dacă biblioteca a fost încărcată cu succes și dacă a fost găsită procedura solicitată de aplicație. Codul de mai jos demonstrează acest lucru.
În DLL puteți stoca nu numai codul, ci și formularele. Și crearea și plasarea de forme într-o bibliotecă dinamică nu este prea diferită de lucrul cu formele dintr-un proiect convențional. În primul rând, ne vom uita la modul de a scrie o bibliotecă care conține forma, și apoi vom vorbi despre utilizarea tehnologiei MDI în DLL.
Dezvoltarea DLL care conține formularul, voi demonstra prin exemplu.
Deci, în primul rând, vom crea un nou proiect al bibliotecii dinamice. Pentru aceasta, selectați elementul de meniu Fișier | Nou, apoi faceți dublu clic pe pictograma DLL. După aceea, veți vedea ceva de genul:
Salvați proiectul primit. Se numește DllForms.dpr.
Acum creați un nou formular. Acest lucru se poate face în moduri diferite. De exemplu, selectați Fișier | Formular nou. Adăugați câteva elemente în formular. Se numește formularul DllForm și se salvează modulul rezultat ca DllFormUnit.pas.
Să revenim la modulul principal al proiectului și să punem în el funcția ShowForm, sarcina căreia va fi crearea și afișarea acestuia. Utilizați codul de mai jos pentru a face acest lucru.
Luați în considerare faptul că pentru proiect a fost compilat fără erori, trebuie să adăugați la secțiunea utilizări a modulului Formulare.
Exportim funcția noastră folosind cuvântul cheie de export:
Compilam proiectul și obținem fișierul dllforms.dll. Acești pași simpli sunt tot ce trebuie să faceți pentru a crea o bibliotecă dinamică care conține un formular. Rețineți că funcția ShowForm este declarată utilizând cuvântul cheie stdcall. Acesta semnalizează compilatorului să utilizeze convenția standard de apel (convenție) atunci când exportă funcția. Exportarea funcției în acest fel face posibilă utilizarea DLL-ului dezvoltat nu numai în aplicațiile create în Delphi.
De asemenea, rețineți că valoarea returnată de funcția ShowForm. corespunde valorii ShowModal. În acest fel, puteți trimite o anumită informație despre starea formularului către aplicația de asteptare.
Mai jos este o listă a celor două, dintre care primul conține codul complet pentru fișierul de proiect DLL (forma modul nu este dat aici), iar al doilea - un modul al aplicației de asteptare, care este folosit doar că ne-am dezvoltat o bibliotecă.
Rețineți că atunci când funcția a fost exportată, a fost folosit și cuvântul cheie stdcall.
Ar trebui să acordați o atenție specială lucrului cu formularele copil în DLL. În cazul în care, de exemplu, în cererea de chemare forma principală are o valoare de FormStyle, MDIForm egală, atunci când încercați să apelați la DLL MDIChild-formular, veți vedea un mesaj de eroare care va fi rostit, că nu există MDI-formă activă.
În momentul în care încercați să afișați fereastra copilului dvs., VCL verifică corectitudinea proprietății FormStyle a formularului principal de cerere. Cu toate acestea, în cazul nostru totul pare a fi corect. Deci ce sa întâmplat? Problema este că atunci când se efectuează un astfel de control, se examinează obiectul Application, care nu aparține aplicației de apel, ci bibliotecii dinamice în sine. Bineînțeles, deoarece nu există o formă principală în DLL, verificarea eșuează. Pentru a evita o astfel de situație, trebuie să alocați obiectul Application al aplicației de apelare bibliotecii dinamice a obiectului Application. Firește, acest lucru va funcționa numai atunci când programul de apelare este o aplicație VCL. În plus, înainte de a descărca biblioteca din memorie, trebuie să returnați valoarea obiectului Application Application în starea inițială. Acest lucru va permite administratorului de memorie să elibereze memoria din bibliotecă. Prin urmare, trebuie să salvați pointerul la "nativ" pentru obiectul Obiect aplicație bibliotecă din variabila globală, care poate fi utilizat la restabilirea valorii sale.
Deci, ne întoarcem un pic, și sunt pașii pe care trebuie să lucreze cu plasate în DLL MDIChild-forme.- În biblioteca dinamică, creăm o variabilă globală de tip TApplication.
- Salvăm pointerul la obiectul Application DLL din variabila globală.
- Obiectul Aplicație al bibliotecii dinamice este pus în corespondență cu pointerul aplicației aplicației la aplicația de asteptare.
- Creați formatul MDIChild și lucrați cu el.
- Revenim la starea inițială valoarea obiectului Application al bibliotecii dinamice și descărcăm DLL-ul din memorie.
Apoi vom crea o procedură care va schimba valoarea obiectului Application și va crea formatul copil. Procedura ar putea arăta astfel:
Tot ce trebuie să facem acum este să readucem valoarea obiectului Aplicație la starea inițială. Facem acest lucru folosind procedura MyDllProc:
Utilizați dinamic la prima vedere. DLL-urile oferă cele mai largi posibilități de optimizare a performanțelor aplicațiilor, precum și munca programatorilor înșiși. Utilizați DLL-ul și poate că viața dvs. va deveni mai ușoară!
Pentru mai multe informații, vă rugăm să ne contactați la Interface Ltd.