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);
Pokud knihovnu uvolnφte, jsou ukazatele na exportovanΘ funkce neplatnΘ. Tj. u₧ je nem∙₧ete pou₧φvat k volßnφ funkcφ.