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.

© 2005 Jindřich Mach & Jan Ticháček