Dezvoltarea DLL-urilor

O bibliotecă este un cod compilat care furnizează funcțiile aplicației executabile și le furnizează date. Bibliotecile pot fi legate în mod static și dinamic, de obicei au extensia LIB și respectiv DLL. biblioteci statice (de exemplu, o bibliotecă de runtime C) asociate aplicării la compilare și să devină parte a fișierului executabil rezultat. Aplicația încarcă DLL când este necesară (de obicei la pornire). Un singur DLL poate încărca un alt DLL și o poate face dinamic.







Mai jos sunt principalele avantaje ale DLL-urilor.

Toate aplicațiile pot utiliza o copie pe disc.

Fișierele de aplicații executabile sunt mai mici.

Abilitatea de a împărți proiecte mari. Dezvoltatorii de aplicații și DLL-uri ar trebui să coordoneze doar interfața părților corespunzătoare. Această interfață este exportată în DLL.

Dezvoltatorii DLL pot actualiza DLL-uri pentru a-și spori eficiența sau pentru a repara o eroare fără a actualiza toate aplicațiile care le utilizează în cazul în care interfața exportată DLL nu este modificată.

Folosind DLL, puteți adăuga funcții și comenzi la Microsoft Excel.

Iată ce aveți nevoie pentru a crea un DLL:

Un compilator pentru conversia codului sursă în obiect, compatibil cu hardware-ul.

Linkerul pentru adăugarea de coduri din bibliotecile statice și crearea unui fișier DLL executabil.

Puteți crea DLL-uri în mai multe limbi, de exemplu C / C ++, Pascal și Visual Basic. Deoarece codul sursă pentru API-ul Excel este C și C ++, numai aceste două limbi sunt acoperite în această documentație.

La compilarea unui proiect DLL, compilatorul și link-ul trebuie să știe ce funcții de export trebuie să le furnizeze în aplicație. Această secțiune descrie căile posibile.

La compilarea codului sursă, compilatoarele schimbă de obicei numele funcțiilor. Pentru a face acest lucru, ele adaugă de obicei caractere la începutul sau sfârșitul numelui. Acest proces se numește decorarea unui nume. Trebuie să vă asigurați că aplicația care încarcă DLL-ul poate recunoaște numele funcției exportate. Pentru a face acest lucru, poate fi necesar să instruiți linkerul să mapheze numele extins la un nume de export mai simplu. Poate fi un nume din codul sursă sau altceva.







Modul de a decora un nume depinde de limba și metoda de a apela funcția specificată de compilator, adică convenția de apel. Convenția convențională de apel inter-proces pentru Windows, folosită în DLL-uri, este WinAPI. În fișierele antet Windows, este desemnat ca WINAPI utilizând declarația __stdcall Win32.

Funcția în fișierul exportat-DLL în Excel (funcția foaie de lucru, funcția echivalentă cu foaia de macro, sau o anumită comandă) trebuie să utilizeze întotdeauna convenția de asteptare WinAPI / __stdcall. În definiția funcției, trebuie să activați în mod explicit WinAPI indicatorul. ca implicit în compilatorul Win32 folosește convenția __cdecl de asteptare. De asemenea, menționată ca WINAPIV.

Puteți spune linkerului despre necesitatea de a exporta funcția, precum și numele său extern în mai multe moduri:

Plasați funcția în fișierul DEF după cuvântul cheie EXPORTS și adăugați referința la acest fișier la parametrul proiectului DLL în timpul legării.

Utilizați declaratorul __declspec (dllexport) în definiția funcției.

Utilizați directiva preprocesor #pragma pentru a trimite mesajul către linker.

În cadrul proiectului, puteți folosi toate cele trei metode, iar acestea sunt susținute de compilator și linker-ul, dar nu ar trebui să exporte o funcție mai mult de un fel. De exemplu, să presupunem că DLL conține două module ale codului sursă, C și C ++, care conțin două funcții pentru export - my_C_export și respectiv my_Cpp_export. Pentru simplificare, presupunem că funcția ia un argument numeric și returnează un dublu de date cu precizie de același tip. Următoarele secțiuni descriu opțiunile pentru funcțiile de export care utilizează fiecare dintre aceste metode.

Folosind fișierul DEF

Rețineți că funcția C este decorată, dar în fișierul DEF, linker-ul este explicit instruit să furnizeze această funcție folosind numele din codul sursă (în acest exemplu). Linkerul exporta implicit funcția C ++ utilizând numele codului sursă, deci nu este necesar să includeți numele extins în fișierul DEF.

Acord pentru funcția apelurile API la 32 de biți pentru Windows oferă următoarele funcții decorează C: function_name devine _ @ n FUNCTION_NAME. unde n - numărul de octeți, exprimat ca număr zecimal, toate argumentele primite, numărul de octeți pentru fiecare rotunjite la cel mai apropiat multiplu de patru.

Dimensiunea tuturor indicatorilor din Win32 este de patru octeți. Tipul de returnare nu afectează decorarea numelui.







Articole similare

Trimiteți-le prietenilor: