Newsgroup: it.comp.lang.visual-basic
Titolo: Passare un vettore ad una DLL

Ciao a tutti,
sto avendo un grosso problema nel passaggio di un vettore da
un'applicazione Visual Basic ad una DLL in C.
Riesco bene a passare bytes o stringhe, ma se provo a passare un
vettore la DLL crasha.
Questo è il codice
  Dim vettore_j() As Byte
  ReDim vettore_i(1 To Dimensione * 2)
  miafunzione(vettore)
  dove ho definito miafunzione lato Visual Basic come
Public Declare Function PD_miafunzione Lib "Pd_order" _
                Alias "_miafunzione@4" _
                (ByVal vettore As Byte)
e lato C
short int __stdcall PD_memcmp(BYTE* vettore)
Dove pensate che sto sbagliando?
Mi sareste di grandissimo aiuto!
Grazie fin da adesso,
Marco

 ha scritto nel messaggio news:1159811170.9...@c28g2000cwb.googlegroups.com...
Ciao a tutti,
sto avendo un grosso problema nel passaggio di un vettore da
un'applicazione Visual Basic ad una DLL in C.
Riesco bene a passare bytes o stringhe, ma se provo a passare un
vettore la DLL crasha.
Questo è il codice
  Dim vettore_j() As Byte
  ReDim vettore_i(1 To Dimensione * 2)
  miafunzione(vettore)                    <--------------- non e' definito
  dove ho definito miafunzione lato Visual Basic come
Public Declare Function PD_miafunzione Lib "Pd_order" _
                Alias "_miafunzione@4" _
                (ByVal vettore As Byte)   <----------------- corretto: ByRef vettore() as Byte



I casi sono due:
1) se vuoi lasciare la definizione della funzione C com'è ora devi passarle il
*puntatore* al primo elemento del vettore quando la richiami
Inoltre, a meno che i vettori manipolati dalla tua funzione non abbiano sempre
la stessa lunghezza, occorrerà che la funzione C conosca la dimensione
dell'array, quindi prevederei un secondo parametro length.
short int __stdcall PD_memcmp(BYTE* vettore, unsigned int length)
Public Declare Function PD_miafunzione Lib "Pd_order" _
                Alias "_miafunzione@4" (ByVal pVettore As Long, ByVal uLength As
Integer)
E quindi
Call miafunzione(VarPtr(vettore(1)), UBound(vettore()))
2) Utilizzi il tipo OLE SAFEARRAY (devi includere OLE2.h, mi pare), che mappa
direttamente un array VB, ma è molto più complicato da gestire in C.
short int __stdcall PD_memcmp(LPSAFEARRAY FAR* ppSAvettore)
Public Declare Function PD_miafunzione Lib "Pd_order" _
                Alias "_miafunzione@4" (Vettore() As Byte)
E quindi
Call miafunzione(vettore())
Ti rimando ad argomenti specifici, ad esempio:
http://support.microsoft.com/kb/167668/en-us
Bye
Raf
-----------------------------------------------------
Funk: cooler than the other side of the pillow.

Grazie mille per la risposta ma sto avendo ancora qualche problema.
Ho applicato la modifica del ByRef al posto del ByVal. Adesso la
situazione è la seguente
Dim vettore(0 To 11)
...inizializzazione valori vettore
Call miafunzione(vettore)
Public Declare Function PD_miafunzione Lib "Pd_order" _
                 Alias "_miafunzione@4" _
                 (ByRef vettore() as Byte)
e in C
short int __stdcall PD_memcmp(BYTE* vettore)
Quello che succede però è che lato DLL quando leggo vettore[0],
vettore[1], etc. trovo valori diversi rispetto a quelli che avevo
inizializzato lato Visual Basic, come se non stessi in realtà leggendo
i valori del vettore ma qualcos'altro... es. il puntatore.
Grazie di nuovo,
Marco

 Call miafunzione(vettore)
Call miafunzione(vettore(0))
hth,
Lokar

 short int __stdcall PD_memcmp(BYTE* vettore)
Se vuoi che la funzione in C non venga decorata (chiocciole, underscore e 
via dicendo) aggiungi al progetto C un file di testo con estensione DEF con 
l'elenco puro e semplice delle funzioni che vuoi esportare.
Es. se vuoi esportare le funzioni del progetto "My_Proj":
 short int __stdcall My_Func1()
 short int __stdcall My_Func2()
dovrai scrivere nel file di testo My_Proj.def (da aggiungere al progetto)
My_Func1
My_Func2
Ricompila e non avrai bisogno di Alias nella declare.
hth,
Lokar 

Ho appena provato con quanto suggerito da Rafunk e sembra fare al caso
mio
short int __stdcall PD_memcmp(BYTE* vettore, unsigned int length)
Public Declare Function PD_miafunzione Lib "Pd_order" _
                Alias "_miafunzione@4" (ByVal pVettore As Long, ByVal
uLength As
Integer)
E quindi
Call miafunzione(VarPtr(vettore(1)), UBound(vettore()))
Grazie davvero a tutti!!!
Marco