Miten voin kutsua jotain funktiota DLL:stä? Olen lukenut Putkan DLL-oppaan mutta koko ajan tulee Run-Time Error '53': File not found. Itse funktion koodi ei aiheuta virhettä.
Moikka kayttaja-4976!
Esim. XP:ssä
Kopioi se sun.dll c:\windows\system32 hakemistoon ... Käynnistä - Suorita - kirjoita: regsvr32 c:\windows\system32\sun.dll - OK
Tarkistus:
Käynnistä - Suorita - kirjoita: regedit - OK - Muokkaa - Etsi - kirjoita: sun.dll - Etsi seeuraava.
Jos jossain lukee c:\windows\system32\sun.dll niin homman pitäs pelata
EDIt: Nappaa vielä siinä vasemmassa lootassa sen InprocServer32 alla
olevaa avainta ProgID - siellä pitäis näkyä sun.dll'n sisältö...
Se DLL siis rekisteröidään wintoosaan ja katotaan regeditistä ProgID:llä mitä se sisältää...?
Taisin muotoilla kysymykseni aika pahasti väärin :( .
Siis:
Tein DLL:n.
Siinä on Public Function Munfunktio(parametri As Integer)
Kokeilin kutsua DLL:ssä olevaa funktiota omasta muusta projektista, mutta mitään ei tapahdu.
~Silti jos ymmärsit mitä tarkoitin ja yrität saada viestin perille niin voisitko selventää? ~ Kiitos.
Olethan lisännyt DLL:stä referenssin omaan muuhun projektiisi ?
Moikka kayttaja-4976!
Jos nyt olen ymmärtänyt oikein, niin olet aikeissa kutsua Dll:stäsi jotain... eli ekaks esitely moduulissa:
Public Declare Function SeJaSe Lib "sun.dll" (param As Tyyppi, etrit As Tyypi) As Tyyppi
... jolloin voit kutsua sitä lähes mistä tahansa Projektissasi. Voidaksesi tehdä tämän sulavasti olisi hyvä että dll:si sijaitsisi käyttiksesi system-hakemistossa ja että dll:si olisi rekisterissä jolloin se näkyy referensseissä automaattisesti ilma eri noutamista...Jos taas olin ymmärtänyt ideasi väärin, niin siinä tapauksessa unohda tämä kokonaan...
Setä: Kyllä se on referensseissä.
Neau33:
Pitääkö sinne DLL:ään lisätä jotain koodeja taikka rekisteröidä sitä jollain jännällä tavalla? Nyt se sanoo "Run-Time error '453': Can't find DLL entry point Munfunktio in MunDLL.dll".
Kokeilin kopioida DLL:n samaan hakemistoon projektini kanssa ja kirjoittaa projektin moduuliin tuon Public Declare Function-lauseen, mutta erroria pukkaa.
VB:llä ei voi tehdä "perinteisiä" DLL:ä, vain ActiveX DLL:ä. Tästä seuraa se, että sinne DLL:n pitää (as in on pakko) tehdä luokka, jonka metodeiksi sitten kapsuloidaan nuo funktiot (tai mieluummin, noudatetaan hyviä olio-ohjelmointiperiaatteita :)
Declare-lausetta ei tarvita ActiveX-DLL:n kanssa, referenssin lisääminen (jota ennen DLL pitää olla rekisteröity, tai samassa projektiryhmässä) riittää.
Heippa Blaze!
Olet täysin oikeassa koskien ActiveX-DLL rekisteröintiä.
Mut jos kiinostaa niin...confaamaan
Eli siis voin unohtaa kivat funktiot DLL:ssä?
Pitääkö DLL:n olla System32-kansiossa jotta sitä voi kutsua näin?
Public Declare Function SeJaSe Lib "sun.dll" (param As Tyyppi, etrit As Tyypi) As Tyyppi
kayttaja-4976 kirjoitti:
Eli siis voin unohtaa kivat funktiot DLL:ssä?
Ei, joudut vaan muuttaan ajattelutapaas olio-ohjelmoinnin mukaseks.
kayttaja-4976 kirjoitti:
Pitääkö DLL:n olla System32-kansiossa jotta sitä voi kutsua näin?
Ei välttämättä, mikä tahansa PATH-ympäristömuuttujassa oleva polku tai ohjelman oma hakemisto kelpaa.
Ja edelleenkin: VB:llä tehty (ts. ActiveX-DLL) ei kelpaa.
Joo okei. No millä kääntäjällä sitten ehkä jopa voisi tehdä kelpaavia DLL:iä?
Jollakin muulla kuin VB:llä ainakin aivan helposti.
Onko aivan ylivoimaista tehdä se yksi wrapperiluokka funktioille? Ei tarvitsisi muilla kielillä ja/tai kääntäjillä leikkiä.
Niin kai se on.
Sain palautusarvot toimimaan kun tein DLL:ään 2 Boolean-muuttujaa, Processing ja Palauta. Laitoin Processing-muuttujan Trueksi kun DLL tekee töitä ja palautusarvoksi Palauta. Luin muuttujat muusta projektista Munluokka.Processing-tyyliin jne.
Aihe on jo aika vanha, joten et voi enää vastata siihen.