Gå til innhold

Anbefalte innlegg

Hei.

 

Format71 er du der.. :D:p

 

Nå har jeg gått over fra statiske dll kall til dynamiske plugins.

Men når jeg prøver å frigjøre dll'en med FreeLibrary(Handle) etter at jeg har brukt funksjonen.. så tryner programmet med Access Violition, etc

 

Her er min prosedyre:

procedure Test;
var
i: integer;
Module: THandle;
msg: TPlugProc;
begin
i:=0;
with PlugList do
 while i<Items.Count do
  begin
    Module:=SafeLoadLibrary(PChar(plugInsDir+Items[i]));
   try
     @msg:=GetProcAddress(Module,'Melding');
     if @msg<>nil then
       msg;
   finally
    if Module<>0 then
      FreeLibrary(Module);
   end;
  i:=i+1;
  end;
end;

 

Dette er når jeg har med sharemem eller fastsharemem..

Men derimot hvis jeg utelater sharemem i dll'ene så fungere det..

Har du noe anelse hvorfor?

Bør jeg ikke ha med sharemem??

 

Takk på forhånd! Du er best :thumbs:

 

michael

Lenke til kommentar
Videoannonse
Annonse

Der har du problemet. Dersom du bruker ein "memory manager" som ShareMem, bør du sørge for at det er samme versjon av den du bruker. Difor vil det ikkje gå spesielt bra dersom du bruker ShareMem i den eine, og FastShareMem i den andre. Egentlig bør du prøve å halde deg unna bruk av desse i det heile, så kan dei som programmerer i andre språk òg bruke dine DLL-filer. :)

Lenke til kommentar

Jo, da. Jeg er her, men må inrømme at dette er et punkt jeg har slitt litt med uten å ha funnet noe godt svar på problemet.

 

Kilogram kommer med et godt råd: Hold deg unna... :cry:

 

ShareMem er nødvendig når at du ønsker å allokere minne i en modul og frigjøre det i en annen eller utveksle longstrings (ansistrings) eller dynamiske arrays mellom modulene. Dersom du sørger for å holde deg unna det skulle ting gå bra uten ShareMem.

 

Det kan jo være flere alternativer her, men det mest opplagte er jo å allokere og frigjøre minne i samme modul samt å holde seg unna ansistrings og dynamiske arrays i grensesnittet mellom modulene. Selv bruker vi ofte interface's og widestrings for å snakke på tvers av moduler og det ser ut til å gå bra.

 

Lykke til,

-Vegar

Lenke til kommentar

Hei hei..

 

Takk takk folkens..

 

Kilogram:

Der har du problemet. Dersom du bruker ein "memory manager" som ShareMem, bør du sørge for at det er samme versjon av den du bruker. Difor vil det ikkje gå spesielt bra dersom du bruker ShareMem i den eine, og FastShareMem i den andre.

 

Det er feil fordi jeg hadde brukt Sharemem gjennom hele løpet på et lite test projekt. Jeg brukte ikke den ene og den andre..

Deretter gikk jeg over FastSharemem på hele prosjektet da fungerte det.

 

Format71:

ShareMem er nødvendig når at du ønsker å allokere minne i en modul og frigjøre det i en annen eller utveksle longstrings (ansistrings) eller dynamiske arrays mellom modulene.

 

Det trenger jeg.. sender stadig objekter mellom modulene..

 

Format71:

Selv bruker vi ofte interface's og widestrings for å snakke på tvers av moduler og det ser ut til å gå bra.

 

Har du et lite eks.? takk.. :)

Ellers så skal jeg se på det.. :)

 

Flott! Format71 og Kilogram.. Mange takk!

 

mvh.

mha

Lenke til kommentar

En ting er å sende objekter mellom modulene, men oppretter du dem i en modul og frigjør dem i en annen? Er også usikker på om oppretting av objekter bruker new eller getmem. (orker ikke sjekke så tidlig på morgenen...)

 

Har dessverre ikke noe lite eksempel på bruk av interface og widestring, men det skulle være rimelig greit å gjennomføre. Lag det et interface som tilsvarer eksport-rutinene du har i dag. Lag deg så en klasse som implementerer dette interfacet. Lag en eksportfunksjon for å hente peker tli interfacet.

 

Det du må passe på er å overstyre addRef og release slik at klassen ikke frigjøres automatisk i hytt og gevær... Det er også greit å merke seg at det er ingen grunn til å implementere fullverdige com-objekter selv om man bruker interface.

 

-Vegar

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