Dinaminės bibliotekos (DLL)
description
Transcript of Dinaminės bibliotekos (DLL)
Dinaminės bibliotekos (DLL)
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
Reikšmė Kam skirta
DLL_PROCESS_ATTACH Nauja programa susisiejo su biblioteka pirmą kartą
DLL_PROCESS_DETACH Programa atsisiejo nuo bibliotekos
DLL_THREAD_ATTACH Programos gija susisiejo su biblioteka
DLL_THREAD_DETACH Programos gija atsisiejo nuo bibliotekos
Funkcijos šablonas
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