Gå til innhold

Anbefalte innlegg

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
Videoannonse
Annonse

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

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

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

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

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
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

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!

 

:D

Lenke til kommentar

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! ..... :D

Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...