Newsgroup: it.comp.lang.c++
Titolo: chiamare da VB una DLL in VC++

Salve a tutti.
Sto cercando di fare una DLL in Visual C++ 5.0 da utilizzare con Visual
Basic 5.0, ma non riesco a far funzionare il tutto.
Ho seguito diversi consigli (soprattutto di Alex Martelli) che sono
apparsi nei messaggi del newsgroup, ma senza risultato.
Sto provando a fare una DLL idiota, non me ne vogliano gli esperti.
Ecco la mia funzione nel modulo .cpp:
#define DllExport __declspec(dllexport)
extern "C" DllExport int _stdcall somma(int a,int b)
{
 return(a+b);
}
La DLL (con MFC linkate staticamente) viene creata senza problemi e
senza alcun tipo di errore.
Nel progetto Visual Basic dichiaro la funzione come segue:
Declare Function somma Lib "LorenzoDll.dll" Alias "_somma" (ByVal a As
Integer, ByVal b As Integer) As Integer
ed il progetto non da nessun errore in fase di avvio, neanche se faccio
il .EXE.
Quando vado ad usare la funzione, e cioe' con:
MsgBox "la somma di 34+78 e'" + Str$(somma(34, 78))
mi viene fuori il seguente errore:
Run-time error '453':
Can't find DLL entry point _somma in LorenzoDll.dll
Dov'e' l'errore in tutto cio'?
Grazie a tutti.
Lorenzo

 ...
Ma non e' che la dllexport sopprime l'underscore?
Prova nella dichiarazione VB a non considerare l'alias e
a riferirti direttamente al nome della funzione "somma"
senza l'underscore.
Filippo Neri

 Filippo Neri
Già provato. E ovviamente non funziona.
Grazie per la collaborazione
Lorenzo



...

Io per dire il vero non ci ho ancora capito nulla sul formato che hanno i nomi
delle funzioni che si esportano da una DLL scritta da VC++.
Quindi per non saper ne leggere ne scrivere mi vado a cercare come e' che mi ha ribaltato i nomi delle mie funzioni:
Possibilita:
	1) tasto destro sulla DLL, scegli "Anteprima" e vedi i nomi delle funzioni che hai esporatto
	2) apri la DLL o il .Lib in modo binario (tipo HEdit.exe o NortonCommande) e ti vai a cercare i nomi delle funzioni.
Sono soluzioni idiote, ma io mi so accontentare, l'importate e' riuscire a chiamare ste benedette funzioni.
-- 
Hi, Ciao
Ettore                 By -MES-
http://freeweb.aspide.it/freeweb/ilmes
Il sito comune di programmatori VB
http://members.xoom.com/it_lang_vb

Integer, ByVal b As Integer) As Integer
Un "int" del C++ e` 4 byte; un "Integer" del Basic e` 2 byte.  Qui nella
somma probabilmente non te ne accorgeresti neppure (tronchi i 2
byte alti del valore di ritorno...), in un altro caso puo` essere un grave
disastro.  Suggerimento: nelle interfacce C++/Basic, scordarsi int e
integer, limitarsi a short e long che SONO della stessa lunghezza per
entrambi i linguaggi...!!!
Alex

 
Per evitare questo problema puoi dichiarare esplicitamente la funzione 
somma nella sezione exports del module definition file della DLL:
EXPORTS
    somma
In questo modo il linker del VC++ riconosce che somma = _somma@8 ed esporta 
la funzione col nome "non decorato".
Ciao,
Antonello
--
// ------------------------------------------------------------
// Antonello Salvatucci
// Software Developer, Technical Writer
// LEGO A/S SPU-Darwin, Kloevermarken 120, 7190 Billund DENMARK
// 
// antonello at digi. lego. com             
http://www.lego.com

 
Premetto io programmo solo ed esclusivamente in VB tuttavia anch'io un paio
di settimane fà ho cominciato ad avvicinarmi al C++ per l'esattezza al
Borland C Builder, ed anch'io ho avuto lo stesso problema cimentandomi con
le DLL.Ora ho risolto grazie ad un po' di Esempi che ho recuperato e a
qualche risposta sul NewsGroup.Nel caso tu non abbia ancora risolto il
problema ti posto un esempio, che dovrai poi verificare:
// Questo è il prototipo della function
extern "C" int __declspec(dllexport) WINAPI somma(int a,int b); 
//---------------------------------------------------------------
// Questo è la Function.
extern "C" int __declspec(dllexport) WINAPI somma(int a,int b)
{
 return(a+b);
}
Non so se sia poi la maniera più corretta tuttavia funziona egregiamente.
Per quanto riguarda la dichiarazione in VB, come qualcuno ti ha già postato
sul Newsgroup, fai attenzione che dichiarando int le variabili in Visual C,
dovrai poi definirle Long in Visual Basic :
Declare Function somma Lib "LorenzoDll.dll" (ByVal a As Long, ByVal b As
Long) As Long o altrimenti definirle short in Visual C.
Spero ti possa essere di aiuto
Ciao Ettore



Ciao sono Marco.
Ho letto sommariamente il tuo messaggio. Una cosa che mi e' balzata
subito all' occhio e' che nella dichiarazione della tua Dll in VBasic manca
un' "appendice" (il nome di questa appendice no me la ricordo: mangle?
e' possibile?) che consiste nel simbolo @ (chiocciola) seguito dalla
dimensione in bytes dei parametri che passi alla Dll. Nel tuo caso comunque,
essendo
due parametri di tipo int dovrebbe essere 8. (In ogni caso basta dare un'
occhiata al listing generato dal compilatore per capire qual' e il vero nome
esportato della tua funzione) Se funziona a buo rendere. Se invece non
funzionasse,
riscrivimi al:   
mvi...@mmpoint.it
. Ti daro'  maggiori  i dettagli. ( In
questo momento non
ho voglia di aprire alcuni miei sorgenti di riferimento.)
Buona fortuna.













