Newsgroup: it.comp.programmare.win32
Titolo: Array di strutture da VB a DLL C

Salve a tutti,
sto combattendo contro Visual Basic for Applications.. In particolare non
riesco a far sì che passi un array di strutture ad una mia funzione
scritta in C.
Tutte le altre funzioni vanno bene, passo di tutto, ma non riesco proprio
a passare l'array di strutture. La struttura, in C, è:
typedef struct _PIXEL {
	long x;
	long y;
} pixel;
ed in VB
Type pixel
	x as Long;
	y as Long
End Type
Riesco a passare la struttura (per riferimento), poi provo a creare una
funzione che accetti un array di pixel (sempre per riferimento, cioé
accetta un *pixel[]), e passo il primo elemento dell'array di pixel per
riferimento (ByRef nella dichiarazione, e quando passo metto Arr(0)).
Qualcuno sa dirmi dove sbaglio? Se necessario, posto il codice
incriminato. Access non dà alcun messaggio di errore specifico,
semplicemente si pianta e termina, dicendo che c'è stato un errore.
Grazie in anticipo.
-- 
[ Andrea Spadaccini a.k.a. Lupino / Lupin85 - from Catania ]
[ MAIL: lupin85(at)
email.it
 - ICQ: 91528290 - Linux 2.4.22 ]
[ Linux Registered User #313388 - Powered by Slackware 9.1 ]

 scritta in C.
Non mi sono mai addentrato in questi discorsi, pero' mi pare che se vuoi 
usare un array da VB ti serva il tipo OLE Variant SafeArray, che e' una 
struttura ben diversa - e piu' complessa - rispetto ai semplici array 
del C. Infatti, ad esempio, con i SafeArray di OLE puoi regolare la base 
dell'array (non necessariamente 0, come in C), puoi effettuare bound-
checking (non incluso negli array del C), etc. ...
Dan

 checking (non incluso negli array del C), etc. ...
Ma a me non servono tutti questi fronzoli.. Mi basta riuscire a passare un
array di pixel al C... Per farlo devo utilizzare questi SafeArray? :/
Al limite passo degli array di interi, ma era una questione di eleganza.. ;)
E comunque, afaik, i normali array VB permettono di impostare l'indice di
partenza, e forse fanno anche il bound-checking (stranamente, dato che
provengo dal C, non sono mai andato fuori dai limiti degli array VB :).
Il fatto è che riesco abbastanza tranquillamente a passare un array di
tipi elementari, basta passare per riferimento il primo elemento
dell'array. Ma il problema è che VB non riesce a passare per valore le
strutture, e deve passarle per forza per riferimento, quindi passando un
array di strutture quello che dovrei passare è in realtà un riferimento
al riferimento al primo elemento della struttura.
Il discorso dovrebbe filare, ho scritto il codice C in modo da adattarmi a
questo tipo di parametri ma access non ne vuole sapere, e si pianta! :/
Grazie comunque per l'attenzione.



Prova magari anche a postare su it.comp.lang.visual-basic ...
Ciao,
Dan

 Prova magari anche a postare su it.comp.lang.visual-basic ...
Fatto, speriamo che qualcuno riesca ad indirizzarmi verso la soluzione!
Grazie per la disponibilità.


"Lupino" <ask...@if.youwant> ha scritto nel messaggio
news:pan.2004.12.05....@if.youwant...

Prova a definire la funzione C con il parametro *pixel invece di *pixel[], e
soprattutto mi pare che dovresti dichiarare la declare VB ByVal e non ByRef.
Altrimenti, posta il codice per capirci meglio...

 Grazie in anticipo.
Fai attenzione perché i long in vb5 e vb6 sono interi a 32 bit, mentre i 
long in C spesso sono interi a 64 bit!
Sostituisci i long del C con degli int che stai più sicuro.
Poi la funzione C deve accettare *pixel e non *pixel[]. Quest'ultima 
dicitura infatti equivale a **pixel, cioè un puntatore a puntatore, che 
è ovviamente differente.
Infine è accettabile passare da VB il primo elemento dell'array usando 
ByRef nella dichiarazione.
In C poi dovresti avere
pixel[0].x=blabla
pixel[0].y=gnogno