Kirjautuminen

Haku

Tehtävät

Opasarkisto: Visual Basic: Johdatus DLL:ien luomiseen VB6:lla

Kirjoittaja: Blaze. Vuosi: 2004.

Huomio! Tämä opas on vanhentunut. Oppaan sisältöön ei voi enää luottaa. Opas on säilytetty vain sen historiallisen arvon vuoksi.

Johdanto

Oppaan sisällön ymmärtämistä auttaa huomattavasti, jos oliopohjainen ohjelmointi termeineen on ennestään tuttua, mutta mikään vaatimus se ei ole.

DLL on lyhenne sanoista Dynamic Link Library, joka on tiedosto, joka sisältää ajettavaa ohjelmakoodia siinä, missä tavallinen EXE -tiedostokin. DLL:t, toisin kuin tavalliset ohjelmat, ovat jaettuja, eli mikä tahansa ohjelma (tai toinen DLL!) voi kutsua tätä DLL:ssä sijaitsevaa koodia.

Visual Basic tekee ns. ActiveX DLL:iä, jotka sisältävät luokkia, joita “emo-ohjelmaö voi sitten käyttää kuin ne olisivat sen omia luokkia. “Perinteisistäö (kuten WinApin) DLL:stä tuttu Declare -lauseviidakko ei siis ole tarpeen.

Tekisinkö DLL:n?

Useampi ohjelma voi yhtaikaa käyttää samaa DLL:ää, DLL voidaan päivittää erikseen, DLL:iä voidaan ladata muistiin ja poistaa sieltä kesken ohjelman ajon (plug-in -systeemi). Nämä ovat kaikki syitä, jotka puhuvat DLL:ien käytön puolesta. Jos kuitenkaan et tarvitse mitään näistä ominaisuuksista, on todennäköisesti helpompaa ja kätevämpää vain suoraan liittää luokka osaksi omaa sovellusta, eikä tehdä siitä erillistä DLL:ää.

Aloitus

Aloita uusi “Standard EXEö -projekti. Tämä projekti toimii testiohjelmana DLL:llemme. Seuraavaksi lisää uusi projekti (File > Add Project, tai työkalurivin ensimmäinen painike), tällä kertaa tyyppiä “ActiveX DLLö.

Anna tälle DLL-projektille jokin kuvaava nimi, esimerkissämme “MunDLLö. Nimeä myös DLL-projektissa oleva luokkamoduuli (class module). Esimerkissämme käytämme nimeä “EkaLuokkaö.

Seuraavaksi lisää testiohjelmaan viittaus DLL:ään. Tämä tapahtuu Project > References -valikosta. Rastita aukeavasta listasta “MunDLLö, tai minkä nimen nyt DLL:llesi nyt sitten annoitkaan.

Ensimmäinen metodi

Luodaan seuraavaksi EkaLuokka-luokalle metodi. Metodit ovat oliossa sijaitsevia aliohjelmia ja funktioita ja ne luodaan tekemällä luokkamoduuliin julkinen (public) aliohjelma tai funktio.

Public Sub EkaMetodi()
    MsgBox "Tämä viestilaatikko näytetään DLL:stä!"
End Sub

Jotta metodia voi kutsua, pitää ensin luoda instanssi “EkaLuokkaö -luokasta. Alla täydellinen koodi luokan luomiseen, metodin kutsumiseen ja lopuksi luokan tuhoamiseen:

Private Sub Form_Click()
    'Objektimuuttuja, joka pitää sisällään viittauksen "EkaLuokka" -luokkaan
    Dim MunLuokka As EkaLuokka

    'Luodaan uusi instanssi EkaLuokasta
    Set MunLuokka = New EkaLuokka

    'Kutsutaan metodia
    MunLuokka.EkaMetodi

    'Tuhotaan MunLuokka, kun sitä ei enää tarvita
    Set MunLuokka = Nothing
End Sub

Lisää luokkia

Yksi ActiveX DLL voi toki sisältää enemmänkin luokkia. Luo projektiin uusi luokkamoduuli ja anna sille nimeksi vaikka “TokaLuokkaö. Luodaan tähän luokkaan astetta monimutkaisempi metodi, joka palauttaa satunnaisen arvon annettujen parametrien mukaan.

'Class_Initialize suoritetaan kun luokasta luodaan uusi instanssi
'Käytämme sitä tässä esimerkissä alustamaan satunnaislukugeneraattorin
Private Sub Class_Initialize()
    Randomize
End Sub

'Itse metodi
Public Function Satunnaisluku(Alaraja As Integer, Ylaraja As Integer) As Integer
    If Alaraja > Ylaraja Then Exit Function
    Satunnaisluku = (Ylaraja - Alaraja) * Rnd + Alaraja
End Function

Metodia voidaan käyttää seuraavalla tavalla:

Private Sub Form_Click()
    'Viittaus luokkaan
    'Huomaa, että tällä kerralla määrittelemme tyypiksi "TokaLuokka"
    'edellisen kerran "EkaLuokka":n sijaan
    Dim MunLuokka As TokaLuokka

    'Luodaan uusi instanssi
    Set MunLuokka = New TokaLuokka

    'Kutsutaan metodia
    MsgBox MunLuokka.Satunnaisluku(0, 10)

    'Tuhotaan MunLuokka
    Set MunLuokka = Nothing
End Sub

Loppusanat

Voit nyt kääntää projektiryhmän (project group) ja todeta, että homma toimii :)
Kaikki luokkien ominaisuudet (kuten propertyt) ovat toki käytettävissä myös kun luokkaa käytetään DLL:stä, mutta ne ovat jo toisen oppaan aihe.

Ja jos/kun haluat hankkiutua eroon kaikista niistä testi-DLL:stä, jotka sotkivat References -ikkunan listaa, onnistuu se poistamalla niiden rekisteröinti (unregister) Windowsista. Rekisteröinnin poistaminen tapahtuu komentorivipohjaisella regsvr32 -työkalulla. Avaa siis joko komentokehote, tai suorita-ikkuna ja komenna regsvr32 /u asema:\hakemisto\tiedosto.dll, eli esimerkiksi regsvr32 /u "C:\Documents and Settings\blaze\My Documents\Koodaus\dlltut\MunDLL.dll" ja “MunDLLö -merkintä katoaa References -ikkunan listasta.

Regsvr32:a tarvitsee myös silloin, kun haluat jakaa DLL:n muihin koneisiin. Windows ei löydä DLL:n sijoitettua luokkaa, ellei sitä ole rekisteröity ensin. VB rekisteröi luokan valmiiksi koneelle, jossa sitä tehdään, mutta muilla pääsemme jälleen käyttämään regsvr32:ta. Rekisteröiminen tapahtuu kuten sen poistaminen, mutta ilman /u -vipua, eli esimerkiksi regsvr32 "C:\Documents and Settings\blaze\My Documents\Koodaus\dlltut\MunDLL.dll"

Asennusohjelmat saattavat hoitaa tämän näkymättömästi, mutta mikäli levität ohjelmaa pelkässä zip-paketissa, tämä on jotain, mikä kannattaa pitää mielessä.

Voit noutaa esimerkkikoodin ja käännetyn ohjelman osoitteesta http://www.ohjelmointiputka.net/tiedostot/vbdllex.zip

Kommentit

Aku2 [12.09.2004 23:16:14]

Lainaa #

Vihdoin ja viimein tällainen yksinkertainen esimerkki DLL kirjastojen teosta ja käytöstä.
Hienoa ja suuret kiitokset tekijälle.

Pieni kysymys kuitenkin itse oppaasta.
Mille versiolle esimerkkikoodit ovat tarkoitettu ja eroaako esimerkkikoodit mitenkään VB6 ja VB.net ympäristöissä?

Ainakin koodi esimerkeistä päätelleen esimerkit olisivat VB6:lle.

Blaze [13.09.2004 13:50:05]

Lainaa #

Tämä opas on tosiaan VB6:lle, mulla ei oo kokemusta .NET:stä, niin en osaa sanoa toimiiko siinä homma kuinka samalla tavalla.

Tuosta vois varmaan kyllä lisätä maininnan johonkin, niin .NET ihmiset ei turhaan kuluta aikaansa.

tnb [13.09.2004 23:00:32]

Lainaa #

Cornix [14.09.2004 18:32:16]

Lainaa #

Vaikken Visual Basiccia olekaan itse käyttänyt, oli tämä opas pikaisen läpiluvun perusteella selkeä ja tarpeeksi yksinkertainen.
Nytpähän ymmärrän minäkin hieman paremmin DLL:ien toimintaa.En esimerkiksi tiennyt, että niitä voidaan ottaa käyttöön lennosta ohjelman ajon aikana. :)

Gwaur [09.11.2004 00:20:39]

Lainaa #

_Cornix_ kirjoitti:

En esimerkiksi tiennyt, että niitä voidaan ottaa käyttöön lennosta ohjelman ajon aikana. :)

Kyllähän tämä näkyy muunmuassa dll:iä käyttävissä mirk-skripteissä. :)

polsystem [13.07.2006 16:58:44]

Lainaa #

Aika hyvältä näyttää.Heti kun saan VB6-ohjelmat, aion kokeilla.

moptim [15.10.2006 09:05:09]

Lainaa #

laittaisit rivin:

Randomize Timer

Blaze [15.10.2006 19:12:50]

Lainaa #

VB:ssä pelkkä Randomize tekee tasan saman asian.

Kirjoita kommentti

Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.

Muista lukea kirjoitusohjeet.
Tietoa sivustosta