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φ