120 likes | 232 Vues
Dynamic Link Libraries (DLLs) are important structural components in MS Windows, allowing code fragments to be compiled into a library used by many programs. Learn the differences between DLLs and static libraries, the role of _declspec, and key principles like dllexport and dllimport. Explore creating DLL modules, handling DllMain function, and static vs dynamic linking methods. Discover how dynamic linking works, including functions like LoadLibrary, GetProcAddress, and FreeLibrary.
E N D
DLL bibliotekos • Dinaminės bibliotekos yra svarbi strūktūrinė MS Windows komponentė. Ji leidžia sukompiliuoti kodo fragmentus į vieną biblioteką, panaudojamą daugelio programų. Skirtumas tarp DLL ir statinės bibliotekos yra toks, kad DLL’as nėra vykdomasis failas. Jis lieka atskiru moduliu. Tai leidžia vykdomuosius failus išlaikyti palyginti mažo dydžio. • DLL modulio kūrimas priklauso nuo kompiliatoriaus, tačiau pats programavimas yra universalus
_declspec • Tai raktažodis, kuris nėra ANSI C standarto dalis, bet dauguma kompiliatorių jį supranta. _declspec leidžia nurodyti įvairias nestandartines parinktis, kurios apsprendžia programos veikimo būdą. Aptarsime dvi pagrindines nuostatas: • _declspec(dllexport) • _declspec(dllimport)
dllexport • Šis raktažodis nurodo funkcijas, kurios bus prieinamos kitoms programoms. Priešingu atveju funkcijos bus naudojamos tik bibliotekos viduje. Šis identifikatorius turi būti nurodytas tiek funkcijos prototipe, tiek jos apraše.
dllimport • Norėdami pasinaudoti tokia funkcija ją turime importuoti į savo programą. Tam reikia susieti programą su biblioteka ir programoje apibrėžti funkcijos prototipą naudojanti raktažodžiu dllimport:
Programavimo gudrybės Būtų paprasčiau, jei užtektų tik vieno raktažodžio ar ne?
DllMain • Kai Windows’ai susieja DLL’ą su programa, būna kviečiama bibliotekos DllMain funkciją: • APIENTRY – raktažodis naudojamas Windows’ų viduje, todėl apie jį galime pamiršti • hInstance – galime naudoti, galime ir ne. Šis kintamasis skirtas bibliotekai.
reason gali įgyti vieną iš keturių reikšmių: DllMain funkcija turi grąžinti TRUE, jei biblioteka įkelta sėkmingai, ir FALSE, jei įvyko klaida
Susiejant DLL • Statinis susiejimas – kompiliatorius sugeneruos du failus: DLL ir LIB. LIB failas veikia kaip maža statinė biblioteka nurodo saistyklei (linker) statiškai susisieti su nurodytu DLL failu. • Dinaminis susiejimas – tikroji bibliotekų galia yra programos gebėjimas darbo metu ją įsikelti. Tai esminis mechanizmas programų kurios leidžia papildinius(plugin) ir plėtinius (extension).
Kaip veikia dinaminė sąsaja? • Iškviečiame biblioteką funkcijos LoadLibrary pagalba ir ir perduodame identifikatorių vienai iš galimų funkcijų. Jei biblioteka nėra šakniniame kataloge, reikia nurodyti kur ją rasti funkcijos SetDllDirectory pagalba. • HMODULE yra bibliotekos identifikatorius (HANDLE)
Ką galime daryti? • GetProcAddress– grąžina funkcijos rodyklę į funkciją bibliotekoje • LoadResource– nuskaito DLL’o išteklius • FreeLibrary– pašalina biblioteką pagal nurodytą identifikatorių iš atminties