Newsgroup: it.comp.lang.c++
Titolo: Da exe a DLL

Salve,
uso il BCB 3
ho un progetto con diverse form che compila in un solo
exe, ora io vorrei compilare ogni form in una dll
differente e caricarla poi dinamicamente nel mio
eseguibile. Come devo fare?
Grazie,
Dome
--
http://members.it.tripod.de/beelsoft/

eseguibile. Come devo fare?
Se non usi le classi di Borland:
- copi le dialog box, le risorse, la window procedure e tutto quello che
serve in un nuovo progetto di tipo DLL (non ho idea di come si faccia con
Borland, ma sicuramente si potra' fare)
- scrivi una funzione di interfaccia in "C" in modo che possa essere
richiamata dall'esterno, che apra la dialog box ecc.
- nel programma principale usi "LoadLibrary" e "GetProcAddress" per caricare
la libreria e trovare la funzione che ti interessa chiamare
- alla fine usi "FreeLibrary" per scaricare la libreria.
Se usi anche OWL (che non conosco, ma ritengo "simile" a MFC):
- copi anche le classi di gestione delle finestre
- cerchi in tutta la documentazione se serve fare qualcosa quando si
utilizza OWL in una DLL :)
So di averti dato solo delle indicazioni un po' superficiali, ma spero ti
possano essere d'aiuto comunque.
Ciao,
Angelo.

Grazie per l'aiuto, sono riuscito ad esportare ed
importare funzioni ma non riesco a farlo con le classi.
Che differenza c'e' tra usare la dll includendo i file
LIB e i relativi .h e usare LoadLibrary?
Bye,
Dome
--
http://members.it.tripod.de/beelsoft/
--



La stessa differenze che c'e' tra Load-Time dynamic linking
e tra Run-Time dynamic linking.
Con l'opzione *.h + *.LIB la DLL viene staccata (detached) dal
processo quando questo viene chiuso. Con l'opzione
LoadLibrary/GetProcAddress si e' liberi di staccare la DLL quando
non serve piu' (FreeLibrary).

LIB e i relativi .h e usare LoadLibrary?
Prima differenza:
- se usi un .LIB la DLL viene caricata quando il programma parte (o quando
serve ad es. con il VC++6.0) ma - piu' importante - associ il tuo programma
ad una determinata DLL, quindi ad es. se usi PIPPO.LIB avrai una PIPPO.DLL;
durante l'esecuzione del programma non potrai decidere di utilizzare
PIPPO2.DLL al posto di PIPPO.DLL
- se usi "LoadLibrary" la DLL viene caricata quando lo richiedi tu e puoi
caricare quella che vuoi
Il secondo metodo e' particolarmente indicato per caricare versioni diverse
di una stessa DLL, ad es. in lingue diverse, oppure che si comportano in
modo diverso tipo driver di stampanti, ecc. Inoltre si puo' controllare da
programma se la DLL e' presente o meno e decidere cosa fare di conseguenza.
Seconda differenza:
- con .LIB il compilatore fa per te tutto un lavoro di interfaccia tra il
programma eseguibile e la DLL, quindi chiama "LoadLibrary",
"GetProcAddress", chiama la funzione; per cio' che riguarda le classi C++ ti
permette di utilizzarle come se facessero parte del tuo programma senza
differenze apprezzabili (mi riferisco al VC++)
- con "LoadLibrary" devi fare tutto da solo tenendo conto che quello che ti
restituisce "GetProcAddress" e' un puntatore generico a funzione, quindi per
chiamare la tua funzione devi convertirlo utilizzando gli operatori di cast,
ecc. Il meccanismo e' stato pensato per lavorare bene con le funzioni
standard C, quindi a meno di complessi giri non e' cosi' facile utilizzare
delle classi.
Quello che ti consigliavo io, visto che dicevi di dover utilizzare delle
dialog box, era di mettere nella DLL tutte le classi di gestione (sempre che
OWL permetta di farlo...) e quindi di scrivere una nuova funzione "C"
facilmente richiamabile anche dal programma principale.
----
Se invece ti serve proprio utilizzare delle classi che vuoi mettere in una
DLL e che vuoi richiamare utilizzando il link dinamico (LoadLibrary...)
fammelo sapere, posso rispedire un vecchio messaggio dove c'erano alcune
indicazioni (sempre per il VC++). Non lo faccio adesso perche' e' un po'
lunghetto e non vorrei annoiare ulteriormente...
----
Ciao,
Angelo.