|
ZaΦßteΦnφk |
PokroΦil² |
Profesionßl |
|||||
|
|
|
||||||
Programovßnφ ve vφce jazycφch Visual Basic .NET a
Visual C++ .NET |
||||||||
|
|
Budete pot°ebovat
p°ibli₧n∞ 2 hodiny |
|
OperaΦnφ systΘm
pou₧it² v p°φsp∞vku: Windows XP V²vojovΘ nßstroje:
Visual Studio .NET |
||||
|
Vß₧enφ Φtenß°i,
hlavnφm nßm∞tem pro dneÜek je problematika
ämφchßnφô programovacφch jazyk∙. V nßsledujφcφch kapitolßch se pokusφme
p°ijφt na to, jak m∙₧e b²t pro programßtora p°φnosnß prßce ve dvou (nebo i
vφce) programovacφch jazycφch. Dßle se budeme soust°edit na praktickou
demonstraci filozofie programovßnφ ve vφce jazycφch a vytvo°φme dynamicky
linkovanou knihovnu (DLL) v prost°edφ Visual C++ a poslΘze vyu₧ijeme
mo₧nostφ vytvo°enΘ knihovny ve Visual Basicu. V∞°φm, ₧e vßs nßm∞t dneÜnφ
diskuse zaujal, a proto neztrßcejme Φas a pono°me se hloub∞ji do problematiky.
Filozofie programovßnφ ve
vφce jazycφch
Mo₧nß, ₧e s uveden²m termφnem ämφchßnφ
programovacφch jazyk∙ô (angl. Mixed Language Programming) se st°etßvßte poprvΘ,
mo₧nß, ₧e jste o n∞m ji₧ än∞coô slyÜeli, no stßle nevφte, o co ve skuteΦnosti
jde. Poj∩me se tedy podφvat, jak se tato myÜlenka dostala do sv∞ta, ve kterΘm
vlßdnou optimalizovanΘ algoritmy a poΦφtaΦovΘ instrukce. Jak jist∞ vφte,
v poΦφtaΦovΘm sv∞te existuje pom∞rn∞ poΦetnß mno₧ina programovacφch
jazyk∙, od t∞ch nejstarÜφch (ALGOL, COBOL, FORTRAN), p°es C a BASIC a₧ po
nejnov∞jÜφ instance, jak²mi jsou Visual Basic .NET, Visual C# .NET nebo Visual
C++ .NET. Ka₧d² programovacφ jazyk, kter² se nachßzφ na urΦitΘm v²vojovΘm stupni,
byl v poΦßtcφch svΘ tvorby koncipovßn jako pom∙cka pro °eÜenφ jist²ch
problΘmov²ch ·kol∙. ZjednoduÜen∞ se dß °φct, ₧e ka₧d² programovacφ jazyk se na
svou podstatu existence (tedy °eÜenφ ·kol∙, pro kterΘ byl stvo°en) dφvß
z vlastnφho pohledu. D∙kazem tohoto tvrzenφ jsou n∞kdy zcela specifickΘ
postupy, kterΘ musφ programßtor ve dvou jazycφch uskuteΦnit, aby vy°eÜil
stejnou ·lohu (nejjednoduÜÜφm p°φkladem m∙₧e b²t zapsßnφ cyklu For ve Visual Basicu
a C++). I kdy₧ je ka₧d² programovacφ jazyk specifick², vÜechny jazyky disponujφ
mnoha ästandardnφmiô konstrukcemi (v analogii s p°edchozφm p°φkladem, oba
jazyky, Visual Basic i Visual C++ obsahujφ cyklus For). Rozvineme-li myÜlenku,
₧e ka₧d² programovacφ jazyk byl primßrn∞ urΦen na °eÜenφ jistΘho okruhu
problΘm∙, m∙₧eme dojφt k poznßnφ, ₧e jeden jazyk m∙₧e b²t vhodn∞jÜφ na
°eÜenφ jistΘ skupiny problΘm∙, zatφmco jin² jazyk si zase dob°e poradφ s jinou,
specifickou mno₧inou ·kol∙. Jestli₧e popojedeme v naÜich ·vahßch jeÜt∞ o
krok dßle, objevφme samotnou myÜlenku programovßnφ ve vφce jazycφch. Posu∩te
sami: ProΦ pou₧φvat na vy°eÜenφ jistΘho problΘmu jazyk, ve kterΘm je toto
°eÜenφ kdy₧ ne nemo₧nΘ, tak alespo≥ hodn∞ obtφ₧nΘ? Nebylo by lepÜφ jednoduÜe
napsat onu kritickou Φßst programu v jinΘm jazyce, kter² si s naÜφm problΘmem
umφ lΘpe poradit?
Pou₧itφ teorie mφchßnφ
programovacφch jazyk∙ m∙₧e p°inΘst mnoho v²hod:
|
┌spora Φasu |
Otßzka roz°eÜenφ
programßtorskΘho problΘmu, se kter²m nevφme v prost°edφ jednoho
jazyka äani hnoutô, se v jinΘm jazyce m∙₧e stßt otßzkou n∞kolika mßlo
okam₧ik∙. |
|
ZlepÜenφ v²konu |
Napsßnφ kritick²ch
Φßstφ programu v jinΘm, ni₧Üφm, programovacφm jazyku m∙₧e zp∙sobit
citelnΘ zlepÜenφ v²konu aplikace. |
|
ZlepÜenφ rychlosti |
S p°edchozφm bodem
se ·zce vß₧e i zlepÜenφ rychlosti programu. V p°φpad∞, ₧e napφÜeme
optimalizovan² k≤d ni₧Üφ ·rovn∞, a ten pak vyu₧ijeme ve stßvajφcφ aplikaci,
zlepÜenφ rychlosti m∙₧e b²t signifikantnφ. |
|
Znovupou₧itelnost programovΘho k≤du |
Pokud jsme schopni
napsat nφzko·rov≥ov² k≤d, kter² pozd∞ji äzabalφmeô do komponenty pro dalÜφ
pou₧itφ, nemusφme ji₧ tuto Φßst k≤du psßt op∞t pozd∞ji. JednoduÜe vyu₧ijeme
to, co ji₧ mßme p°ipravenΘ. |
Pro ·plnost v²kladu je zapot°ebφ vzpomenout i n∞kterΘ
stinnΘ strßnky tΘto teorie programovßnφ.
|
V∞domostnφ ·rove≥ |
Jde o ·rove≥
znalostφ a schopnostφ, kterou musφ programßtor disponovat. Ne ka₧d²
programßtor toti₧ umφ dob°e programovat ve vφce jazycφch. V tΘto
souvislosti nenφ mo₧no zapomenout na prvotnφ zv²ÜenΘ nßklady na zv²Üenφ
znalostnφ ·rovn∞ programßtora. M∙₧e jφt nap°. o absolvovßnφ specializovanΘho
programßtorskΘho kurzu, nßkup literatury a pod.áá |
|
Nutnost vlastnit dalÜφ programovacφ nßstroj |
Pokud se
rozhodnete pro programovßnφ ve vφce jazycφch, budete pravd∞podobn∞ muset
investovat do nßkupu dalÜφho v²vojovΘho nßstroje, kterΘho cena m∙₧e znaΦn∞
ovlivnit vßÜ rozpoΦet pro vyvφjenou aplikaci. |
V dneÜnφ p°φpadovΘ studii budeme spoleΦn∞
°eÜit jeden z nejΦast∞jÜφch ·kol∙ programßtora pracujφcφho
v prost°edφ dvou programovacφch jazyk∙. P∙jde o vytvo°enφ dynamicky
linkovanΘ knihovny (DLL) ve Visual C++ a nßsledn∞ jejφ implementace do aplikace
vyvφjenΘ ve Visual Basicu.
|
Pokud nßhodou pat°φte mezi skupinu programßtor∙ VB, kter²m se p°i
vyslovenφ nßzv∙ äC/C++ô, p°φpadn∞ äVisual C++ô ud∞lß Üpatn∞, nemusφte se ji₧
vφce obßvat a m∙₧ete z∙stat zcela klidnφ. V tomto Φlßnku toti₧
nep°edpoklßdßm, ₧e mßte n∞jakΘ zkuÜenosti jak s jazykem C/C++, tak
s v²vojov²m prost°edφm Visual C++. V celΘm Φlßnku se uplat≥uje
ov∞°enß technika postupu stylem äkrok za krokemô, proto se nemusφte obßvat
jak²chkoliv nejasnostφ. Uvidφte, ₧e po p°eΦtenφ nßsledujφcφch °ßdk∙ budete i
vy schopni vytvo°it jednoduchou DLL ve Visual C++.áá |
Visual Basic .NET a Visual C++ .NET
Krok 1: Tvorba dynamicky linkovanΘ knihovny
(DLL) ve Visual C++ .NET
V nßsledujφcφ ukßzce vytvo°φme standardnφ
dynamicky linkovou knihovnu typu Win32, kterß bude obsahovat jednu funkci pro
v²poΦet t°etφ mocniny Φφsla. Postupujte takto:
|
StejnΘho ·Φinku m∙₧ete docφlit i klepnutφm na ikonu New Project na standardnφm panelu
ikon, nebo klepnutφm na tlaΦφtko New
Project v okn∞ Start Page.
Pokud okno Start Page po spuÜt∞nφ Visual Studia nenφ viditelnΘ, klepn∞te na
nabφdku Help a aktivujte polo₧ku Show Start Page. |
Obr. 1 û Okno pro v²b∞r novΘho typu projektu
V levΘ Φßsti okna, v sekci Project
Types, vyberte jako typ projektu Visual C++ Projects. V pravΘ Φßsti okna, v sekci Templates, vyberte polo₧ku Win32 Project. V textovΘm
poli Name zadejte jmΘno pro vßÜ
nov² projekt a zaÜkrtn∞te volbu Create directory for Solution, Φφm₧ zabezpeΦφte vytvo°enφ samostatnΘ slo₧ky pro vaÜe °eÜenφ. Kdy₧
jste se zm∞nami spokojeni, klepn∞te na tlaΦφtko OK. á
Obr. 2 û V²b∞r typu aplikace
v pr∙vodci
Visual C++ poslΘze vytvo°φ vÜechny nezbytnΘ
soubory, kterΘ si aplikace typu Win32 DLL vy₧aduje. Seznam t∞chto soubor∙ si
m∙₧ete prohlΘdnout v Pr∙zkumnφkovi °eÜenφ (Solution Explorer). Okno
Pr∙zkumnφka °eÜenφ by se m∞lo nachßzet v pravΘ hornφ Φßsti okna Visual C++
a jeho podoba je zachycenß na obr. 3.
Obr. 3 û Okno Pr∙zkumnφka
°eÜenφ (Solution Explorer)
Nynφ poklepejte na polo₧ku DLL_C++.cpp, kterß
se nachßzφ ve stromovΘ struktu°e pod uzlem Source Files. Visual C++ nßsledn∞ otev°e vybran² zdrojov² soubor projektu, kterΘho
obsah pro vßs zobrazφ v okn∞ pro zßpis programovΘho k≤du (obr. 4).
Obr. 4
û Okno pro zßpis programovΘho k≤du ve Visual C++
V tomto okn∞ si m∙₧ete vÜimnout vφce
v∞cφ, kterΘ se vßm (jako programßtorovi VB), m∙₧ou zdßt neznßmΘ a podivnΘ.
Poj∩me tedy p∞kn∞ popo°ßdku a obsah okna si vysv∞tleme. Nu₧e, prvnφ dva °ßdky p°edstavujφ
komentß°e, kterΘ do k≤du umφstil samotn² Visual C++. Zapamatujte si, ₧e ka₧d²
komentß° (ve stylu jazyka C++) je uveden dv∞ma lomφtky, kterΘ jsou symbolem pro
jedno°ßdkovΘ komentß°e. Znamenß to tedy, ₧e kdy₧ uvedete v k≤du dv∞
lomφtka a za nimi text, tento je pozd∞ji kompilßtorem chßpßn jako komentß° a je
zcela ignorovßn.
DalÜφ nejasnostφ je pravd∞podobn∞ tento °ßdek:
#include "stdafx.h"
Prvnφ Φßst v²razu #include je takzvanß direktiva preprocesoru.
Ta ä°φkßô preprocesoru, aby soubor s nßzvem ästdafx.hô zaΦlenil do programovΘho
k≤du projektu. ╪eΦeno jin²mi slovy, kdy₧ preprocesor p°i svΘ prßci änarazφô na
direktivu #include, vlo₧φ obsah souboru, kter² tato direktiva specifikuje, do
samotnΘho programovΘho k≤du vyvφjenΘ aplikace. Soubor ästdafx.hô, jen₧ tvo°φ
druhou Φßst v²razu, je tzv. hlaviΦkov²m souborem.
|
Preprocesor je typem textovΘho procesoru, kter² jist²m zp∙sobem
modifikuje zdrojov² text programu jeÜt∞ p°ed samotnou kompilacφ (ve
skuteΦnosti se preprocesor pou₧φvß jenom v prvnφ etap∞ kompilace
programu). |
á
Nßsleduje definice funkce DllMain, kterß je vstupnφm bodem (entry point) do dynamickΘ knihovny. Tuto funkci volß samotn² operaΦnφ systΘm p°i inicializaci a terminaci proces∙ a vlßken. Proto₧e v naÜφ ukßzce nebude chtφt vykonßvat ₧ßdnΘ operace p°i uveden²ch Φinnostech, m∙₧eme ponechat funkci DllMain v jejφ p∙vodnφ podob∞.
Ve vÜeobecnosti je dynamicky
linkovanß knihovna napln∞na funkcemi, kterΘ je mo₧nΘ z jejφho prost°edφ
pozd∞ji volat. Abyste do stßvajφcφho k≤du p°idali takΘ k≤d pro naÜφ
exportovanou funkci, ud∞lejte nßsledovnφ:
extern "C" __declspec(dllexport) __stdcall int Mocnina(short
cislo)
{
ááááá return cislo*cislo*cislo;
}
Toto je zßpis pro exportovanou funkci. Pod pojmem äexportovanß funkceô se rozumφ funkce, kterß bude v budoucnosti volßna z programovacφho jazyka VB .NET. Aby bylo mo₧nΘ tuto funkci zavolat z programu VB .NET, je zapot°ebφ uvedenß definice funkce. Pokud odhlΘdneme od pou₧itφ modifikßtor∙ extern äCô, __declspec(dllexport) a volacφ konvence __stdcall, dostßvßme se k samotnΘ funkci. Jejφ nßzev je äMocninaô a jak je vid∞t, funkce mß jeden parametr, kter²m je prom∞nnß typu short s nßzvem äcisloô.
|
V jazyce C++ se prom∞nnΘ deklarujφ jinak ne₧ je to ve Visual
Basicu. Zde je zapot°ebφ nejd°φve uvΘst datov² typ prom∞nnΘ a a₧ potΘ samotnΘ
jmΘno prom∞nnΘ. |
Proto₧e jde o
parametr funkce, je nutno jej uzav°φt do kulat²ch zßvorek. Nßvratovß hodnota
funkce je specifikovßna p°ed jmΘnem funkce; z uvedenΘho p°φkladu vidφme,
₧e p∙jde o nßvratovou hodnotou typu integer, jak specifikuje klφΦovΘ slovo int. T∞lo ka₧dΘ funkce v prost°edφ jazyka C/C++
je uzav°eno do slo₧en²ch zßvorek. T∞lem funkce se rozumφ p°φkazy, kterΘ se majφ
provΘst tehdy, je-li funkce zavolßna. V naÜem p°φpad∞ si m∙₧ete vÜimnout,
₧e v t∞le funkce je jenom jedin² p°φkaz. Tento p°φkaz vypoΦte t°etφ
mocninu Φφsla, kterou funkce p°i dokonΦenφ svΘ prßce vracφ. VÜechno, co
nßsleduje za klφΦov²m slovem return p°edstavuje
nßvratovou hodnotu funkce. KoneΦn∞, ka₧d² p°φkaz v jazyku C/C++ je ukonΦen
nikoliv koncem °ßdku, n²br₧ st°ednφkem.
Obr. 5 û V²b∞r definiΦnφho
souboru pro export funkce z knihovny DLL
|
P°i zßpisu jmΘna funkce m∞jte na pam∞ti, ₧e Visual C++ je äcase
sensitiveô, tedy rozliÜuje malß a velkß pφsmena ve slovech. Pokud byste
zadali mφsto °et∞zce äMocninaô °et∞zec ämocninaô, jednalo by se o zcela jinou funkci.á |
Obr. 6 û V²slednφ podoba
souboru DEF
|
VÜimn∞te si hv∞zdiΦky, kterß se nachßzφ v zßlo₧ce za jmΘnem DEF
souboru na obr. 6. Tφmto zp∙sobem vßs Visual C++ upozor≥uje na skuteΦnost, ₧e
obsah souboru se zm∞nil od tΘ doby, co jste tento soubor naposled ulo₧ili. |
Po vydßnφ p°φkazu na sestavenφ aplikace Visual
C++ zkompiluje vÜechny nezbytnΘ soubory a vybuduje jedinou dynamickou knihovnu.
Jestli₧e vÜe prob∞hlo tak, jak m∞lo, ve spodnφm panelu uvidφte text äBuild
succeededô. V²born∞, dokßzali jste vytvo°it svou prvnφ dynamicky linkovanou
knihovnu!
Podφvßte-li se do slo₧ky vaÜich projekt∙ a
otev°ete slo₧ku Debug prßv∞ vytvo°enΘho projektu, m∙₧ete vid∞t knihovnu DLL
v celΘ jejφ krßse tak, jak ji znßzor≥uje obr. 7.
Obr. 7 û Vytvo°enß dynamicky
linkovanß knihovna (DLL)
á
Abyste nemuseli pozd∞ji zadßvat celou cestu
k vaÜφ knihovn∞ DLL, zkopφrujte ji do systΘmovΘ slo₧ky Windows
(Windows\System).
Visual Basic .NET a Visual C++ .NET
Krok 2: Vyu₧itφ dynamickΘ knihovny
ve Visual Basicu .NET
Pro p°edvedenφ mo₧nostφ
knihovny DLL v prost°edφ VB nejd°φve p°idßme do stßvajφcφho projektu
standardnφ projekt VB. Postupujte takto:
ááá á Public Declare Function Mocnina Lib
"DLL_C++.dll" _
(ByVal cislo As Short) As Integer
MessageBox.Show(Mocnina(3).ToString)
Jakmile klepnete na
tlaΦφtko, VB .NET zavolß exportovanou funkci s nßzvem äMocninaô, kterß
vypoΦte t°etφ mocninu Φφsla 3 a nßvratovou hodnotu zobrazφ v okn∞ zprßvy
(obr. 8).
Obr. 8 û Finßlnφ podoba
spoluprßce aplikace VB a knihovny DLL
V²born∞, dynamicky linkovanß knihovna odvßdφ
svou prßci na jedniΦku!
Abyste zmenÜili velikost
v²slednφ knihovny DLL, m∙₧ete ji takΘ sestavit v distribuΦnφm provedenφ.
V tomto provedenφ se k≤d pln∞ optimalizuje a rovn∞₧ se z n∞j odstranφ
informace, kterΘ jsou urΦeny pouze pro proces odla∩ovßnφ knihovny. V prost°edφ
Visual C++ ud∞lejte nßsledovnφ:
Obr. 9 û V²b∞r distribuΦnφho
provedenφ knihovny DLL v okn∞ Configuration Manager
á
Visual C++ uskuteΦnφ sestavenφ dynamicky
linkovanΘ knihovny a ve stßvajφcφ slo₧ce projektu vytvo°φ dalÜφ slo₧ku
s nßzvem äReleaseô. Ve slo₧ce äReleaseô se nachßzφ knihovna DLL,
p°ipravenß na distribuΦnφ proces. Abyste m∞li lepÜφ p°edstavu o velikosti
knihovny DLL, podφvejte se na obr. 10, kter² znßzor≥uje velikost knihovny DLL
urΦenΘ pro odla∩ovßnφ a pro distribuci.
Obr. 10 û Porovnßnφ velikosti
variant provedenφ knihovny DLL
V∞°φm, ₧e vßs uvedenß problematika zaujala a
rozÜφ°ila vaÜe programßtorskΘ znalosti.
Jßn Hanßk