Newsgroup: it.comp.programmare.win32
Titolo: Esportare funzioni DLL

Allora, premetto che sono nuovissimo del VC++.
Dichiaro una funzione nella DLL così:
	__declspec(dllexport) void funz(void) { .... }
Poi nell'EXE la dovrei richiamare così:
 
	typedef void (_stdcall *forma)(void); 
	forma funzEXE;
	funzEXE=GetProcAddress(LoadLibrary("nomedll.dll"),"funz");
Ma non funziona! L'errore di GetProcAddress è "Impossibile trovare la
procedura specificata".
Dov'è l'errore?
Per favore qualcuno mi aiuti che ci sto sbattendo la testa da troppo
tempo.
Grazie.

 procedura specificata".
A parte il fatto che se carichi la dll così, ti spari subito un bel memory
leak considerando il fatto che l'HMODULE restituito dalla LoadLibrary non lo
gami più, altrimenti FreeLibrary che l'hanninventataffà...(che linguaggio
tecnico vero? : )) mi sorge quel dubbio piccolo piccolo che la tua dll non
si trovi nella stessa directory dell'exe o in una delle directory segnate
nel path ==> LoadLibrary restituisce NULL e quando richiami GetProcAddress
passandogli NULL e "funz" il valore di ritorno è "zzo dici?".
Mi sbaglio?

 
Se il file sorgente in cui hai dichiarato la funzione è un CPP il nome 
della funzione è stato "decorato" per supportare l'overloading. Puoi 
evitarlo piazzando un extern "C" attorno alla dichiarazione della 
funzione oppure utilizzando il file .def, oppure "rassegnarti" al 
mangling e utilizzare il nome decorato nella chiamata a GetProcAddress.
Puoi utilizzare dumpbin /EXPORTS <nomedll> per vedere i nomi delle 
funzioni esportate.
-- 
Valter Minute
vmi...@inwind.it
 (the reply address of this message is invalid)


Eh purtroppo si.
A meno che non sia sbalgiato il fatto di compilare l'EXE in una dir e
spostarlo nella dir dove c'è la dll. O devo per forza compilare con la
dll presente?
Comunque la LoadLibrary non dà errore, restituisce l'handle: il
problema è nella GetProcAddress.
Ma qualcuno c'è mai riuscito?

funzioni esportate.
Da dove viene dumpbin? Nel senso: dov'è l'eseguibile?
Grazie comunque.
Vinz
 

 problema è nella GetProcAddress.
OK, avevo solo ipotizzato considerando il tuo "premetto che sono nuovissimo
del VC++", ti consiglio allora di guardare il post di Valter Minute, che mi
è sembrato molto chiaro.
Ma ciao

 
Prego comunque.


funzioni esportate.
Sai se c'e'  qualcosa di simile anche per il "vecchio" compilatore
Borland C++ 5.02a ?
Stefano "HappyMan" (Lago Maggiore - NO)
--
Personal Web 
http://www.sgr.info
Email happyman69 (at) 
libero.it

 
Puoi utilizzare QuickView (era fornito come accessorio con windows 
NT,95 e 98).


On 20 Nov 2002 17:17:04 GMT, Valter Minute <vmi...@REMOVEMEinwind.it>
wrote:
[cut]
Avevo fatto qualche prova con il Dependency Walker e una DLL compilata
in C++ ma i nomi che vedevo se utilizzati nella GetProcAddress non
funzionavano. Chissa' dove sbagliavo...
Ciao e grazie


Valter Minute <vmi...@REMOVEMEinwind.it> scrisse:
Risolto: aprendo, anche col blocco note la dll, trovo :
?funzione@AAYYZZ tipo.. se la richiamo cosi funziona.
Oppure dichiarando al funzione nella dll con extern "c" si prende il
nome normale.
Grazie 1k per l'aiuto.

 
Tieni presente che, in questo modo, non potrai dichiarare versioni 
"overloaded" della funzione (visto che il C non supportava questa 
funzionalità).


funzionalità).
L'avevo intuito. Comunque non ne ho bisogno.
Grazie per l'aiuto.
Vinz.

  Per chiudere la DLL prima che il programma chiamante esca.
Vedo che sei molto escpetto...quindi escpetta ancora un po' prima di
scrivere...lo sai...
Ma ciao !

 GetProcAddress non funzionavano. Chissa' dove sbagliavo...
in Dependency Walker c'era il tastino con scritto "C++" pigiato. Ho 
indovinato?
-- 
 < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
     Don't stand, REACT!      version 0.0.20. C, C++ and ASM developers
                              and beta testers are welcome!

      typedef void (_stdcall *forma)(void); 
perchè usi una dichiarazione diversa? ah, e __stdcall si scrive con due 
underscore


 Borland C++ 5.02a ?
tdump. Comunque, il linker Microsoft te lo tirano dietro, lo trovi un 
po' ovunque (ad esempio, nel framework di .NET)


 Da dove viene dumpbin? Nel senso: dov'č l'eseguibile?
non serve. dumpbin č una cazzatina che si limita a chiamare il linker 
con l'opzione -dump. link -dump -exports <nomedll> fa la stessa cosa
