Newsgroup: it.comp.programmare.win32
Titolo: uso di DLL

Ciao a tutti.
So che per molti la domanda sarà banale.
Ho provato a cercare un po' in giro con Google, ma la risposta al mio errore
(probabilmente scemo) ancora non l'ho trovata.
Ho una dll con questo codice:
bool __declspec(dllexport) CiaoMondo(void);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*
lpReserved)
{
        return 1;
}
bool CiaoMondo(void){
        return(MessageBox(NULL,"ciao mondo", "ProvaDll",
MB_YESNO|MB_ICONEXCLAMATION)==IDYES?true:false);
}
e un eseguibile esterno (una maschera con un bottone, niente di più). Alla
pressione del bottone, si scatena l'evento OnClick con il codice seguente:
HINSTANCE hInst;
FARPROC Func;
bool Val;
if((hInst=LoadLibrary("provadll.dll"))!=NULL){
        if(Func=GetProcAddress(hInst, "CiaoMondo")){
                Val=(*Func);
        }
Il problema è che Func è sempre NULL.
Mi sapete dire dove sbaglio?
Grazie a tutti,
A.

 Il problema è che Func è sempre NULL.
Ammesso che "provadll.dll" sia rintracciabile nel path (es.: sia nel 
path ove si trova l'exe, o in una cartella di sistema, ecc.), prova a 
dichiarare la tua funzione "CiaoMondo" come "extern C", onde evitare il 
name-mangling (decoramento dei nomi) tipico del C++.
Inoltre, non sono molto sicuro del FARPROC... userei un typedef che 
ricalchi il prototipo di CiaoMondo()
...in ogni caso si e' parlato di DLL piu' volte anche su questo NG, se 
provi a cercare con Google sicuramente troverai info piu' dettagliate.
Ciao
Dan

Mi sapete dire dove sbaglio?
HINSTANCE hInst;
FARPROC Func;
bool Val;
if((hInst=LoadLibrary("provadll.dll"))!=NULL){
        if(Func=GetProcAddress(hInst, "CiaoMondo")){
                Val=(*Func);
	else
	{
		MaGetLastErrorNonLaUsaNessuno();
	}
        }
void MaGetLastErrorNonLaUsaNessuno()
{
	LPVOID lpMsgBuf;
	FormatMessage( 
		FORMAT_MESSAGE_ALLOCATE_BUFFER | 
		FORMAT_MESSAGE_FROM_SYSTEM | 
		FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL,
		GetLastError(),
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
		(LPTSTR) &lpMsgBuf,
		0,
		NULL 
		);
	printf("Errore: %s\n", (LPCTSTR)lpMsgBuf);
	LocalFree( lpMsgBuf );
}
E guarda un po' quanto vale GetLastError() e cosa dice ;-)
-- 
ciao,
hal

 MaGetLastErrorNonLaUsaNessuno();
:-)
Hai ragione, assolutamente e incontrovertibilmente.
L'errore ritornato è "impossibile trovare la procedura specificata".
Ora... ho copiato e incollato il nome della funzione dal codice della dll a
quello del programma chiamante.
Quale può essere il problema?
Grazie a tutti.
Alessio

Mi sapete dire dove sbaglio?
Prova con l'ordinal value .

Quale può essere il problema?
A questo punto direi il name-mangling dei compilatori c++:
vedi post di Danguard e, tanto per essere ancora piu' sicuri, prova
anche ad usare un file .def per esplicitare nome e ordinale con cui va
esportata la funzione.
Nei Remarks della documentazione di GetProcAddress() e' infatti
scritto, fra l'altro:
<quote>
The spelling and case of a function name pointed to by lpProcName must
be identical to that in the EXPORTS statement of the source DLL's
module-definition (.def) file. The exported names of functions may
differ from the names you use when calling these functions in your
code. This difference is hidden by macros used in the SDK header
files.
</quote>
-- 
ciao,
hal

 Prova con l'ordinal value .
premesso che non voglio dare lezioni a nessuno :-) , secondo me e' 
meglio usare le stringhe piuttosto che gli ordinal value... (tra l'altro 
pensavo che fossero pure in qualche modo "deprecated"). l'uso delle 
stringhe mi sembra piu' manutenibile e gestibile rispetto a dei semplici 
valori numerici. [tutto IMHO :-) ]
ciao
dan