Newsgroup: it.comp.programmare.win32
Titolo: Uso di una DLL con Visual C++





Vorrei usare una DLL per utilizzare le funzioni contenute 
al suo interno, ma non ci riesco.


In particolare mi interessa utilizzare la libreria 

Nviewlib.dll 
(di K. Nishita) che consente di caricare immagini 

JPG, GIF
. 


 


Ho provato con il seguente codice:


 


HINSTANCE hMod; 
// 
puntatore alla libreria dll 


FARPROC lpfpFunc; 
// 
puntatore alla funzione da utilizzare


int iRet;


 


hMod=LoadLibrary("Nviewlib.dll"); 
// caricamento della libreria


lpfpFunc=GetProcAddress(hMod, "Load_JPG"); 
// determinazione dell'indirizzo della funzione 
Load_JPG


iRet=(*lpfpFunc)("immagine.jpg"); 
// richiamo della funzione Load_JPG


 


Pero il compilatore mi dice che la funzione a cui punta 
lpfpFunc non vuole argomenti cioè è del tipo


 int (__stdcall*)(void)


Invece la funzione Load_JPG deve accettare come argomento un 
nome di un file JPG.


 


Qualcuno può dirmi dove ho sbagliato? Qualcuno ha già usato la 
libreria Nviewlib.dll ?


Ce ne sono di migliori? C'è qualche libreria freeware 
della Microsoft per VC++ ? Grazie.



 wrote in message 82u9ne$d4s$1...@nslave2.tin.it...
    [snip]
Sono questioni tipiche della piattaforma, quindi
ho impostato il solo it.comp.programmare.win32
per ulteriore inoltro.
Comunque, problemi simili si trovano in tutti i
casi di uso di librerie shared su varie piattaforme
(tema che, ahime`, lo standard C++ non copre),
quindi, in breve...:
Devi usare un cast (precisamente reinterpret_cast)
per trasformare il risultato di GetProcAddress nel
tipo di puntatore a funzione cui "sai" corrisponde.
Ad esempio:
    typedef int (*p_myfun_t)(const char*);
definisce p_myfun_t come puntatore a una funzione
che prende un const char* e torna un int (e` questo
il tipo della funzione in questione...?  verifica su
header file e documentazione).
Poi:
    p_myfun_t pmf =
        reinterpret_cast<p_myfun_t>(
            GetProcAddress(hMod, "Load_JPG")
        );
    int iRet = pmf("immagine.jpg");
Nota che non occorre nella chiamata scrivere (*pmf),
il dereferencing e` implicito.
Sul tema specifico "Jpeg ecc", ho risposto mi pare un
paio di settimane fa, consigliando una libreria (per MFC,
se ben ricordo); usa magari 
www.deja.com
 per vedere
l'esatta URL.  Comunque, questa parte dobbiamo di
certo proseguirla solo su i.c.p.win32.
Alex

http://www.winsite.com/info/pc/win95/programr/jpeg.zip/

Ho provato a fare il reinterpret_cast  e il programma viene compilato e
linkato correttamente, ma ottengo il seguente errore dal debugger in fase di
esecuzione:
Debug error!
The value of ESP was not properly saved across a function call. This is
usually a result of calling a function declared with one calling convention
with a function pointer declared with a different calling convention.

 wrote in message news:8328cu$deq$1...@nslave1.tin.it...

La diagnostica mi sembra molto accurata.  Sei sicuro che
la funzione che chiami, e il puntatore attraverso cui la
chiami, siano in effetti definiti con la stessa calling
convention?  Cioe`, o entrambi CDECL, oppure entrambi
STDCALL, oppure entrambi FASTCALL, ecc...
Se non hai dichiarato nulla, CDECL dovrebbe essere
il default, per cui prova magari a dichiarare il puntatore
come esplicitamente STDCALL, e vedi un po'...
Alex

Si funziona! Ho dichiarato il puntatore alla funzione come _stdcall
Grazie per l'aiuto.


ma non ci riesco.
Non e' presente il .lib da linkare? 
Personalmente non mi ricordo piu' per quale motivo, ma non mi era
piaciuta un gran che quella DLL. Se vuoi puoi usare direttamente il
codice del JPEG Group su 
ftp.uu.net
 nella directory graphics/jpeg
-------------------------------------------------------
Tieni per te il Papero se vuoi la mia email
Sito Papero -> 
http://utenti.tripod.it/papero