Kurz Visual C++ (5.)


Po delÜφ dob∞ je tu novß lekce o v²vojovΘm prost°edφ VC++. Lekce je rozd∞lena na dv∞ Φßsti, p°iΦem₧ prvnφ Φßst bude o editoru VC++. Dozvφte se nap°φklad, jak lze formßtovat text a co vÜechno se dß nastavit pro IDE. V druhΘ Φßsti se zam∞°φme na dynamickΘ knihovny a na sprßvu v∞tÜφch projekt∙. Dovφte se, jak vklßdat dalÜφ projekty do stßvajφcφho projektu a zajistit, aby se kompilovaly ty sprßvnΘ projekty.

5.1 Editor Visual C++

Zßlo₧ky

Zßlo₧ky jsou velmi ·Φinn²m prost°edkem pro navigaci v souboru. Pou₧φvajφ se pro rychl² p°φstup k nejpou₧φvan∞jÜφm °ßdkßm zdrojovΘho k≤du (klßvesovou zkratkou). Existujφ dva typy zßlo₧ek: pojmenovanΘ a nepojmenovanΘ. Hlavnφ rozdφl mezi nimi je, ₧e pojmenovanΘ zßlo₧ky se zachovßvajφ i po uzav°enφ projektu a jeho op∞tovnΘm otev°enφ, ale nepojmenovanΘ ne. V²hodou nepojmenovan²ch zßlo₧ek ale je, ₧e je lze nastavit rychle nastavit (klßvesovou zkratkou Ctrl+F2) a jsou okam₧it∞ vid∞t v ÜedΘm levΘm okrajφ otev°enΘho souboru. Nepojmenovanß zßlo₧ka se nastavuje na °ßdek, na kterΘm je kurzor, a na prvnφ sloupec (bez ohledu na to, ve kterΘm sloupci je kurzor). VÜechny nepojmenovanΘ zßlo₧ky je mo₧nΘ vymazat klßvesovou zkratkou Ctrl+Shift+F2.

Oproti tomu pro nastavenφ pojmenovan²ch zßlo₧ek pou₧ijte klßvesovou zkratku Alt+F2 nebo z menu vyberte Edit - Bookmarks. Do pole Name napiÜte nßzev a klikn∞te na tlaΦφtko Add. Zßlo₧ka se nastavuje na aktußlnφ °ßdek i sloupec, ale nenφ nijak vid∞t (pouze v dialogu Bookmarks).

Pro p°echod na zßlo₧ku pou₧ijte klßvesovΘ zkratky F2 pro p°echod na dalÜφ zßlo₧ku nebo Shift+F2 pro pohyb na p°edchozφ. Tyto klßvesovΘ zkratky fungujφ pro pojmenovanΘ i nepojmenovanΘ zßlo₧ky.

Pohyb mezi zßvorkami

Ve zdrojovΘm k≤du jsou velmi ΦastΘ konstrukce uzav°enΘ mezi zßvorkami. M∙₧e se jednat o bloky k≤du uzav°enΘ ve slo₧en²ch zßvorkßch, nebo o struktury s kulat²mi zßvorkam ve v²razech, ve kter²ch je n∞kdy velmi Üpatnß orientace, kdy nem∙₧eme najφt zavφracφ zßvorku k otevφracφ. Visual C++ toto °eÜφ velice jednoduch²m zp∙sobem: pokud je kurzor p°ed n∞jakou zßvorkou (a¥ u₧ otevφracφ nebo zavφracφ) je mo₧nΘ najφt jejφ pßr klßvesovou zkratkou Ctrl+E nebo Ctrl+]. Obdobn∞ je mo₧nΘ oznaΦit cel² text mezi odpovφdajφcφmi si zßvorkami klßvesovou zkratkou Ctrl+Shift+E nebo Ctrl+Shift+].

Podmφnky preprocesoru

Pou₧φvßte-li podmφn∞n² p°eklad pomocφ podmφnkov²ch direktiv preprocesoru, m∙₧ete pro rychl² p°esun mezi direktivami pou₧φvat klßvesovΘ zkratky Ctrl+K pro p°esun dop°edu (na dalÜφ direktivu #elif, #else, #endif) nebo Ctrl+J pro p°esun dozadu. Obdobn∞ jako u pohybu mezi zßvorkami m∙₧ete pro oznaΦenφ mφsto pouhΘho nalezenφ p°idat klßvesu Shift.

DalÜφ mo₧nosti hledßnφ

F4/Shift+F4 Hledßnφ v chybßch p°i p°ekladu (p°esun na dalÜφ/p°edchozφ chybu)
F12 Nalezenφ deklarace/definice identifikßtoru (prom∞nnΘ, funkce) na mφst∞ kurzoru
Shift+F12 Nalezenφ reference (pou₧itφ) identifikßtoru (prom∞nnΘ, funkce)
Ctrl+Num- Nalezenφ p°edchozφ reference identifikßtoru (prom∞nnΘ, funkce)
Ctrl+Num+ Nalezenφ dalÜφ reference identifikßtoru (prom∞nnΘ, funkce)

Tyto klßvesovΘ zkratky (a₧ na F4 a Shift+F4) se opφrajφ o informace pro prohledßvßnφ (browse info), kterΘ se negenerujφ automaticky. Pro povolenφ jejich generovßnφ je pot°eba v nastaveni projektu (Project Settings – Alt+F7) povolit "Generate browse info" na kart∞ C++ v kategoriφ General. Visual C++ Vßm takΘ nabφdne vytvo°enφ informacφ pro prohledßvßnφ p°i prvnφm pou₧itφ n∞jakΘho hledßnφ, kterΘ je vy₧aduje.

Informace pro prohledßvßnφ jsou mnohem v²konn∞jÜφ, pomocφ nich je mo₧nΘ nechat si zobrazit strukturu zdrojovΘho k≤du. Tato mo₧nost je dostupnß p°es klßvesovou zkratkou Alt+F12.

Dialog Go To

Nechcete-li pou₧φvat klßvesovΘ zkratky, m∙₧ete vyvolat dialog Go To klßvesovou zkratkou Ctrl+G. Tento dialog umφ hledat n∞kterΘ v²Üe uvedenΘ polo₧ky (chyby, zßlo₧ky, reference, deklarace) a takΘ p°echod na °ßdku textu zadßnφm jejφho Φφsla.

DalÜφ zajφmavΘ klßvesovΘ zkratky

Sestavenφ a p°eklad

Ctrl+F5 SpuÜt∞nφ programu
F5 SpouÜt∞nφ programu v ladicφm m≤du (platφ "breakpoints")
Shift+F5 Zastavenφ programu b∞₧φcφho v ladicφm m≤du
F7 Sestavenφ aktivnφho projektu (bez spuÜt∞nφ)
Ctrl+F7 P°eklad zdrojovΘho souboru v aktivnφm okn∞

Editor

Alt+F8 Formßtuje oznaΦen² text standardnφm zp∙sobem (kter² Visual C++ nabφzφ p°i psanφ) – za tip d∞kuji Vladimφru Vojtovi
Ctrl+U/Ctrl+Shift+U P°evede oznaΦen² text na malß/velkß pφsmena
Ctrl+Shift+8 Zobrazuje mezery a tabulßtory
Ctrl+I Inkrementßlnφ hledßnφ (po stisknutφ se text, kter² zadßte, neprojevφ v textu, ale pou₧ije se pro hledßnφ). Hledßnφ ukonΦφte klßvesou Esc (zruÜenφ oznaΦenφ dosud nalezenΘho textu) nebo Enter
Tab/Shift+Tab Posune oznaΦen² text (alespo≥ jeden cel² °ßdek) o jeden tabulßtor doprava/doleva

 

5.2. Dynamicky linkovanΘ knihovny - DLL

Tato Φßst o DLL nenφ pro ty, kte°φ se cht∞jφ dozv∞d∞t, jak pracujφ DLL, ale pro ty, kte°φ cht∞jφ v∞d∞t, jak DLL vytvo°it a jak ji zakomponovat do stßvajφcφho projektu, p°φpadn∞ jak pracovat s jejφmi exportovan²mi funkcemi Φi t°φdami. To znamenß, ₧e zde nebudu vysv∞tlovat jak²m zp∙sobem se DLL p°ipojuje k hlavnφmu programu a ani zde nebudu vysv∞tlovat vnit°nφ strukturu DLL.

5.2.1 Typy projekt∙ DLL

Ve Visual C++ mßme hned n∞kolik typ∙ dynamick²ch knihoven, kterΘ m∙₧eme vytvo°it. V²slednΘ knihovny jsou velice podobnΘ, ale odliÜn² je zp∙sob jejich programovßnφ a odliÜnΘ jsou takΘ schopnosti knihovny.

Za prvΘ m∙₧ete vytvo°it Win32 DLL, to je tak ·pln∞ nejzßkladn∞jÜφ knihovna, kterß ovÜem neumφ pracovat s MFC. Dßle m∙₧ete vytvo°it knihovnu s podporou MFC, ale ty se dßle d∞lφ na dva druhy. MFC knihovna m∙₧e b²t bu∩ b∞₧nß (regular) nebo rozÜi°ujφcφ (extension). B∞₧nß knihovna navφc m∙₧e linkovat MFC knihovny bu∩ staticky nebo dynamicky, to je stejnΘ jako u projektu EXE (o statickΘm a dynamickΘm linkovßnφ MFC knihoven byla °eΦ v minulosti). Jinak knihovna Win32 a b∞₧nß DLL MFC se od sebe liÜφ jen mßlo, samoz°ejm∞ podstatn² rozdφl je v pou₧φvßnφ MFC, ale jinak jsou identickΘ. Rozdφlnß je ovÜem rozÜφ°enß knihovna DLL.

5.2.2. B∞₧nß versus rozÜφ°enß DLL

RozÜφ°enß knihovna narozdφl od b∞₧nΘ m∙₧e exportovat t°φdy, ΦlenskΘ funkce, p°etφ₧enΘ funkce apod., zkrßtka podporuje objektovΘ C++. Tohle vÜechno b∞₧nß knihovna neumo₧≥uje a m∙₧ete tak exportovat pouze C funkce. Pokud ale budete chtφt knihovnu pou₧itelnou i z jinΘho programovacφho prost°edφ, m∞li byste pou₧φt b∞₧nou knihovnu.

DalÜφ je rozdφl ve vyhledßvßnφ zdroj∙ (resources - dialogy, bitmapy, kursory apod.). Pokud mßte ulo₧en² n∞jak² zdroj v rozÜφ°enΘ knihovn∞ a tento zdroj mß v programu unikßtnφ ID, pak ho program najde. Program se toti₧ nejd°φve podφvß, zda-li nemß hledan² zdroj u sebe, pokud ne, hledß v rozÜφ°en²ch knihovnßch p°ipojen²ch k tomuto programu, nakonec hledß zdroje v knihovnßch MFC. Pokud se ID opakujφ ve vaÜem programu a  v knihovn∞, pak se pou₧ije zdroj z programu a ne z knihovny! B∞₧nΘ knihovny se neprohledßvajφ.

5.2.3. P°φklad

V²sledkem tΘto lekce bude projekt, kter² obsahuje program EXE a jednu rozÜi°ujφcφ knihovnu. Zkusφme si vytvo°it jednoduchou t°φdu a tu exportovat. Navφc si ukß₧eme, jak ve VC++ nastavit projekt tak, aby se rozÜi°ujφcφ knihovna linkovala k naÜemu program EXE.

Nynφ si vytvo°φme tzv. Blank Workspace, co₧ je ·pln∞ prßzdn² projekt, kter² neobsahuje ₧ßdn² pod projekt. Je to snadnΘ! V menu File vyberte New. Na nßsledujφcφm dialogu zvolte Workspaces a zde Blank Workspace. VepiÜte jmΘno do p°φsluÜnΘho okΘnka a stiskn∞te OK. VÜimn∞te si, ₧e v  Classview nevidφte zatφm nic.

Nynφ vlo₧te do programu MFC projekt. Op∞t dejte New z menu File, ale nynφ zvolte kartu Projects. Tam nastavte t°eba MFC EXE. Te∩ ale musφte na kart∞ takΘ nastavit, ₧e tento projekt chcete p°idat do stßvajφcφho Workspace. Tuto mo₧nost vidφte vpravo na dialogu: Add to current workspace. Zatrhn∞te tuto volbu, op∞t vepiÜte jmΘno a OK. Samoz°ejm∞ se spustφ AppWizard, ale nßs te∩ nebude p°φliÜ zajφmat, jak² typ aplikace vytvo°φme. Vytvo°te t°eba dialogovou aplikaci. Nynφ vidφte, ₧e do Classview se nßm p°idal projekt, jakoby bychom ho vytvo°ili p°φmo. Jedin² rozdφl je ten, ₧e tento projekt je v podadresß°i Workspace.

Dßle p°idejme knihovnu DLL. Op∞t v menu File vyberte polo₧ku New a na kart∞ Projects vyberte projekt MFC DLL. Op∞t musφte zatrhnout polo₧ku Add to current workspace. VepiÜte jmΘno a OK. Objevφ se dialog AppWizardu:

Zvolte MFC Extension DLL a Finish! Nynφ vidφte v  ClassView zßsadnφ rozdφl. Projekt se p°idal k naÜemu programu, tak₧e mßte dva projekty v jednom workspace. Ve workspace m∙₧e b²t jen jeden projekt aktivnφ (to je ten, kter² se kompiluje a spustφ po stisku F5). K tomuto aktivnφm projektu se kompilujφ ty projekty, kterΘ jsou pot°eba pro sprßvn² b∞h aktivnφho projektu. Jak nastavφme, kter² projekt zßvisl² na kterΘm? Velice snadno. VC++ mß toto nastavenφ p°φmo v sob∞. Ve menu Project zvolte polo₧ku Dependencies (zßvislosti):

V prvnφm okΘnku zvolte projekt, kter² chcete modifikovat (tj. projekt, kterß mß b²t na n∞kom zßvisl²). V druhΘm okΘnku pak vidφte, na kom aktußlnφ projekt m∙₧e b²t zßvisl². My zde mßme pouze Knihovnu, tak₧e tu zaÜkrtn∞te a dejte OK. Kdybyste nynφ oznaΦili jako aktußlnφ Knihovnu, zjistili byste, ₧e ji₧ nem∙₧e b²t zßvislß na Programu. To je logickΘ. Kdy₧ je Program zßvisl² na Knihovn∞, nem∙₧e b²t zßrove≥ Knihovna zßvislß na Programu. Lze tedy nastavit jen jednosm∞rnou zßvislost. Toto nastavenφ zßvislosti za prvΘ zp∙sobφ, ₧e se bude kompilovat projekt Knihovny kdykoliv, kdy budete kompilovat Program, Φili program se nespustφ, ani₧ by se nejd°φve nevytvo°ila Knihovna. ZadruhΘ zp∙sobφ to, ₧e knihovna je automaticky p°ilinkovßna k Programu tzn., ₧e budete moci pou₧φvat exporty Knihovny v Programu.

Dßle musφme nastavit, aby se Knihovna (soubor .DLL) i Program (soubor .EXE) vytvo°ili ve stejnΘm adresß°i, v n∞jakΘm Debug Φi Release adresß°i celΘho Workspace. V menu Project zvolte polo₧ku Settings.... Na kart∞ Link musφme do okΘnka Output file name p°id∞lat dv∞ teΦky a lomφtko, aby se adresß° Debug vytvo°ili o ·rove≥ v²Ü tj. v adresß°i Multiprojekt. Toto nastavenφ prove∩te pro oba projekty v Release i v Debug m≤du:



Nynφ nastavφme aktivnφ projekt Program. Klikn∞te v ClassViev prav²m tlaΦφtkem na projekt, kter² chcete aby byl aktivnφ. V kontextovΘm menu zvolte volbu Set as Active project. Vidφte, ₧e aktivnφ projekt se v ClassView objevφ jako tuΦn². Nynφ si zkuste cviΦn∞ zkompilovat projekt Program a uvidφte, ₧e se nejd°φve zkompiluje Knihovna a pak Program. Ve skuteΦnosti se Knihovna v∙bec nezavßdφ, proto₧e jeÜt∞ nevolßme ₧ßdnou jejφ exportovanou funkci Φi nepou₧φvßme ₧ßdnou jejφ exportovanou t°φdu. To se ale brzo zm∞nφ.

P°idßme novou t°φdu do projektu Knihovna. Abych nemuseli p°epφnat aktivnφ projekt na Knihovnu, vyu₧ijeme op∞t kontextovΘho menu v ClassView. Nynφ ale zvolte New Class. Objevφ se ji₧ znßm² dialog. Zde zvolte Generic Class a vepiÜte n∞jakΘ zajφmavΘ jmΘno, t°eba CPepa. Nynφ pou₧ijeme makro AFX_EXT_CLASS, kterΘ zajistφ export z DLL a import do EXE. Toto makro vlo₧te za klφΦovΘ slovo class v deklaraci t°φdy CPepa. Nynφ je t°φda CPepa exportovßna a m∙₧eme ji vyu₧φt v Programu. JeÜt∞ Pepovi doplnφme n∞jakß jednoduchß data, abychom vid∞li, ₧e to skuteΦn∞ funguje. V p°φkladu jsem mu doplnil jen v∞k, ale vy samoz°ejm∞ m∙₧ete vytvo°it co prßv∞ pot°ebujete.

Poznßmka: Makro AFX_EXT_CLASS m∙₧ete vyu₧φt i p°i exportu funkcφ. Zkrßtka vlo₧te makro vlo₧te bu∩ p°ed funkci nebo mezi nßvratovou hodnotu a jmΘno funkce, tφm se stßvß funkce viditelnß pro okolnφ projekty. Dejte si ale pozor, abyste vlo₧ili hlaviΦkov² soubor funkce do projektu, kde ji chcete pou₧φt. V²Üe uvedenΘ makro se u₧ postarß, aby funkce byla importovßna. Makro vyu₧φvß konstanty, kterΘ jsou definovßny pouze v rozÜφ°enΘ knihovn∞. Z toho plyne, ₧e nejde pou₧φt v b∞₧nΘ DLL.


Dßle vytvo°φme instanci Pepy v Programu. Nap°φklad ve t°φd∞ CProgramDlg najd∞te funkci OnInitDialog(). V tΘto funkci vytvo°φme objekt Pepy a zkusφme ho naplnit daty, kterΘ si pozd∞ji zase vyzvedneme. D∙le₧itΘ ovÜem je, abyste "includovali" hlaviΦkov² soubor t°φdy CPepa do Programu. Makro AFX_EXT_CLASS importuje celou t°φdu. Jakmile toto vÜechno ud∞lßte, m∙₧ete t°φdu Pepa pou₧φvat stejn∞ jako by byla v Programu a ne v Knihovn∞. TakΘ si vÜimn∞te v²stupnφho okna IDE, zde uvidφte jak se knihovna zavßdφ a jak se ruÜφ.

P°φklad k tΘto lekci si m∙₧ete stßhnout v sekci Downloads. Mo₧nß na vßs tento p°φklad bude p°esp°φliÜ slo₧it², proto₧e jsme jeÜt∞ ned∞lali dialogy apod., ale to hlavnφ tam jist∞ najdete.

D∞kujeme za pozornost a u dalÜφho dφlu se t∞Üφme nashledanou.

Andrei Badea a Ji°φ Formßnek