120 likes | 227 Views
Dinaminės bibliotekos (DLL). DLL bibliotekos.
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