..::DLL - dynamickΘ p°ipojenφ::..

Narozdφl od statickΘho p°ipojenφ (popis najdete zde), p°i kterΘm je knihovna nahrßna p°i startu aplikace a uvoln∞na p°i jejφm ukonΦenφ, m∙₧ete p°i dynamickΘm p°ipojenφ urΦit kdy se knihovna nahraje do pam∞ti a kdy se uvolnφ. Nev²hodou je, ₧e nem∙₧ete pou₧φt t°φdy a volßnφ funkcφ z knihovny je obtφ₧n∞jÜφ.

Nejd°φve musφme knihovnu vytvo°it pokud ji nemßme z jinΘho zdroje. Ka₧dß funkce, kterou chceme exportovat (tj. pou₧φt mimo knihovnu), musφ b²t sprßvn∞ nadefinovanß. To znamenß, ₧e musφme °φci p°ekladaΦi, ₧e ji chceme pou₧φvat mimo knihovnu. A to ze dvou d∙vod∙. Pokud ji sprßvn∞ neoznaΦφme nep∙jde mimo knihovnu pou₧φt a i kdyby Üla, tak nebudeme znßt jejφ jmΘno (co₧ je nutnΘ pro jejφ pou₧itφ mimo knihovnu), proto₧e standartn∞ si p°ekladaΦ upravuje jmΘna funkcφ p°idßnφm dalÜφch znak∙ ke jmΘnu knihovny. 

Abychom mohli funkci pou₧φt mimo knihovnu, musφme do knihovny p°idat jejφ deklaraci, i kdy₧ to nenφ z jin²ch d∙vod∙ nutnΘ. Nap°φklad takto:

Chceme exportovat tuto funkci:

BOOL NejakaFunkce(BOOL par)

{

return par;

}

Abychom ji mohli pou₧φt mimo knihovnu p°idßme (nejlΘpe na zaΦßtek stejnΘho souboru) tuto deklaraci:

extern "C" __declspec(dllexport) BOOL NejakaFunkce(BOOL par);

To dostaΦuje, abychom tuto funkci mohli pou₧φt mimo knihovnu.

Te∩ ji pou₧ijeme z aplikace. (P°edpoklßdßm vytvo°enou dll knihovnu jmΘnem pokus.dll, kterß exportuje p°edchozφ funkci.)

Nejd°φve musφme knihovnu nahrßt.

HMODULE hMod = LoadLibrary("pokus.dll");

Pokud se nßm knihovnu poda°ilo ·sp∞Ün∞ nahrßt, obsahuje hMod handle instance nahranΘ knihovny, jinak mß hodnotu NULL. Funkce LoadLibrary sice vracφ HINSTANCE, ale tento typ prom∞nnΘ je s HMODULE zam∞niteln² a nßsledujφcφ funkce po₧aduje HMODULE.

Ne₧ budeme pokraΦovat musφme si nadefinovat ukazatel na po₧adovanou funkci. Tuto definici typu zapiÜte na zaΦßtek souboru mimo jakoukoli funkci.

typedef BOOL (* MOJEFUNKCE)(BOOL);

Tφm mßme nadefinovan² nov² typ MOJEFUNKCE, co₧ je ukazatel na funkci s parametrem typu BOOL, kterß vracφ BOOL.

Te∩ m∙₧eme zφskat ukazatel na funkci exportovanou z knihovny a to takto:

MOJEFUNKCE funkce = (MOJEFUNKCE)GetProcAddress(hMod,"NejakaFunkce");

Pokud byla funkce GetProcAddress ·sp∞Ünß vrßtila ukazatel na funkci NejakaFunkce exportovanou z knihovny, jinak vrßtila NULL.

Te∩ ji₧ m∙₧eme tuto funkci zavolat:

BOOL ret = funkce(FALSE);

Kdy₧ u₧ funkce z knihovny nepot°ebujeme, ale nejpozd∞ji p°ed koncem aplikace, m∞li bychom knihovnu uvolnit.

FreeLibrary(hMod);

Pozor!!!

Pokud knihovnu uvolnφte, jsou ukazatele na exportovanΘ funkce neplatnΘ. Tj. u₧ je nem∙₧ete pou₧φvat k volßnφ funkcφ.