Kirjoittaja: Blaze (2004).
⚠ Huomio! Tämä opas on vanhentunut. Oppaan sisältöön ei voi enää luottaa. Opas on säilytetty vain sen historiallisen arvon vuoksi. ⚠
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.
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:ää.
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.
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
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
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 https://www.ohjelmointiputka.net/tiedostot/vbdllex.zip
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.
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.
vb.net standard version dll teko on putkan jutussa
https://www.ohjelmointiputka.net/koodivinkit/
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. :)
_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ä. :)
Aika hyvältä näyttää.Heti kun saan VB6-ohjelmat, aion kokeilla.
laittaisit rivin:
Randomize Timer
VB:ssä pelkkä Randomize tekee tasan saman asian.
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.