DLL-k fejlesztése
A könyvtár egy fordított kód, amely a végrehajtható alkalmazás funkcióit biztosítja és adatokat szolgáltat. A könyvtárak kapcsolhatók statikusan és dinamikusan, általában a kiterjesztés LIB és DLL. A statikus könyvtárak (például a C futásidejű könyvtár) társításra kerülnek az alkalmazással a fordítási idő alatt, és a kapott végrehajtható fájl részévé válnak. Az alkalmazás betölti a DLL-et, ha szükséges (általában indításkor). Egyetlen DLL betölthet egy másik DLL-t, és dinamikusan hivatkozhat rá.
Az alábbiakban bemutatjuk a DLL-k fő előnyeit.
Minden alkalmazás egy példányt használhat a lemezen.
A végrehajtható alkalmazásfájlok kisebbek.
Nagy projektek felosztására való képesség. Az alkalmazások és a DLL-k fejlesztői csak koordinálhatják a megfelelő részek felületét. Ezt az interfészt exportálja a DLL-be.
DLL, a fejlesztők frissíti a DLL, hogy javítsák a teljesítményt, vagy kijavítani a hibát a nem frissíti az összes alkalmazást, hogy használja őket, ha exportálni egy DLL felület nem változik.
A DLL használatával funkciókat és parancsokat adhat hozzá a Microsoft Excel programhoz.
Itt van, amire szükséged van egy DLL létrehozásához:
A fordító forráskód objektumra való konvertálásához, kompatibilis a hardverrel.
A linker a statikus könyvtárak kódjának hozzáadásához és egy végrehajtható DLL fájl létrehozásához.
DLL-t több nyelven is létrehozhat, például C / C ++, Pascal és Visual Basic. Mivel az Excel API forráskódja C és C ++, csak a két nyelv szerepel ebben a dokumentációban.
DLL-projekt készítése során a fordítónak és a linkernek tudnia kell, hogy melyik funkciókat kell exportálni ahhoz, hogy hozzáférést biztosítson hozzájuk az alkalmazásban. Ez a rész a lehetséges módszereket ismerteti.
A forráskód összeállításakor a fordítók általában a funkcióneveket változtatják meg. Ehhez általában hozzá kell adni a karaktereket a név elejére vagy végére. Ezt a folyamatot úgy nevezik, hogy díszítik a nevet. Meg kell győződnie arról, hogy az alkalmazás, amely betölti a DLL-t, képes felismerni az exportált függvény nevét. Ehhez előfordulhat, hogy meg kell adnia a kapcsolót, ha a kiterjesztett nevet egy egyszerűbb exportnévre szeretné leképezni. Lehet, hogy a forráskód neve vagy valami más.
A név díszítésének módja a fordító által meghatározott funkciótól, vagyis a híváskonferenciától függő nyelv és módszer függvénye. A DLL-ekben használt Windows szabványos folyamatközi híváskonvenció a WinAPI. A Windows fejlécfájlokban a Win32 __stdcall deklarátor használatával WINAPI-nak van jelölve.
Az Excel-hez tartozó DLL-fájlba exportált függvény (egy lapfüggvény, egy makrólapnak vagy egyéni parancsnak megfelelő funkció) mindig a WINAPI / __stdcall híváskonvenciót kell használni. A funkció definíciójában kifejezetten fel kell tüntetni a WINAPI mutatót. mert alapértelmezés szerint a Win32 fordítók az __cdecl híváskonvenciót használják. más néven WINAPIV.
Megmondhatja a linkernek a funkció exportálásának szükségességét, valamint a külső nevét többféle módon:
Helyezze a függvényt a DEF fájlba a KIVÁLASZTÁS kulcsszava után, és adja hozzá a hivatkozást erre a fájlra a DLL projektparaméterre a kötés során.
Használja a __declspec deklarátort (dllexport) a függvénydefinícióban.
Használja az #pragma előprocesszoros irányelvet, hogy elküldje az üzenetet a linkernek.
A projekt mindhárom módszert alkalmazhatja, mind a fordító, mind a linker támogatja őket, de egy funkciót nem szabad egynél több módon exportálni. Tegyük fel például, hogy a DLL tartalmaz két modul a forráskódot, a C és C ++, amelyek két funkciót export - my_C_export és my_Cpp_export volt. Az egyszerűség kedvéért tegyük fel, hogy a függvények egy dupla pontosságú numerikus argumentumot tartalmaznak, és visszaadják az azonos típusú adatokat. Az alábbi szakaszok leírják az egyes módszerek exportálási lehetőségeit.
A DEF fájl használata
Felhívjuk a figyelmet arra, hogy a C függvényt díszítik, de a DEF fájlban a hivatkozó kifejezetten utasítja ezt a funkciót a forráskód nevét használva (ebben a példában). A linker implicit módon exportálja a C ++ függvényt a forráskód nevével, ezért a kiterjesztett nevet nem szükséges a DEF fájlba beírni.
A 32 bites Windows API-funkciókra irányuló hívások konvenciója a következő C-funkciók dekorációját biztosítja: a function_name _ függvénynév @ n lesz. ahol n az összes argumentum által elfogadott bájtok száma decimális számként kifejezve, a bájtok számával, mindegyikükre a négy legközelebbi többszörösre kerekítve.
A Win32 mutatóinak mérete négy bájt. A visszatérési típus nem befolyásolja a név díszítését.