Newsgroup: it.comp.lang.delphi
Titolo: Utilizzo di DLL

Salve a tutti
E' possibile creare programmi memorizzati sotto forma di DLL invece
che EXE e richiamarli da un programma EXE che funge da menů?
Se si, quali comandi si usano per caricare e scaricare le DLL?
Ci sono accorgimenti particolari?
Vorrei che selezionato un punto a menů venisse caricata la DLL
di nome X situata nella directory Y; terminato il programma la DLL
dovrebbe venir scaricata.
Il tutto dovrebbe sfruttare una unica connessione con il DB visto che
l'unica
TSession verrebbe caricata dal menů.
Attualmente tutti i punti a menů sono degli EXE che si connettono al DB
singolarmente ma il risultato č una applicazione piuttosto lenta nel
passaggio da un programma ad un altro.
Il problema č che ho un grosso applicativo standard spesso personalizzato
in alcuni punti; vorrei poter scegliere se caricare una DLL standard o
personalizzata.
Grazie
--
--------------------------------------------
Mirko Guidolin
COMUNE DI RESANA
Provincia di Treviso
Servizio Elaborazione Dati
--------------------------------------------
levare eventuali underscore per rispondere

Le DLL hanno il vantaggio di essere caricate una volta sola e fornire
assistenza ai programmi che ne fanno richiesta oltre a poter essere scritte
con linguaggi differenti.
L' uso principale dovrebbe consistere nel racchiudere nella DLL funzioni
comuni a tutti gli eseguibili risparmiando risorse e tempi di attesa a
run-time.
Se devi risolvere problemi di lentezza dei tuoi eseguibili nel caricamento,
potresti individuare tutto ciò che è condivisibile e trasferirlo nella/nelle
DLL. Il caricamento del programma principale sarà altrettanto lento, ma poi
gli altri eseguibili avranno già a disposizione le routine duplicate nei
propri spazi di indirizzamento...
I DPL/BPL  di Delphi sono sostanzialmente DLL...
I libri di Marco Cantù sono un buon approccio per l' argomento.
Marco Soravia.

 Grazie
L'idea della DLL č ottima...io sto sviluppando un software che sfrutta DLL e
mi trovo bene ma attualmente scarico le DLL solo all'uscita del programma
principale.

 principale.
Dalla tua esperienza, credi sia un buon metodo per migliorare i tempi di
risposta?
Grazie ancora.


Questa è solo un' idea quindi prendila come tale.
Perchè non provi ad usare la tecnologia DCOM? Potresti costruirti un server
che crea dinamicamente i dataset necessari come oggetto DCOM e poi
connetterti attraverso TDCOMConnection. In questo modo centralizzi l
'accesso ai database lasciando che ogni applicativo/DLL si connetta quando
ne ha bisogno.
[Non so se le DLL possono farlo direttamente ma credo di si] oltre a fornire
metodi standard di controllo transazioni, congruità, etc. Il programma
principale a questo punto dovrebbe fornire le funzioni di lancio dei singoli
moduli per poi lasciare che il modulo stabilisca il contatto e <parli> con
il server utilizzandone le funzioni/metodi.
Tempo fa ho scaricato dalla sezione comunity della Borland un progetto
Server DCOM con sorgenti chiamato DynamicDataSetService che crea
dinamicamente i dataset [TQuery] gestendo le relazioni Master/Detail se ve
ne sono. Forse può esserti utile.
Ma ripeto, è solo un' idea.
Marco Soravia.

 risposta?
SI !
Ciao
Solid Snake

Ora inizio a sbatterci la testa, vediamo cosa ne salta fuori.
Grazie a tutti e ciao


 dinamicamente la libreria.
La FreeLibrary non è più necessaria sotto Win32...
Questo perchè è il sistema che si occupa del "reference counting" (simile a
quello di COM se vogliamo) e libera una DLL quando e solo se non è
utilizzata da nessuno...
[quindi non ci sono + problemi di sovraccarico per
"caricamento/scaricamento"]
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply

 "caricamento/scaricamento"]
Quindi, stando a quello che dici, potrei caricare le DLL con LoadLibrary e
mai fare la FreeLibrary ?

 mai fare la FreeLibrary ?
Per quel che ne so io sì...
Il sistema dovrebbe essere questo: quando la carichi lui incrementa un
"reference counter" [questo è scritto chiaro sulla guida di Win32] per
permettere di sfruttare una eventuale istanza già caricata senza caricarne
una nuova ogni volta...
L'handle della DLL è un oggetto kernel quindi viene liberato quando se ne
libera l'handle con la CloseHandle n volte se lo si è istanziato n volte...
La CloseHandle che viene fatta sul processo quando termina si riflette anche
sull'handle della DLL [probabilmente perchè sono ereditati (c'è un flag
apposito da qualche parte) ]...
Il funzionamento interno dovrebbe essere questo, so per certo che _puoi_
evitare la FreeLibrary sotto Win32 (se poi ti serve scaricarla subito sei
libero di chiamarla).
Se ritrovo il testo su cui ho letto la spiegazione vado a ripassarla e
magari controllo di non aver scritto vaccate... ;-)
