Newsgroup: it.comp.lang.visual-basic
Titolo: DLL & VB

Una domanda "mista".
Ho necessità di usare una DLL scritta in C++ da VB, che contiene, per
esempio, la funzione prova:
long prova(long*vect, long size);   (che per esempio somma gli elementi
di vect)
in VB come dovrebbe essere dichiarata?
1^ tentativo:
Declare Function prova Lib "provadll.dll" (v As Long, n As Long) As Long
e poi la chiamo come prova(v(1),size), ma size viene passato per
riferimento, cosa che non voglio
2^ tentativo:
Declare Function prova Lib "provadll.dll" (v As Long, byval n As Long)
As Long
e chiamata come prova(v(1),byval size)
Ma mi viene segnalato l'errore "convenzione di chiamata non valida".
Qualcuno mi puo' aiutare? Grazie.
Altra cosa, sempre inerente alla DLL. E' possibile in un'applicazione
VBA per excel per esempio, specificare in runtime la cartella in cui
andare a leggere la DLL ? Credo che di default venga cercata in
windows/system o simili.
Grazie a tutti.

 Ma mi viene segnalato l'errore "convenzione di chiamata non valida".
Appunto.
ciao
ugo


E' curioso. Nel senso che, guardando l'help in linea su "declare", viene
menzionata anche la possibilita' di usare ByVal, contro la byref, che in
effetti e' il defalt in VB.
Ciao.

> SEMPRE per riferimento.
E> E' curioso. Nel senso che, guardando l'help in linea su "declare", viene
E> menzionata anche la possibilita' di usare ByVal, contro la byref, che in
E> effetti e' il defalt in VB.
Nonostante usi  la convenzione di passaggio dei  parametri del Pascal,
Windows è scritto  in C (C++) e quindi le  chiamate a funzione seguono
la convenzione di tale linguaggio  che, a soldoni, vuole che sia messo
sullo stack una word (del  processore) per ogni parametro, quindi o un
valore  (nel caso  di Windows  lungo  fino a  32 bit)  o un  puntatore
(indirizzo  in  memoria  dell'oggetto  VB)  che  è  il  modo  con  cui
usualmente si implementa il passaggio di parametri per riferimento.
--
Gian Uberto| main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Lauri      |                        David Korn, 1987 ioccc best one liner 
(aka saint)|-------------------------------------------------------------------
em@ail: 
sa...@eng.it
 ( vedere X-nospam nello header - see X-nospam in header )
.

"Elio" <e@e.e> ha scritto nel messaggio
news:9hf8a2$86e$1...@pegasus.tiscalinet.it...

Yess...
Mi scuso per la solita fretta che a volte mi fa rispondere a sproposito...
:-(
Le String vengono SEMPRE passate byRef (la mia memoria comincia ad avere
notevoli bug!)
Gli altri parametri possono, anzi, devono essere specificati: da qui il tuo
errore della seconda sintassi: credo tu dovessi specificare anche la byVal
della prima Long.
ciao
scusa ancora l'imprecisione
ugo

in VB come dovrebbe essere dichiarata?
Il problema principale non e' tanto la dichiarazione in vb, quanto
la dichiarazione in C++. VB riesce, per quel che ne so, ad accedere
a funzioni chiamate  in modalita' __stdcall.
Prova a modificarla cosi':
LONG APIENTRY prova(long* vect, long size)
dove:
(in windef.h)
#define WINAPI      __stdcall
#define APIENTRY    WINAPI
hth, hal

 hth, hal
Ti ringrazio. Effettivamente avevo provato __stdcall, ma il compilatore
mi dava dichiarazione obsoleta... grazie credo di avere risolto.