Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

PluginManager i poziv DLL-ova iz njega

[es] :: Pascal / Delphi / Kylix :: PluginManager i poziv DLL-ova iz njega

[ Pregleda: 1824 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon PluginManager i poziv DLL-ova iz njega17.01.2010. u 12:15 - pre 173 meseci
Imam neki program koji funkcionise po sistemu pluginova - ima PluginManager klasu koja organizuje plugine, njihovo ucitavanje i pozivanje. Program sadrzi jednu strukturu u kojoj se nalaze svi objekti koji bi trebalo da se koriste od strane plugina i programa zajedno i ja pokazivac ka toj strukturi prosledjujem pluginu. Evo primera plugina:

Plugin

Evo i strukture koja se koristi od glavnog programa i prosledjuje pluginu po potrebi:

SharedData

Dakle function Main(shd : pointer) : Integer; stdcall; je funkcija koja bi trebala da se pozove iz glavnog programa, medjutim program mi se crashuje kad to pokusam. Pozivam je sa MainFunc(@SHD) gde je SHD tipa TSharedData, a MainFunc je prototip funkcije i adresu do nje sam dobio sa LoadLibrary() i GetProcAddress(). I sto je najzanimljivije, poziv funkcije prodje, tj funkcija u pluginu se izvrsi i ja dobijem zeljeni output, ali se program odmah nakon toga crashuje.

//edit
Mislim da sam nasao gde lezi problem - kad izbacim iz uses liste ReiIRC i ReiStringArray, tj kad u DLL-u ne includujem nista onda poziv funkcije prolazi sasvim fino. Medjutim, meni je potrebno da koristim ReiIRC iz DLL-a kako bih mogao da iz plugina pisem po IRC-u. Kako da ovo izvedem ?

[Ovu poruku je menjao reiser dana 17.01.2010. u 13:25 GMT+1]
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: PluginManager i poziv DLL-ova iz njega17.01.2010. u 18:00 - pre 173 meseci
> Dakle function Main(shd : pointer) : Integer; stdcall; je funkcija koja bi trebala da se pozove iz glavnog programa, medjutim program mi se
> crashuje kad to pokusam. Pozivam je sa MainFunc(@SHD) gde je SHD tipa TSharedData, a MainFunc je prototip funkcije i adresu
> do nje sam dobio sa LoadLibrary() i GetProcAddress(). I sto je najzanimljivije, poziv funkcije prodje, tj funkcija u pluginu se izvrsi i ja dobijem
> zeljeni output, ali se program odmah nakon toga crashuje.

Ne znam kako izgledaju te ReiXXX stvari koje koristiš i kako inicijalizuješ TSharedData u glavnom programu, ali je verovatno problem u memory manageru, ubaci ShareMem kao prvi unit u oba projekta (pogledaj komentar koji se dobija kada iz Delphija odabereš pravljenje novog dll projekta).
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: PluginManager i poziv DLL-ova iz njega17.01.2010. u 19:45 - pre 173 meseci
Da to je to, hvala puno.
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: PluginManager i poziv DLL-ova iz njega22.01.2010. u 07:15 - pre 173 meseci
Da ne otvaram novu temu, pojavio se novi problem:

Odradio sam plugin manager i sve radi dobro, ali sada imam jedan plugin koji kada se loaduje, pokrene thread koji radi nesto u pozadini sve dok se ne pozove UnloadPlugin(). I sve to radi, osim prilikom poziva UnloadPlugin() program pukne. Plugin se unloaduje i odmah nakon toga glavni program padne. Nista se ne poziva iz plugina nakon sto je on unloadovan, znaci samo se loaduje i unloaduje, bez ikakvih poziva funkcija unutar njega, tako da nije do toga problem.

Evo plugin managera: http://pastebin.com/m68414fc7

Dakle, svaki plugin mora da ima Info(), Main(), Load() i Unload() funkcije, koje se pozivaju po potrebi. (Load i Unload poziva sam PluginManager respektivno prilikom loada i unloada, main i info se pozivaju "rucno").

[Ovu poruku je menjao reiser dana 22.01.2010. u 09:27 GMT+1]
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: PluginManager i poziv DLL-ova iz njega22.01.2010. u 10:47 - pre 173 meseci
> ali sada imam jedan plugin koji kada se loaduje, pokrene thread koji radi nesto u pozadini sve dok se ne pozove UnloadPlugin(). I sve to radi,
> osim prilikom poziva UnloadPlugin() program pukne. Plugin se unloaduje i odmah nakon toga glavni program padne. Nista se ne poziva
> iz plugina nakon sto je on unloadovan, znaci samo se loaduje i unloaduje, bez ikakvih poziva funkcija unutar njega, tako da nije do toga problem.

Gde dolazi do pucanja u dllu ili glavnom programu? Da li imaju iste calling konvencije? Pusti program (ili dll) kroz debugger i lociraj gde tačno nastaje greška.

 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: PluginManager i poziv DLL-ova iz njega22.01.2010. u 12:23 - pre 173 meseci
Ne znam kako da ga debugujem nazalost.. Sve funkcije u DLL-u imaju stdcall convention. Kad pokusam unload, javi mi "access vilation at 0x772a8c72: write of address 0x2280fe4" i podigne debugger ili sta god je ona stvar gde je gomila asm koda :) Prazan plugin se lepo loaduje/unloaduje, tj plugin sa praznim funkcijama. Dok kad pokusam sa pluginom koji includuje drugu klasu koja kreira thread, program puca prilikom pokusaja unloadovanja.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: PluginManager i poziv DLL-ova iz njega22.01.2010. u 14:17 - pre 173 meseci
> ne znam kako da ga debugujem nazalost..

Dll? Uglavnom je bilo dovoljno u dll projektu u run parameters i host application upisati glavni projekat, eventualno po potrebi treba da promeniš output dir dll u dir gde je i exe ili y system32. Pogledaj i ove linkove:
http://www.delphifaq.com/faq/delphi/delphi_ide/f162.shtml
http://www.microsystools.com/d.../articles/delphi-dll-debug.php
http://stackoverflow.com/quest...3/how-to-debug-a-dll-in-delphi


 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: PluginManager i poziv DLL-ova iz njega22.01.2010. u 15:13 - pre 173 meseci
Problem je bio u thread klasi, tj ja sam pomocu thread klase pokretao jednu funkciju koja je pravila infinite loop. I onda prilikom unloada DLL-a nisam mogao da izadjem iz threada prethodno pa je zato pucao :) Anyways, sad radi, a i naucio sam nesto novo, kako da debugujem DLL. Thx :)
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: PluginManager i poziv DLL-ova iz njega

[ Pregleda: 1824 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.