[ reiser @ 17.01.2010. 12:15 ] @
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]
[ savkic @ 17.01.2010. 18:00 ] @
> 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).
[ reiser @ 17.01.2010. 19:45 ] @
Da to je to, hvala puno.
[ reiser @ 22.01.2010. 07:15 ] @
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]
[ savkic @ 22.01.2010. 10:47 ] @
> 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.
[ reiser @ 22.01.2010. 12:23 ] @
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.
[ savkic @ 22.01.2010. 14:17 ] @
> 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

[ reiser @ 22.01.2010. 15:13 ] @
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 :)