Newsgroup: it.comp.lang.delphi
Titolo: DLL e Memoria

Ciao a tutti,
    sto pensando di aggiungere alle mie applicazioni dei moduli opzionali 
realizzabili tramite librerie dll condivise. Per fare questo ho trovato su 
internet un po' di esempi che permettono di creare classi definite in file 
dll, ma purtroppo mi sono accorto che (probabilmente per qualche mia 
mancanza), la memoria delle classi create non viene completamente liberata. 
Vale a dire che facendo partire più volte la stessa procedura, senza 
riavviare l'applicazione, la memoria utilizzata dal programma aumenta 
costantemente. Sarò grato a chiunque riesca a darmi qualche suggerimento.
// Ecco un esempio della procedura che richiama il modulo dll:
procedure TForm1.StartTest
type
  TCreateFunc=function(AOwner: TComponent): TForm;
var
  lib: Integer;
  form: TForm;
begin
  lib:=LoadLibrary('test.dll');
  form:=TCreateFunc(GetProcAddress(lib,'FormCreate'))(self);
  form.ShowModal;
  form.Free;
  FreeLibrary(lib);
end;
// Questa, invece è la unit contenuta nel modulo dll
unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
type
  TFormTest = class(TForm)
  end;
var
  FormTest: TFormTest;
implementation
{$R *.dfm}
function FormCreate(AOwner: TComponent): TForm;
begin
  Result:=TFormTest.Create(AOwner);
end;
exports
  FormCreate;
end.

 [...]
Credo che i *package* possano essere uno strumento più efficace e sicuro 
per la tua esigenza.
Leggi qui:
http://delphi.about.com/od/objectpascalide/a/bpl_vs_dll.htm
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 
http://delphi.about.com/od/objectpascalide/a/bpl_vs_dll.htm
Avevo già letto questo articolo, ma tuttavia mi sono imbattuto nel problema 
che, usando gli esempi utilizzati con le funzioni 
LoadPackage/RegisterClass/GetClass, la mia applicazione dovesse essere 
compilata con l'opzione "Build with runtime packages" e, correggetemi se 
sbaglio, questo significa che devo distruibire la mia applicazione con tutti 
i package (bpl) utilizzati, che senza tale opzione verrebbero inclusi 
nell'eseguibile stesso? 

 nell'eseguibile stesso? 
Esattamente. Ma non è che con la DLL puoi fare comunque diversamente, se 
fai passare oggetti della VCL dall'applicazione alla libreria e 
viceversa, con il semplice fatto che con i "packages" questa rete di 
dipendenze è "by design" nel formato del package stesso, mentre con le 
DLL devi compilare con i runtime package facendo molta più attenzione 
(ad esempio, potresti rischiare di lasciare nell'applicazione e nella 
libreria compilate codice di classi utilizzate da entrambe, incorporato 
nei file generati, con una miriade di effetti collaterali).


 miriade di effetti collaterali).
Questo concetto non si applica anche ai "runtime packages"?
Ultima domanda: visto il mio problema originale (aumento di memoria 
richiamando più volte la stessa libreria) sei a conoscenza di un modo per 
poter deallocare completamente la memoria utilizzata da un package o da una 
libreria al momento della sua distruzione? 

 libreria al momento della sua distruzione? 
Prima definisci l'architettura e i tipi di dati che la DLL deve passare 
all'applicazione e viceversa; poi, in base a quanto già detto, usa le 
DLL o i package BPL a seconda del caso in cui ti ritroverai.
Per il rilascio delle risorse, tutto dipenderà poi da quale delle due 
soluzioni verrà adottata.


 soluzioni verrà adottata.
Premesso che sto rivalutando l'idea dei package in delphi, ancora non riesco 
a capire dove sbaglio nell'utilizzo delle librerie, perché la sequenza 
dovrebbe essere: LoadLibrary -> GetClass -> FreeAndNil -> UnloadLibrary, ma 
da qualche parte perdo riferimenti ad oggetti. 

 da qualche parte perdo riferimenti ad oggetti. 
Esiste una famiglia di funzioni specifica per i package (benché siano 
versioni "particolari" di una libreria DLL, in fondo).
Leggi questo articolo:
http://dn.codegear.com/article/27178


 
http://dn.codegear.com/article/27178
Articolo molto interessante. Farņ nuovamente delle prove sull'utilizzo dei 
package prima di passare all'integrazione pratica nella mia applicazione.
Grazie dell'aiuto,
    Antonio