Newsgroup: it.comp.programmare.win32
Titolo: Domande sulle librerie .dll e .lib

Salve a tutti, vorrei sapere x cortesia che differenze ci sono tra i file
.dll e i file .lib, se sono simili  oppure dove trovare cosa sono in
dettaglio e come si usano.
Si può dire che essi siano come dei file header .h compilati quindi
utilizabili a run-time? (almeno come idea)?
So che queste librerie hanno delle funzioni precompilate ed utilizzabili, ma
come? (ad esempio con il borland c++)? Magari un esempio di codice se non è
di troppo disturbo mi aiuterebbe...
Come faccio se voglio creare (ad esempio con il borland c++) un file di
libreria piuttosto che un file .exe?
Come faccio a sapere quali sono le funzioni interne ai file di libreria che
si che possono utilizzare dai programmi che faccio io? Cioè ammettendo di
avere il file ver.dll ad esempio come faccio a sapere che funzioni fornisce?
Ho sentito spesso parlare di Entrypoint delle dll... che cosa sono? A cosa
servono?
Grazie per il tempo dedicato.

come? 
come una qualunque funzione... immagino che tu utilizzi delle funzioni
per windows (se lavori sotto windows), tipo creare una finestra,
oppure le funzioni matematiche del c (tipo sin, cos)... ecco, quelle
funzioni sono contenute dentro delle dll (nello specifico creare
finestra: da qualche parte tra le dll di windows, sin e cos sono nelle
dll run-time del c)
oh, e adesso arriva il complicato... se vuoi utilizzare una libreria,
devi dire al compilatore quali funzioni vuoi utilizzare e soprattutto
dove si trovano queste funzioni all'interno della dll... per fare
questo potresti caricarti dinamicamente la libreria e poi cercare
l'indirizzo della funzione, ecc.
oppure, molto più semplice, linki il file libreria.lib (della
libreria.dll) al tuo file oggetto, così che puoi utilizzare
liberamente tutte le funzioni che vuoi della libreria...
per le funzioni windows e quelle del c non devi, di norma, linkare
niente perché ci pensa già il compilatore a farlo di default
alle prossime domande risponderò prossimamente o aspettiamo che ti
rispondano gli altri :-DDD
ciax
-- 
]\/[ad]\/[age
"Un Maestro insegue semplicemente la sua visione di Eccellenza in
qualunque cosa sta facendo e lascia agli altri decidere se sta 
lavorando o giocando. A lui sembra sempre di fare entrambe." - Anonimo

 liberamente tutte le funzioni che vuoi della libreria...
Esistono due metodi per utilizzare le DLL, come riportato
da MadMage e sono: statico e dinamico.
Il primo si realizza linkando il file .LIB che in pratica contiene
un "indice" di ciò che è esportato dalla DLL; questo è il metodo
più semplice ma anche quello meno flessibile (la libreria viene
richiesta subito e se non è presente il programma non parte).
Il secondo metodo lo metti in pratica con la funzione API
LoadLibrary()... è più complesso ma in compenso offre
diversi vantaggi (tra cui quello di evitare di caricare DLL non
necessarie e magari non presenti).
Per ultimo, se vuoi sapere le funzioni esportate da una DLL, puoi
usare l'Anteprima (se hai Win98) oppure il programma tdump.exe
fornito con i compilatori Borland; in ogni caso i parametri non li
vedrai!
Infine, l'EntryPoint è quella funzione (DllEntryPoint()) che viene chiamata
dal Sistema Operativo quando qualche processo/thread utilizzano o
scaricano la libreria.
Spero di esserti stato d'aiuto.
Ciao.

all'eseguibile generato.
no, non nel caso del c++builder, per lo meno, dove hai la scelta di
legarle staticamente o dinamic (e la libreria è, a seconda dei casi,
CP3250MT.DLL, CW3250MT.DLL, CW3250.DLL)... penso che per quanto
riguarda windows TUTTE le funzioni siano contenute in librerie (o sia
possibile linkarle dinamicamente)
una cosa: ho scoperto che non posso usare oggetti della libreria
standard c++ come valori restituiti dalle funzion idi una libreria
dll... perché mai? mi pare d'aver capito che è un problema di gestione
della memoria... si può aggirare questo problema?


all'eseguibile generato.
Non è detto, ogni compilatore può fare quello che vuole ad esempio
nella dll MSVCRT ci sono molte funzioni della libreria del c.
-- 
                    Marco Barisione (ICQ 84277092)
Se sei interessato alla creazione di it.comp.lang (per i linguaggi di
programmazione senza un gruppo apposito e per i confronti fra i
linguaggi) partecipa alla discussione sul manifesto su it.news.gruppi.


Aggiungo giusto per completezza e perché magari può interessare a qualcuno
che in Visual C++ 6.0 esiste una variante del utilizzo statico delle DLL. In
pratica esiste un'opzione (ora non ricordo...DELAY o qualcosa del genere)
che utilizzata con DLL a link statico ne causa il caricamento solo quando è
necessario richiamare una funzione di tale DLL.
Non so se altri ambianti (ad esempio Borland) supportano questa possibilità.
Quindi sebbene si un collegamento statico alla DLL, il caricamento avviene
solo quando è effettivamente necessario e non all'avvio del programma..
Mi pare che questa modalità abbia alcune limitazioni ma poiché non l'ho mai
utilizzato non so dire di più.
Porlock.

Grazie e 1000 x tutti i consigli ora ho le idee molto + chiare!
Vi chiederei, se non vi disturba troppo, un esempio di codice c in cui con
una LoadLibrary() si carica una .dll e se ne utilizzano alcune funzioni.
Intanto ho cercato un bel po', ma non capisco come si deve fare per
utilizzare dinamicamente la libreria usando, immagino, una GetProcAddress().
Grazie e 1000 x tutti gli aiuti!

 dll... perché mai?
Certo che li puoi usare, ma saranno sfruttabili solo
dal compilatore che ha generato quella DLL.
E  non e' un discorso che vale solo per gli  oggetti 
della  libreria standard del C++, ma per  tutti  gli 
oggetti implementati in questo linguaggio.
Ogni  compilatore  C++ gestisce la  decorazione  dei
nomi  e  lo fa con un metodo proprio e  distinto  da 
quello di tutti gli altri compilatori.
-- 
Posted from  [80.105.34.80] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 utilizzare dinamicamente la libreria usando, immagino, una GetProcAddress().
Ecco un pezzo di codice esemplificativo, tieni conto che DLLFunc sarà un
puntatore ad una funzione con prototipo identico a quella contenuta della
DLL a cui vuoi accedere.
In ogni caso, controlla sempre il valore restituito da GetLastError() per vedere
che non ci siano problemi.
HMODULE DLLHandle;
// tenta il carimento della DLL
DLLHandle = LoadLibrary("mydll.dll");
// ricava l'indirizzo
DLLFunc = (DLLFunc)GetProcAddress(DLLHandle, "MyDLLFunc");
// se non ci sono problemi, chiama la funzione
if (DLLFunc)
  DLLFunc();
Buon lavoro!!
--
Paolo (/A\xel)
Mail: 
djfelix7...@hotmail.com
 (Rimuovere _NOSPAM_ per rispondere!)
Web: 
http://axel.ns0.it
ICQ: 121230704
Sappiamo più cose inutili di quante ne ignoriamo necessarie.
(L. de Clapiers de Vauvenargues)

Grazie infinite davvero!