michaenh Skrevet 27. august 2003 Del Skrevet 27. august 2003 Hei. Programmet mitt henter inn statiske kall av dll funksjoner. Jeg har flere dll'er. Disse er predeklarert.. Alt fungere, men jeg ser i CPU Memory at hver gang jeg innhenter en dll form så øker minnet. Dette er ikke særlig bra. Jeg har liksom x antall dll som blir hentet inn og hver gang så øker det selv om jeg henter inn den samme dll formen påny. Åssen skal en frigjøre dll'en(dll formen)? Det hjalp ikke selv om jeg prøvde med FreeLibrary(xDllForm.Handle); hm... merkelig ikke sant... Er dette på grunn av jeg har predeklarert dll'ene og tilhørende funksjoner? Lenke til kommentar
Format71 Skrevet 27. august 2003 Del Skrevet 27. august 2003 Du må nok se litt på rutina di som blir kalt opp når du henter formen fra dll-fila. Eks. library DLLForm; uses forms; function GetDLLForm: TForm; begin result := TForm.Create( )... //Her opprettes en ny form hver gang! end; exports GetDLLForm; begin end; Et bedre eksempel: library DLLForm; uses forms; var FForm: TForm; functoin GetDLLForm: TForm; begin if not assigned(FForm) then FForm := TForm.Create( ); result := FForm; end; exports GetDLLForm; begin end; Det du i tillegg må passe på er å få frigjort formene som er opprettet. Dette kan gjøres i en finalization-block i en unit, eller man kan lage en ny exitproc for dll'en. -Vegar Lenke til kommentar
Format71 Skrevet 27. august 2003 Del Skrevet 27. august 2003 En annen ting jeg kom til å tenke på... Du kan jo la alle dll-filene dine eksportere en initialiserings- og en finaliseringsrutine som du kan kalle opp fra hovedprogrammet ved begynnelse og slutt. Da kan du legge frigjøring i finaliseringsrutinen. Men hvorfor har du egentlig lastet dll'ene statisk? Bruker du alltid alle? Er jo litt kjekt å kunne legge til nye 'plugins' uten å måtte rekompilere hovedprogrammet... -Vegar Lenke til kommentar
michaenh Skrevet 27. august 2003 Forfatter Del Skrevet 27. august 2003 Når jeg bruker koden: library DLLForm; uses forms; var FForm: TForm; functoin GetDLLForm: TForm; begin if not assigned(FForm) then FForm := TForm.Create( ); result := FForm; end; exports GetDLLForm; begin end; Dette dokkes på en hoved GUI og jeg får problemer med tab og setfocus funksjonalitet. Du må nok se litt på rutina di som blir kalt opp når du henter formen fra dll-fila Enig i deg der.. jeg har kodet litt annerledes.. skal gi en snippet imorgen. Men hvorfor har du egentlig lastet dll'ene statisk? Bruker du alltid alle? Nei jeg bruker ikke alltid alle. Du sier noe der... hvorfor skal dem være statiske.. hm.. Liker egentlig heller ikke tanke på at det er statiske deklareringer.. Jeg har ca.7 dll'er og ca.40 prosedyre eller funksjoner tilsammen. Har da ikke tatt med eventer i dll'ene. Du kan jo la alle dll-filene dine eksportere en initialiserings- og en finaliseringsrutine som du kan kalle opp fra hovedprogrammet ved begynnelse og slutt. Da kan du legge frigjøring i finaliseringsrutinen. Kan du gi et eks. Mange takk i forveien. Jeg bøyer meg i støvet for eksperter... michael Lenke til kommentar
michaenh Skrevet 28. august 2003 Forfatter Del Skrevet 28. august 2003 Her er et lite eks. //Systemform.dll som skal vises. function ShowDllSystemForm(hApp, hPanel: THandle): THandle; stdcall; begin Application.Handle := hApp; if SystemForm = nil then SystemForm := TSystemForm.Create(Application); windows.SetParent(SystemForm.Handle, hPanel); SetWindowPos(SystemForm.Handle, 0, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOZORDER); Result := SystemForm.Handle; SystemForm.Show; end; Jeg har også en funksjon for å frigjøre formen og en for å lukke formen.. Her er det en for å lukke: //frigjøre formen. function SystemFormFree: boolean; stdcall; begin if SystemForm <> nil then SystemForm.Free; Result := True; end; I hoved GUI blir dette kalt slik: var DllForm: THandle; DllForm := ShowDllSystemForm(Application.Handle, MainPanel.Handle); Dersom jeg kaller på funksjonen for å lukke formen da mister jeg helt kontakt med dll'en. Ellers så øker CPU memory hver gang jeg innhenter dll formen. - Noen ideer eller... ? - Hva kan gjøres? - Bør jeg kanskje dropper dll'er og bruker frames istedet? - Kanskje jeg bør jobber med dynamiske kall istedenfor statiske? Men da må jeg lage nesten ca. 40 identiske funksjoner for å kalle inn de 40 funskjoner i de forskjellige dll'ene. Lenke til kommentar
michaenh Skrevet 28. august 2003 Forfatter Del Skrevet 28. august 2003 En liten skrive feil.. <lukke forme> jeg mente frigjøre formen... Lenke til kommentar
Format71 Skrevet 29. august 2003 Del Skrevet 29. august 2003 Det er litt vanskelig å si noe som helst ettersom jeg ikke har sett koden hele koden din. Har selv nettopp brukt en halv dag på å knote med en rar feil vedrørende plugins... Viste seg at man absolutt ikke skalle bruke ShareMem i mitt tilfelle... Ja - ja... Hvis det er slik at alle plugin-dll'ene har samme interface ville jeg ha laget meg en hjelpeklasse for å håndtere dynamisk lasting. f.eks. noe i retningen: TProcType1=procedure(EnOg, Annen, Parameter: string); TProcType2=function(Something: integer): boolean; TPlugInHelper = class(TObject) private FPluginName: string; FPluginHandle: THandle; FLoaded; FProcAddr1: TProcType1; FProcAddr2: TProcType2; osv... public constructor Create(APlugIn: string); destructor Destroy; override; function Load: boolean; procedure UnLoad; property Loaded: boolean read FLoaded; property Proc1: TProcType1 read FProcAddr1; property Proc2: TProcType2 read FPRocAddr2; end; Load-functionen din vil da kalle LoadLibrary og sette ProcAddrXXX pekerne. Da kan du også lage deg en 'plugin-manager' som skanner igjennom en gitt pluginkatalog og fyller opp en liste med TPluginHelper-instanser. Når du så trenger å bruke en gitt plugin kan du finne den igjen i lista (assign en unik id, bruk indexen eller slå opp på navn - du finner sikker på noe) og sjekke om dll'en allerede er lastet. eks. procedure BrukEnPlugin; var plug: TPluginHelper; begin plug := PluginListe['SystemPlugin']; if plugin <> nil then begin if not plugin.loaded then plugin.load; Plugin.Proc1('en', 'to', 'tre'); end; end; Du ser tegninga? Lenke til kommentar
Format71 Skrevet 29. august 2003 Del Skrevet 29. august 2003 Her er et lite eks. Dersom jeg kaller på funksjonen for å lukke formen da mister jeg helt kontakt med dll'en. Ellers så øker CPU memory hver gang jeg innhenter dll formen. - Noen ideer eller... ? - Hva kan gjøres? - Bør jeg kanskje dropper dll'er og bruker frames istedet? - Kanskje jeg bør jobber med dynamiske kall istedenfor statiske? Men da må jeg lage nesten ca. 40 identiske funksjoner for å kalle inn de 40 funskjoner i de forskjellige dll'ene. Bare et tips... Du vet du kan debugge både en applikasjon og en dll samtidig med projectgroups... -Vegar Lenke til kommentar
michaenh Skrevet 29. august 2003 Forfatter Del Skrevet 29. august 2003 Hei Format! :smile: Ja jeg vet det med bpg for å debugge samtidig... Det høres bra ut med plugins og loadlibrary... Jeg skal ta og prøve på det en dag (snart)... Angående sharemem... jeg bruker fastsharemem. Mye raskere og bedre.. Jeg hadde også en del problemer med sharemem.. Fast sharemem er gratis og ligger ute i verden... :wink: Takk for hjelpen så langt... skal prøve å implementere plugins metoden din... Takk! Takk! Lenke til kommentar
michaenh Skrevet 30. august 2003 Forfatter Del Skrevet 30. august 2003 Case close; saken er løst... fant ut problemet.. Takk ellers for hjelpen Format! Lenke til kommentar
Format71 Skrevet 31. august 2003 Del Skrevet 31. august 2003 Så hva var problemet/løsningen? Blir jo nyskjerrig når du spør sånn... :wink: Lenke til kommentar
michaenh Skrevet 1. september 2003 Forfatter Del Skrevet 1. september 2003 Hei igjen.. Problemet her var at jeg hadde glemt å frigjøre noen objekter. Det er slik at jeg har en TADOQuery og en dynamisk funksjon for å skrive til og hente data fra database, og den hadde jeg glemt å frigjøre... ikke bra.. :o Så det var ikke dll'er som var problemet.. men skal etterhvert muligens implementere dll plugins som du foreslo... Men fortsatt er det litt rart med keyboard eventer(tab) når dll former dokkes inn... Vurdere muligens å gå over til frames eller pakker istedenfor dll. SKÅL! ..... Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå