biblioteci partajate - surse delphi faq
bibliotecă de legături dinamice (DLL - Dynamic Link Library) este un mecanism universal pentru integrarea în procedurile dumneavoastră de program și funcții scrise de alți programatori și, în general, altele decât Object Pascal, limbaje de programare.
DLL sunt implementate ca module executabile care conțin gata de lucru proceduri, funcții, și / sau resurse. Din perspectiva unui programator, există multe similitudini între DLL și uzuale pentru unitățile de Pascal obiect, adică. A. Pe termen lung și biblioteci și module livra rutine, scutind programator de a scrie propriul cod. Dar există diferențe fundamentale. Cea mai importantă dintre ele este faptul că DLL-ul nu este în măsură să furnizeze programul de variabile, constante și tipuri, deoarece creatorii DLL pot utiliza limbaje de programare non-tastate, cum ar fi limbajul de asamblare. Ca urmare, DLL nu pot fi exportate în program, astfel necesare clase de azi programator - pachete sunt folosite în acest scop.
DLL conexiune dinamică le oferă un avantaj mai important asupra modulelor: schimba orice DLL, în cele mai multe cazuri nu necesita recompilarea folosind programul său.
Structura DLL a textului urmează structura programului regulat, cu excepția faptului că situațiile secțiunea executabile din DLL joacă același rol ca inițiator al modulului: această parte a operatorilor sunt executate doar o singură dată, la momentul încărcării bibliotecii în memorie. Fiecare tratament succesiv cu cerința de a încărca biblioteca este în creștere de una dintre numărul de sale de referință, dar nu conduce la punerea în aplicare a declarației este executată.
În plus față de numele subrutina în antetul DLL este plasat ca numărul de serie, mai precis, atribuit de un index întreg. Acest lucru permite apelantului să nu se refere la numele și indicele de sub-program și, prin urmare, reduce timpul necesar pentru a stabili o conexiune cu ea. Indicele este atribuit ordinea de rutină a apariției sale în nomenclatoare: prima rutină din prima listă devine indexul 0, următoarea - 1, etc Programatorul poate schimba indexare silențios și specificați în mod explicit codul subrutină, adăugând numelui ei în indexul listă Exporturile cuvânt și întreaga .. număr fără semn în intervalul 0 32767:
Programatorul poate defini numele extern al rutinelor exportate, altele decât numele ei real. Pentru a face acest lucru, se adaugă cuvântul lista Exporturile numele și denumirea extern în apostrofuri:
Apelantul poate de referință sau numele rutinelor exportate, sau indexul său. Când apelați pe numele programului se uită la numele din tabela de simboluri pentru a găsi dreapta. Deoarece numele poate consta dintr-un set lung de caractere și de ei înșiși nume în tabel pot fi multe, procesul de căutare pentru numele mai lent decât indicele procesului de căutare. Prin urmare, programatorii experimentați preferă să nu se refere la numele unei subrutină pe index.
Am act de faptul că, în contrast cu modulele Delphi sunt în mod automat compilează DLL în modul de a construi sau a face, t. Pentru a. Târgul se vede ca un alt program, nu este conectat la momentul întocmirii programului principal.
Notă: toate funcțiile noastre DLL folosesc stdcall acord, care asigură compatibilitatea noilor funcții cu API-ul pentru Windows 32. Nu am putut preciza acest acord; În acest caz, compilatorul ar utiliza un registru mai eficient acord, dar un apel la DLL noastre de programe scrise în alte limbaje de programare, în general, ar deveni imposibilă.
Dacă ați creat un DLL pentru isolzovaniya „externe“ (vneDelphi), declara un subprogram cu Directiva stdcall sau safecall!
Pentru a utiliza rutinele de DLL este necesar pentru a le descrie ca extern, adăugând cuvântul pentru numele de bibliotecă externă în apostrofuri:
După cum sa menționat deja, subrutina este numit după nume sau index. În exemplul nostru de MyDLL biblioteca subrutine cu „“ murgos nume extern. Dacă trebuie să se refere la codul subprogram pentru numele bibliotecii indică indicele de cuvânt și indicele:
În acest caz, denumirea sub care este rutina programe bine cunoscute, poate să nu coincidă cu DLL extern-numele. Cu toate acestea, programatorul poate înlocui în mod explicit numele subrutina, chiar dacă se referă la numele său extern:
În acest exemplu de realizare, se presupune că procedura este exportată în numele extern „ExtName“.
13.4.1. încărcare statică
Programul următor utilizează biblioteca Smpix descrisă pe pagina anterioară.
Notă: cmpixAdd funcția de bibliotecă are un nume ADDC extern. Acesta este cazul (cu majuscule) descrie această funcție în exemplul de mai sus. Dacă am folosit
linker-ul nu a putut identifica.
13.4.2. încărcare dinamică
Metoda descrisă mai sus de determinare a funcțiilor și procedurilor DLL (folosind directivele externe) determina compilatorul pentru a pune în antetul programului de lista tuturor DLL, și încărcător va încărca biblioteca în memorie, chiar în timp ce descărcarea programului. Programul poate încărca DLL fără a utiliza trei Externe
Caracteristici standard. LoadLibrary, GetProcAddress și FreeLibrary.
Următorul exemplu ilustrează această tehnică de încărcare DLL Cmplx:
13.4.3. modul de interfață
Acest modul de interfață simplifică semnificativ proiectarea programului principal: în exemplul nostru, acesta oferă aceeași interfață pentru cmpix bibliotecă ca modul cmpix la facilitățile sale descrise mai sus.
Când ne referim la rutine DLL scrise în alte limbaje de programare, este posibil ca numele subrutina extern conține caractere care nu pot fi păstrate în identificatorul corect Delphi. De exemplu, limbajul C ++ permite utilizarea „@“ caractere în identificatori. În acest caz (și, dacă doriți să-l redenumiți exportate dintr-un DLL de rutină) numele subrutină orice drept în ceea ce privește Delphi ID-ul și introduceți numele real al subrutina după numele cuvântul. De exemplu:
13.5. Revenind la FORMULARE BIBLIOTECA
Următorul exemplu ilustrează includerea echipamentelor sub formă de DLL și să-l utilizați în programul de apelare.
Textul formei într-un DLL
Textul programului de asteptare
Formele Modulul DLLForm, plasat într-un DLL, se referă la modulul de formulare standard, și, astfel, devine obiect de aplicare la nivel mondial, care nu este nimic „nu știe“ despre programul de asteptare obiect la nivel mondial (a se vedea. Cap. 21). Modul de apel modal, nu contează, adică. Pentru a. Fereastra modale blochează apelantului. Modul non-modal, apelul ar trebui să fie pentru a sincroniza acțiunea de obiecte, în caz contrar minimizarea ferestrei principale, de exemplu, nu va conduce la minimizarea ferestrelor DLL. Sincronizarea se realizează prin obiectul DLL Application mâner se înlocuiește cu descriptorul corespunzătoare a programului de asteptare.