..:: DLL - Kombinace dynamickΘho a statickΘho linkovßnφ ::..

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Θ.

funkce.h

#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);

funkce.cpp

#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∙.