Tvorba DLL v VB6
Úvod
Vzhledem k naprostému nedostatku informaci (v
češtině) na toto téma, jsem se rozhodl vnést do této věci trochu jasno.
Nejdříve si řekneme k čemu jsou takové knihovny dobré. Dejme tomu že vytvoříte
nějaký velký program jenž obsahuje desítky formulářů, obrázků, ovládacích prvků
apod. Takový program bude ale mit po zkompilování do EXE řádově desítky MB. Bude
se dlouho načítat a v paměti PC zabere mnoho paměti.
Je velice pravděpodobné, že uživatel nepotřebuje vždy najednou všechny funkce
jenž váš program obsahuje, proto je vhodnější ponechat v EXE pouze ty "věci"
jenž jsou potřeba hned po startu programu a další načítat z připojených DLL
knihoven až tehdy pokud jsou skutečne potřeba a následně je zase uvolnit.
Vaše programy se tak velice urychlí. Má to ještě další přednosti. Např. vaše DLL
obsahuje fci pro třídění pole. Po nějakém čase zjistíte že tuto funkci můžete
nějak vylepšit. Stačí tedy pouze přepsat konkrétní DLL a poskytnout ji
uživateli. Ten potom nemusí instalovat celý váš program znovu, ale pouze nahradí
konkrétní knihovnu. Pozor!!! při těchto upravách je nutno dodržet název
upravované fce jakož i její parametry.
Jen pro úplnost jsou dva druhy DLL, ActiveX a API. API knihovny se vytvářejí
především v C,C++ apod. v VB to jde taky, ale je to poněkud neohrabané a proti
ActiveX nejsou výkonostně až tak odlišné (a hlavně o nich vím p..). Takže mi se
zaměříme na knihovny ActiveX.
Vytváření DLL i jejich ladění je v podstatě stejné jako tvorba standartního EXE,
pouze je potřeba dodržet některé zásady nastavení vašeho vývojového prostředí.
Provedu vás krok za krokem nastavením prostředí a nastíním možnost použití.
Přiloženy jsou i zdrojové kódy s příkladem.
Upozorňuji že nejsem žádný redaktor takže prosím o schovívavost.
Dost řečí začínáme.
Začínáme

1. Nejdříve si nastavíme vývojové prostředí, to
je nejdůležitější část. Spustíme VB a vytvoříme
Standart.EXE (ten použijeme pouze jako
dočasný objekt pro naše testování funkčnosti DLL)

2. Dále v nabídce "File" zvolte "Add Project ..."
a vyberte "ActiveX.DLL"

V okně "Project Exploreru" (dále jen PE)
to
vypadá takto

3. Teď v PE označte "Project2(Project2.vbp)"
a v menu File zvolte "Save Project2 Ctrl+S"
a uložte jej.
Potom v PE
označte "Project1(Project1.vbp)" a také jej uložte.

Teď v menu "File" ještě zvolte "Save project Group" a
uložte.
"Group" je hlavní skupina našeho projektu jenž obsahuje oba základní projekty
EXE a DLL. Pokud budete v budoucnu chtít upravovat samotný EXE nebo samotný DLL
tak otevřte soubor s příponou "*.vbp", pokud budete upravovat celou skupinu tak
otevřte soubor s příponou "*.vbg".

4. Poslední krok je vložení reference na naši DLL. V PE označte
"Project1(Project1.vbp)" , v nabídce "Project" klepněte na "References..." a
najděte položku "Project2" a zaškrtněte ji. Tak a je to teď mužeme vesele
programovat DLL a vesele ladit jeji funkce z naší EXE aplikace.
Trocha teorie
Ať už vytvoříte v DLL cokoliv tak pokud se k tomu chcete dostat "zvenku" musíte
to zadat do modulu třídy a jako "Public". Počet modulů třídy není nijak omezen,
ale na vnější komunikaci doporučuji používat jen jeden (alespoň zpočátku). Naše
DLL může obsahovat samozřejmě i formuláře a všechny možné prvky jako běžné EXE,
jejich chování je však podmíněno v závislosti na způsobu jejich volání. Pokud
potřebujete "zvenku" zobrazit formulář jenž je v DLL , musíte si v DLL v modulu
třídy vytvořit patřičnou proceduru jenž tento form. zobrazí. Zkrátka nedostanete
se k Formu přímo.
Další věc na kterou chci upozornit je nasledný běh programu. Můžete zavolat
nějakou proceduru z DLL a váš program může pokračovat zatímco procedura v DLL
ješte běží nezávisle na vašem programu, nebo si procedura v DLL podrzi hlavní
vlákno a vaše aplikace tak musí čekat až ji DLL zase umožní pokračovat.
Takže např. pokud zavolám proceduru "Sub" jenž jak známo nemá návratovou
hodnotu, bude naše aplikace pokračovat dalším řádkem kódu bez čekání. Pokud ale
zavoláme proceduru "Function" bude naše aplikace čekat na návratovou hodnotu z
DLL a až po jejím obdržení pokračuje dáším řádkem kódu. Je samozřejmě mnoho
zpúsobů jak si podržet vlakno v DLL toto je jen jeden z nich.
Výsledek našeho snažení
Konečne nejaký kód. V našem EXE projektu si nejdříve musíme vytvořit objektovou
proměnnou jenž bude představovat "komunikační vlákno" s naší DLL.
V okně "code" našeho EXE zadejte následující:
' nejdrive si definujeme objektovou promenou, ktera je zatim prazdna
Private MojeDLL As Project2.Class1
Private Sub Command1_Click()
'volame fci ulozenou v DLL, ta ma za ukol zobrazit formular a nevrati nam vlakno
dokud je jeji form. zobrazen
Call MojeDLL.GetForm(1)
End Sub
Private Sub Command2_Click()
'volame fci ulozenou v DLL, ta ma za ukol zobrazit formular a necha nas jet dale
'proste DLL si jede dal sama jako samostatny proces (coz taky je) bez ohledu na
nas
Call MojeDLL.GetForm
End Sub
Private Sub Form_Load()
'tady jiz do nasi promenne priradime prave vytvoreny objekt jenz predstavuje
nasi DLL
Set MojeDLL = New Project2.Class1
End Sub
Private Sub Form_Unload(Cancel As Integer)
'nezapomente take uvolnit prostredky pokud jiz nepotrebujte funkce z DLL
Set MojeDLL = Nothing
End Sub
Private Sub cmdPoc_Click()
Dim Cislo As Integer
'zde volame fci jenz je v DLL
'predame ji dve hodnoty Integer a cekame na vysledek (DLL si drzi vlakno, nebo
jak to nazvat)
'obe hodnoty jsou secteny a nam je vracen vysledek (a predano vlakno, takze
jedem dal)
txtC = MojeDLL.Pocitej(txtA, txtB)
End Sub
To nejdůležitější už znáte teď si prostudujte přiložené "zdrojáky". Po jejich
rozbalení otevřte z VB soubor "Group1.vbg" ten obsahuje oba projekty (EXE a DLL)
a mužete vesele skoušet.
Příklad obsahuje funkci v DLL pro sečtení dvou čísel a vrací výsledek volající
aplikaci. Dále potom ukázku zobrazení formuláře v DLL a podržení vlákna.
Tlačítko "Podrž vlákno" zobrazí formulář v DLL a pozastaví volající aplikaci, to
druhé také zobrazí formulář v DLL a zároveň nechá volající aplikaci pokračovat
dále.
Dodatek
Pokud již máte odladěnou svoji finální verzi DLL a chcete ji začít používat
samostatně, postupujte následovně.
V PE označte "Project2(Project2.vbp)" a nabídce "File" zvolte "Make
project2.DLL".

Teď na zkoušku vytvořte úplně nový projekt a zvolte "Standart.EXE". Následně v
nabídce "Project" klepněte na "References..." zde na tlačítko "Browse..." a
najděte vámi vytvořenou DLL a přidejte ji do projektu.
Teď již můžete volat funkce z DLL stejně jako předtím pouze je nemůžete ladit,
protože jsou již uzavřeny.
Cable tv is not as good as it used to be. So I switched to dish satellite. I really enjoy my satellite television no matter what kind of satellite TV it is, whether dishtv or directtv. But I personally chose dishnetwork.
|