PDA

View Full Version : [c++] accesso alle funzioni delle DLL


Trevi#18
22-05-2006, 14:21
ciao, mi trovo x le mani una dll della quale conosco il prototipo delle funzioni, alle quali devo accedere da un programma c++ compilato con DevCpp... quali sono le istruzioni per importare le funzioni delle dll? vi prego datemi una mano! :mc:

andbin
22-05-2006, 14:50
ciao, mi trovo x le mani una dll della quale conosco il prototipo delle funzioni, alle quali devo accedere da un programma c++ compilato con DevCpp... quali sono le istruzioni per importare le funzioni delle dll? vi prego datemi una mano! :mc:Ciao, devi innanzitutto creare una "import library".
Guarda ... io il Dev-C++ ce l'ho installato ma non lo uso (l'avevo provato) perché non mi piace ;) .
Comunque ho visto che il Dev-C++ ha un tool chiamato "dlltool".

Dovresti provare a fare così:
- crei un file chiamato nomedll.def con dentro:
EXPORTS
nomefunzione1
nomefunzione2
...ecc...

- usi dlltool con:
dlltool -D nomedll.dll -d nomedll.def -l nomedll.a

Dovrebbe crearti la import library nomedll.a che devi poi aggiungere, per la fase di link, al tuo progetto.

Non ne sono sicuro al 100%, comunque, ripeto, prova così. ;)

Trevi#18
22-05-2006, 15:25
si l'ho fatto, ho estratto il .def con un altro tool e poi ho creato il .a, che ho copiato nella cartella lib... ma a questo punto come faccio a chiamare le funzioni? :confused:

andbin
22-05-2006, 15:56
si l'ho fatto, ho estratto il .def con un altro tool e poi ho creato il .a, che ho copiato nella cartella lib... ma a questo punto come faccio a chiamare le funzioni? :confused:Ammesso che la import library .a sia stata creata in modo corretto e che sia stata inserita all'interno del progetto, basta che dichiari nel sorgente i prototipi delle funzioni (dici di conoscerli, se ho capito bene) e poi chiami le funzioni.

Trevi#18
22-05-2006, 20:22
mhm... quindi se ho il .a nn devo caricare la dll.... ma x importare il .a nel progetto come si fa?

Trevi#18
23-05-2006, 14:06
up! se volete vi posto il codice del .def x vedere se è corretto, vi prego è importante! ci devo fare la tesina! :cry:

andbin
23-05-2006, 14:14
up! se volete vi posto il codice del .def x vedere se è corretto, vi prego è importante! ci devo fare la tesina! :cry:Vai nella dialog delle opzioni del progetto. C'è una casella di testo in cui devi mettere eventuali file oggetto, librerie, ecc... per il linker.

BountyKiller
23-05-2006, 16:03
se vuoi linkarla staticamente devi leggerti la documentazione del tuo IDE per capire cosa fare...io uso il visual studio e ci sono delle directories apposta per per le librerie.

se vuoi linkarla dinamicamente devi dichiararti dei puntatori a funzione che rispettino i prototipi delle funzioni che ci sono nella dll, fare una loadlibrary (e alla fine una freelibrary per scaricare la dll), poi fare la GetProcAddress su ogni puntatore a funzione dopodichè chiami con questi puntatori a funzione le funzioni della dll.

Trevi#18
23-05-2006, 22:51
perfetto sono riuscito,grazie a tutti! se a qualcuno interessasse, si deve fare in questo modo:

ammesso che la funzione da chiamare abbia ad esempio il prototipo
long somma(long a, long b);

si definisce un tipo che identifichi le funzioni con quegli attributi e quel valore di ritorno
typedef long (CALLBACK* LONGLONG2LONG)(long, long);

si crea poi una variabile che conterrà la dll caricata
HINSTANCE hDLL;

e si definiscono le funzioni alle quali bisognerà poi accedere in questo modo:
LONGLONG2LONG somma;
in questo caso, utilizzando il tipo LONGLONG2LONG definito prima.

Ora va caricata la dll:
hDLL = LoadLibrary("MiaDLL.dll");

e da questa vanno estratte le funzioni:
somma = (LONGLONG2LONG)GetProcAddress(hDLL,"somma");

alla fine del programma per liberare la memoria basta chiamare la funzione
FreeLibrary(hDLL);

le funzioni così estratte si utilizzano normalissimamente come tutte le altre funzioni :cool:

andbin
24-05-2006, 09:57
perfetto sono riuscito,grazie a tutti! se a qualcuno interessasse, si deve fare in questo modo:
[...]Sì ... ma così è 'na palla! ;)
Se riesci a generare una import library, prova a linkare la libreria in modo statico e non dinamico, che è il metodo migliore.

Il caricamento dinamico delle dll normalmente si usa quando si devono gestire situazione particolari, ad esempio per la gestione "generica" di plug-in e cose del genere.

BountyKiller
24-05-2006, 13:58
mi pare di capire che tu abbia risolto...evidentemente non ne hai avuto bisogno,ma in genere quando si definisce un puntatore a funzione per chiamare una funzione di una dll si specifica anche la convenzione di chiamata...... probabilmente le funzioni della tua dll hanno come convenzione di chiamata _stdcall quindi va già bene così....... io ci sono impazzito tempo fa su una cosa simile....