Poměrně častým problém je vytváření vlastních DLL knihoven
ve Visual C++. A přitom je to tak snadné... (jak moc snadné, to se dozvíte ve
čtyřech pokračováních miniseriálu o DLL knihovnách). Zkusme si vytvořit příklad,
který bude tvořen jednou aplikací a dvěma DLL knihovnami, přičemž obě dvě
knihovny budou obsahovat třídy na sobě závislé.

Nejprve se pustíme do generování. Musíme vytvořit jednu EXE
aplikaci a dvě DLL knihovny. S aplikací nebude problém, hned v prvním kroku
generování (MFC AppWizzard(exe)) vybereme Finish a je to, MDI aplikace
používající dokument/view nám bude vyhovovat. Pro generování DLL použijeme MFC
AppWizzard(dll), kde zaškrtneme, že chceme zařadit nový projekt do přechozího
pracovního prostředí a upravíme cestu k projektu tak, aby dll knihovny nebyly uloženy
v podadresáři s aplikací, ale aby byly na stejné adresářové úrovni.

S DLL ale bude další problém - v prvním kroku musíme vybrat ze
tří voleb, jak je vidět na následujícím obrázku:

Poslední možnost se od předchozích liší tím, že se automaticky
vytváří seznam Runtime-classes a zdrojů z DLL, čímž je dána možnost přistupovat
k těmto informacím i z aplikace. Ačkoliv tento výběr není implicitní, ve většině
případů bychom měli používat právě tento typ DLL knihoven.
Po úspěšném vygenerování tří projektů a přidání dvou
adresářů, bychom měli získat následující adresářovou strukturu:

Adresáře Debug a Release na hlavní úrovni (v obrázku jsou
podtržené) přidáme ručně a právě v nich nelezneme výsledné DLL soubory a EXE
aplikaci. Toto samozřejmě nebude samo sebou a budeme muset nastavit projekty tak,
abychom toto zajistili.
Před tím, než si vysvětlíme další nastavení, zkusíme si
objasnit, proč vlastně adresáře vytvářet, a proč do nich kopírovat výsledné
soubory. Představme si, že již máme všechny tři projekty přeložené a
pokusíme se spustit aplikaci. Zjistíme, že to nejde, protože aplikace APP.EXE
nenalezne potřebné DLL knihovny. Kde je problém? Windows totiž hledají DLL knihovny
podle standardní cesty, tedy zaručeně v sytémovém adresáři a v dalších
adresářích, jak je určeno sytémovou proměnnou PATH. Pomohlo by nastavit cestu do
adresářů \Dll\First\Debug a \Dll\Second\Debug (resp. Release) nebo vzniklé DLL
knihovny kopírovat do systémového adresáře. Ani jedna z obou možností mi
nepřipadá výhodná, zkusíme to tedy jinak. Operační systém totiž požadované DLL
knihovny hledá nejprvbe v akutálním adresáři. No a v tom to je! Obě DLL i EXE
aplikaci nakopírujeme do zvláštního adresáře (Debug nebo Release) a odtamtud ji
budeme spouštět, čímž je zajištěno, že vše proběhne v pořádku. Další
výhodou bude, že pokud budeme chtít přenést výsledek jinam, stačí vzít adresář
Debug nebo Release a je to.
Asi by bylo dost otravné po každém překladu provádět
kopírování souborů, ale to naštěstí nebude nutné, protože to za nás udělá
samotné prostředí Visual C++. Pro tuto akci nám pomůže volba PostBuild Step
z nastavení projektu, kde máme možnost vykonat jakékoliv akce, které umožňuje OS,
přičemž tyto se provedou po úspěšném překladu. Není tedy problém, zadat
příkazy kopírování. Pomocí volby z menu Project/Settings nastavíme
v poslední záložce volby Postbuild Commnads tak, aby docházelo ke
kopírování výsledných souborů. Nesmíme zapomenout, že akci musíme nastavit u
všech třech projektů, a taktéž pro obě dvě nastavení - Debug a Release.
(Samozřejmě, že v případě nastavení Debug cílovým adresářem bude Debug
a v případě Release bude cílovým adresářem Release). Příklad naleznete
na následujícím obrázku (týká se nastavení EXE aplikace):

Pokud bychom nyní přeložili všechny tři projekty, adresář Debug
by měl obsahovat tři soubory: First.dll, Second.dll a App.exe. Aby bylo nastavení
projektů kompletní, musíme udělat ještě dva kroky.
Předposledním nastavením bude vytvoření závislostí mezi
projekty. Ze zadání víme, že Second.DLL je závislý na First.DLL a App.EXE je
závislý na Second.DLL. Bohužel to víme jenom my a Visual C++ o tom nemá potuchy.
Jednoduše mu to sdělíme pomocí volby Project/Dependencies..., kdy se objeví
následující dialog, kde popíšeme závislosti App->Second a Second->First:

Úplně posledním krokem bude určení, který soubor se bude
používat pro ladění. V současném okamžiku máme vlastně dvě aplikace App.EXE, kdy
jedna je uložena v adresáři \Dll\Debug (kam jsme ji kopírovali) a \Dll\App\Debug (kde
vznikla během překladu). Potřebujeme, aby se použila první jmenovaná možnost,
protože jinak bychom měli náš známý problém s nenalezením DLL knihoven. V menu
nastavení projektu u EXE aplikaci zvolíme v druhé záložce cestu ke spouštěném
adresáři tak, aby ukazovala na kopírovanou verzi aplikace.
Toť pro dnešek vše, projekt naleznete v sekci Download.
Abychom mohli vše ozkoušet, nastavíme projekt App jako aktivní projekt a dáme Rebuild
All, který zajistí, že se přeloží všechny tři projekty a výsledky se
nakopírují do patřičných adresářů. |