Eli ajattelin tehdä irc bottiini jonkinlaisen plugin systeemin dll kirjastoilla eli miten tämä olisi mahdollista ?
Tein koulutyönä muistio-kloonin, jossa oli plugin-tuki, mutta en ole sen jälkeen jatkanut sitä. Jäin aluksi ohjelman kehittelyssä jumiin, mutta sitten löysin mahtavan artikkelin aiheesta ja homma meni loppujen lopuksi aika hyvin.
Osoite artikkeliin: http://www.devx.com/vb/Article/15767
Ainoa harmittava rajoitus on, että tämä käyttää ActiveX-dlliä jotka pitää rekisteröidä systeemin ennenkuin niitä voidaan ladata käyttöön.
Voin pistää ohjelmani nettiin, jos kiinnostusta löytyy.
https://www.ohjelmointiputka.net/oppaat/opas.
Tuossa on jonkinnäköinen johdatus aiheeseen.
Tuo devx.com:n artikkeli ei toimi. Ei se valmis zipattu koodi eikä se sivullakaan oleva esimerkkikoodi vaan valittaa valittamistaan...
Voisiko joku väsätä pienen esimerkkikoodin tuosta, että kuinka saadaan ajon aikana ladattua näitä "plugineja". Voisi olla käyttöä monessakin projektissani :D
EDIT: Mikeful, joo laita vaan nettiin... sourcien kanssa siis tietenkin... Jos ymmärtäisi jotain...
Muistelinki, että mulla oli tommonen jo jossain valmiina: http://pp.kpnet.fi/blaze/temp/dlllatauslennosta.
Tässäpä tämä on: http://www.freewebs.com/mikeful/lataus/
Joo kiitoksia paljon eiköhän näillä eväillä mennä eteenpäin
Kiitoksia! Nyt sain minäkin nämä toimimaan... sit, kun vain keksi jotain käyttöä xD
EDIT: Pystyikö DLL:stä vaikuttamaan mitenkään ohjelman sisältöön? Esimerkiksi jos ohjelmassa ei tiedetä etsiä dll:stä jotain tiettyä tekstiä muuttujasta, mutta dll:ssä käskettäisiin tyyliin
form1.text1.text = "MOI!"
niin form1:n text1.text olisi "MOI!". Itse en ainakaan saanut toimimaan juuri tuolla tavalla. En muista mitä valitti, mutta jotain tyyliin, että form1:stä ei löydy tjs..?
Ei onnistu noin, mutta voit luoda sille DLL:ssä olevalle luokalle eventin ja laitat sen emo-ohjelman vaihtamaan tuon tekstin tuon eventin tapahtuessa.
Tjooh no mää tein ihan testiksi dll kirjaston jossa oli functio
Public Function messagepoksi() Msgbox "Täs" End Function
käänsin dllksi c asemalle nimellä moi.dll
sitten koitin ladata sitä tällätavalla
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long Private Sub Form_Load() On Error Resume Next Dim lb As Long, pa As Long lb = LoadLibrary("C:\moi.dll") pa = GetProcAddress(lb, "messagepoksi") CallWindowProc pa, Me.hWnd, "Hello !", ByVal 0&, ByVal 0& FreeLibrary lb End Sub
mutta eipä workkinu
Tuo tapa toimis perinteisille DLL:lle, VB kuitenkin tekee vain ActiveX-DLL:ä, joita käytetään huikan toisella tavalla. Ks. tuo mun esimerkkiprojekti muutama viesti ylempänä.
Niin mut siis tuo kutsuu sun projektin sisäisi dll kirjastoja mutta kun pitäisi saada sellanen että kuka vaan voi tehä dll ja minkälaisen vaan ja sitten se liitetään pluginina koitin tehdä oman dll ja pistää tuon ohjelman lataamaan sitä ja kutsumaan functiota sieltä mutta valitti vaan ettei sellasta objectia ole
Pari kysymystä:
-Menin ihan sekaisin, siis mikä nyt oli ton Plug-In:in tarkoitus ja toimita periaate?
-Miksi toi PerusMuistio ohjelma ei näytä dll tiedostoja lisäosat kohdassa jos dll tiedostoja on hakemistossa vain yksi?
petrinm kirjoitti:
-Miksi toi PerusMuistio ohjelma ei näytä dll tiedostoja lisäosat kohdassa jos dll tiedostoja on hakemistossa vain yksi?
Ai, tuokaan ei ollut winen vika :)
Pitääpäs kokeilla tuota vielä uusiksi.
Itse päädyin muokkaamaan tuota koodia sen verran, että se hakee siihen listaan ne pluginit tekstitiedostosta.
Mun firefoxi ei ainakaan suostu lataamaan tuota perus muistiota kun klikkaan linkkiä niin se ohjaa tälle sivulle takaisin eikä toiminut sellattiinkaan että laitoin urlin osoteriville =/
PerusMuistio käyttää plug-ineihin ActiveX-DLLiä, jotka pitää reksiteröidä järjestelmään ennen käyttöä. VB 6.0 osaa itse reksiteröidä DLLn käännöksen yhteydessä, muuten sen joutuu tekemään käsin jollain ohjelmalla, jonka nimeä en muista. Se kuitenkin tulee Windozen mukana.
Ohjelma ei siis listaa lisäosaa, koska sitä ei ole rekisteröity järjestelmään.
petrinm, plug-init ovat ohejelmiin tehtäviä lisäosia, joille voidaan laittaa tehtäväksi oikeastaan mitä tahansa. Avain toimivaan plug-in järjestelmään on hyvin suunniteltu rajapinta ohjelman ja lisäosien välillä.
tesmu, yritä mennä lataamaan pääsivun kautta.
Muistaakseni Spybot jai joku semmonen teki Imunize-toiminnossan sen, että klikatessa freewebsiin menevää linkkiä siirtymistä ei tapahdu, vaan osoite pitää kopioida osoiteriville.
Mulla tuli tällänen erroori
---------------------------
PerusMuistio
---------------------------
Run-time error '429':
ActiveX component can't create object
---------------------------
OK
---------------------------
mikähän mahtaa olla vikana
Edit:
Sain toimimaan
unohdin rekisteröidä sen systeemiin ^^
Joo elikkäs tuli vastaan toinen ongelma
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long Public Function Kirjota(Avain As String, Määrite1 As String, Määrite2 As String, Tiedosto As String) On Error Resume Next Dim x As Long x = WritePrivateProfileString(Avain, Määrite1, Määrite2, Tiedosto) End Function Public Function PluginName(Nam As String) As Object Dim strCreateString As String Dim vObj As Object strCreateString = MakeObjectFromPath(Nam) Set vObj = CreateObject(strCreateString) Set PluginName = vObj End Function Public Function HaeTiedot(Path As String) Dim onko As String Shell "c:\windows\system32\regsvr32 " & Path, vbHide Wait 5 Dim tyyppi As String Dim nimi As String Dim tekijä As String Dim versio As String Dim tulos As Variant Dim vObj As Object Set vObj = PluginName(Path) tyyppi = vObj.Tyyp nimi = vObj.nimi tekijä = vObj.tekija versio = vObj.versio Kirjota "Tiedot", "tyyppi", tyyppi, App.Path & "\" & Path & ".ini" Kirjota "Tiedot", "nimi", nimi, App.Path & "\" & Path & ".ini" Kirjota "Tiedot", "tekijä", tekijä, App.Path & "\" & Path & ".ini" Kirjota "Tiedot", "versio", versio, App.Path & "\" & Path & ".ini" Kirjota "Tiedot", "onko", "1", App.Path & "\" & Path & ".ini" Set vObj = Nothing End Function
eli mulla on tolasta koodia siinä tuo kirjota functio kirjottaa ini tiedostoon asetukset u know mut
vb valittaa tästä rivistä
Set vObj = CreateObject(strCreateString)
valittaa että activeX ei voi luoda
Katsastappa edellinen viesti.
Latasin pää sivun kautta
olen rekisteröinyt dlln
Mutta silti valittaa
ja kuten huomaat tuossa koodissa se rekisteröi sen jo
Shell "c:\windows\system32\regsvr32 " & Path, vbHide
Ei sitä DLLää joka kerta tarvi rekisteröidä.
tuo haetiedot functio käydään läpi jos ini tiedostosta ei löydy pluginin tietoja
Blaze kirjoitti:
Ei onnistu noin, mutta voit luoda sille DLL:ssä olevalle luokalle eventin ja laitat sen emo-ohjelman vaihtamaan tuon tekstin tuon eventin tapahtuessa.
Aika noobie kysymys, mutta kuinkas se tapahtuukaan? :D
Ohjelma:
Dim WithEvents Muuli As MunLuokka Private Sub Muuli_HassuEventti() 'Tämä tapahtuu kun Muulissa tapahtuu HassuEventti End Sub
MunLuokka:
Public Event HassuEventti() Private Sub JokuSubi If JokuEhto Then RaiseEvent HassuEventti End Sub
Aihe on jo aika vanha, joten et voi enää vastata siihen.