PDA

View Full Version : [C++] Utilizzare dll


andreapav
10-03-2009, 14:48
Ciao ragazzi,
devo utilizzare una libreria esterna con c++.
Ho solo il file.dll, come faccio a includerlo??
Grazie mille!

fero86
10-03-2009, 15:01
ti serve come minimo l'header che fornisce le definizioni della libreria, senza di quello non puoi fare nulla che non sia reverse engineering.

andreapav
10-03-2009, 15:16
http://www.nntp.it/comp-programmare-win32/646613-caricare-dll-c.html :read:

avevo già visto questo link ma non ne vengo fuori..:muro:

tomminno
10-03-2009, 15:27
avevo già visto questo link ma non ne vengo fuori..:muro:

Con Dependency Walker ricavi i metodi contenuti nella DLL e poi li utilizzi tramite LoadLibrary/GetProcAddress

Vincenzo1968
10-03-2009, 16:40
Se vuoi effettuare il linking statico, è possibile, utilizzando le utility dumpbin e lib fornite con visual studio, creare il file .lib a partire dalla dll.

1) Utilizzare l’utility DUMPBIN con l’opzione “/exports” per generare un file di testo che contenga i nomi
delle funzioni esportate.
2) Modificare il file di testo formattandolo come un file .def.
3) Usare l’utility LIB con l’opzione /DEF per generare il file di importazione.

Esempio.
Abbiamo un dll chiamata "ScanDirDll" che contiene la funzione "DirWalk".
Utilizziamo DUMPBIN nel modo seguente:


DumpBin /exports ScanDirDll.dll /out:ScanDirDll.def


Con il comando precedente viene creato il file ScanDirDll.def:

http://www.guidealgoritmi.it/images/ImgForums/DllFig05.jpg

Va modificato come segue:

http://www.guidealgoritmi.it/images/ImgForums/DllFig06.jpg

Infine, per creare il file di importazione, eseguiamo il seguente comando:


LIB /DEF:ScanDirDll.def


Vengono così creati il file .lib e il file .exp.

Devi comunque disporre(o creartene uno) del file header contenente le dichiarazioni delle funzioni che intendi utilizzare.

;)

andreapav
10-03-2009, 18:30
Grazie Vincenzo.. adesso purtroppo non posso provare ma domani mi ci butto!
solo una conferma: la modifica del .def consiste nell'aggiungere LIBRARY ... e EXPORT... in testa e lasciare il resto non modificato, giusto?
grazie ancora!

Vincenzo1968
10-03-2009, 19:06
Grazie Vincenzo.. adesso purtroppo non posso provare ma domani mi ci butto!
solo una conferma: la modifica del .def consiste nell'aggiungere LIBRARY ... e EXPORT... in testa e lasciare il resto non modificato, giusto?
grazie ancora!

Ciao,

dal file def generato dall'utility dumpbin devi togliere un bel po' di cose. Devi lasciare soltanto i nomi delle funzioni che vanno elencati nella sezione exports del file def.
Nel caso che le funzioni da esportare siano poche(come nell'esempio: si tratta di una sola funzione) puoi creare direttamente il file a mano.

Per esempio, supponiamo di avere una dll chiamata "myDll.dll" contenente una funzione chiamata "Somma" che accetta come parametri due double e restituisce un double.

Creiamo il file myDll.def:


LIBRARY "myDll.dll"

EXPORTS
Somma


Con l'utility LIB creiamo il file .lib da aggiungere alle opzioni del linker:

LIB /DEF:myDll.def


Infine, nel codice sorgente, dobbiamo aggiungere la dichiarazione della funzione importata dalla dll:

__declspec(dllimport) double Somma(double a, double b);


Quest'ultimo passo non è necessario se disponi dell'header contenente le dichiarazioni delle funzioni esportate dalla dll.

;)