Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 7 odgovora
  • 2.479 pregleda

Najnovija ↓

PluginManager i poziv DLL-ova iz njega 17.01.2010. u 13:15 · pre 204 meseca
izmenjeno 1 put, poslednji put reiser 17.01.2010. u 13:25
  1. reiser17.01.2010. u 13:25zapis iz teksta poruke
#1
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 ?
Re: PluginManager i poziv DLL-ova iz njega 17.01.2010. u 19:00 · pre 204 meseca #2
> 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).
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: PluginManager i poziv DLL-ova iz njega 22.01.2010. u 08:15 · pre 204 meseca
izmenjeno 1 put, poslednji put reiser 22.01.2010. u 09:27
  1. reiser22.01.2010. u 09:27zapis iz teksta poruke
#4
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").
Re: PluginManager i poziv DLL-ova iz njega 22.01.2010. u 11:47 · pre 204 meseca #5
> 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.
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: PluginManager i poziv DLL-ova iz njega 22.01.2010. u 13:23 · pre 204 meseca #6
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.
Re: PluginManager i poziv DLL-ova iz njega 22.01.2010. u 15:17 · pre 204 meseca #7
> 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

Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: PluginManager i poziv DLL-ova iz njega 22.01.2010. u 16:13 · pre 204 meseca #8
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 :)
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme