Hlavní
Hlavní strana
Seznam článků
Nejčtenější články
Progres e-mailem
Visual C++ FAQ

Seriály
COM
ISAPI

banner1.gif (2545 bytes)

Nenechte si ujít
Neobdélníková okna
Tisk bez Preview
MFC a DLL
Logo v MDI ploše
Kouzla s kombo-boxem
Výjimky v C++

banner1.gif (2545 bytes)

MFC a DLL, díl 1. Radek Pavienský
08.10.1999
[Hlavní stránka]  |  [Rubrika]  |  [Download]

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

rp_011099_dll1_obr01.gif (1450 bytes)

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.

rp_011099_dll1_obr02.gif (3372 bytes)

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:

rp_011099_dll1_obr03.gif (4444 bytes)

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:

rp_011099_dll1_obr04.gif (1627 bytes)

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):

rp_011099_dll1_obr05.gif (2473 bytes)

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:

rp_011099_dll1_obr06.gif (2926 bytes)

Ú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ářů.


Podobné články: Hook - monitorování zpráv II.,

 
Článek je zařazen do seriálu Následující>>
MFC a DLL, díl 2.

Kdo Otázka nebo připomínka

Prohlížení příspěvků nebo nový příspěvek

O firmě... Kontakt Ostatní