V minul²ch dφlech jsme si ukßzali jak dynamickΘ tak statickΘ linkovßnφ dll knihoven. Ale co v p°φpad∞, ₧e chceme v jednΘ aplikaci pou₧φt dynamickΘ a v druhΘ statickΘ linkovßnφ tΘ samΘ dll knihovny? Musφme snad mφt dv∞ knihovny obsahujφcφ stejnΘ funkce, kterΘ se liÜφ jen v deklaraci? Nezoufejte. Vytvo°it dll knihovnu, kterou lze p°ipojit jak staticky tak dynamicky je velice snadnΘ. Samoz°ejm∞ platφ stejnΘ omezenφ jako u Φist∞ dynamicky linkovan²ch dll knihoven - nelze exportovat t°φdy.
Stejn∞ jako u statickΘho linkovßnφ pot°ebujeme mφt hlaviΦkov² soubor s deklaracemi funkcφ. Tento hlaviΦkov² soubor pou₧ijeme v p°φpad∞, ₧e budeme chtφt knihovnu p°ilinkovat staticky.
Cel² trik spoΦφvß v tom, ₧e uvnit° dll knihovny v cpp souboru nadefinujeme makro s unikßtnφm jmΘnem jeÜt∞ p°ed vlo₧enφm hlaviΦkovΘho souboru a potom v hlaviΦkovΘm souboru nadefinujeme jinΘ makro podle toho zda je nebo nenφ prvnφ makro definovßno. Toto druhΘ makro pak vlo₧φme na zaΦßtek deklarace naÜφ funkce a tφm vlastn∞ nechßme na p°ekladaΦi rozhodnutφ jakΘ specifikßtory p°idßme p°ed deklaraci funkce, tj. zda funkci exportujeme (v dll knihovn∞) nebo importujeme (v aplikaci).
Jestli jste toto vysv∞tlenφ nepochopili tak se nebojte (jß bych jej takΘ bez zdrojovΘho k≤du nepochopil), z nßsledujφcφho v²pisu zdrojovΘho k≤du to bude jasnΘ.
#ifdef FUNKCE_40561405092003
// makro FUNKCE_40561405092003 je definovßno -> vytvß°φme dll knihovnu
#define FUNKCE_IMPORT_EXPORT_40561405092003 extern "C" __declspec(dllexport)
#elif
// makro FUNKCE_40561405092003 nenφ definovßno -> pou₧φvßme dll knihovnu v aplikaci
#define FUNKCE_IMPORT_EXPORT_40561405092003 extern "C" __declspec(dllimport)
#endif
/*
Deklarace funkce.
Pou₧φvß makro FUNKCE_IMPORT_EXPORT, kterΘ je definovßno podle toho zda je pou₧ito ve
vytvß°enΘ dll knihovn∞ nebo v aplikaci, kterß knihovnu pou₧φvß.
*/
FUNKCE_IMPORT_EXPORT_40561405092003 BOOL NejakaFunkce(BOOL par);
#include "stdafx.h"
/*
Nadefinovßnφm tohoto makra p°ed vlo₧enφm hlaviΦkovΘho souboru °ekneme p°ekladaΦi,
₧e jsme v naÜφ vytvß°enΘ dll knihovn∞, tak₧e se pou₧ije prvnφ verze
makra FUNKCE_IMPORT_EXPORT, viz. hlaviΦkov² soubor.
*/
#define FUNKCE_40561405092003
#include "funkce.h"
BOOL NejakaFunkce(BOOL par)
{
return par;
}
Doufßm, ₧e te∩ u₧ je vßm to jasnΘ. Je to vlastn∞ rozÜφ°enφ k≤du z dynamickΘho linkovßnφ knihoven. Na stejnΘm principu pracuje makro AFX_EXT_CLASS, kterΘ znßte ze statickΘho p°ipojovßnφ dll knihoven. Bohu₧el nezachovßvß nßzvy funkcφ, tak₧e je nepou₧itelnΘ pro dynamickΘ linkovßnφ dll knihoven.
Ob∞ makra by m∞la b²t pro ka₧dou dll knihovnu jedineΦnß. Pokud jsou, tak m∙₧ete tyto funkce vklßdat staticky i do jin²ch dll knihoven jako by to byla aplikace. V p°φpad∞ dynamickΘho vklßdßnφ je to jedno.
A te∩ u₧ zßle₧φ jen na vßs zda pou₧ijete statickΘ nebo dynamickΘ linkovßnφ. Obojφ by jste m∞li um∞t z p°edchozφch dφl∙.