Oppure

Loading
16/03/17 17:27
Neo1986
Buonasera a tutti !

Avrei bisogno di un piccolo aiuto... dovrei passare un array di valori integer (vb.net) a una dll scritta in Visual C++ (no .net).
All'interno della dll devo modificare alcuni valori dell'array e devo successivamente ritrovarmeli modificati in vb.net (che cosa contorta !).

Le ho provate tutte, per ora nessun risultato positivo! (tengo a precisare che ho i sorgenti di entrambe i software).


extern "C" __declspec(dllexport) int __stdcall Word_Lette(UINT16 *Valori)
{
	Valori[0] = 2;
	Valori[1] = 3;
	Valori[2] = 4;
	Valori[3] = 5;
	Valori[4] = 6;
	return 1;

}



Adesso l'importazione in vb.net :


<System.Runtime.InteropServices.DllImport("PROVA_BUS.dll")>
Public Shared Function Word_Lette(ByRef Val As UShort) As UShort
End Function

Private Sub ButtonPassa_Click(sender As Object, e As EventArgs) Handles ButtonPassa.Click
        Dim Valori As UShort() = New UShort(4) {}

        Word_Lette(Valori(0))
        MsgBox(Valori(0).ToString)

End Sub



In questo momento in Valori trovo sempre 0.

Grazie per l'aiuto!

:k:

Ultima modifica effettuata da Neo1986 20/03/17 8:40
aaa
17/03/17 20:50
nessuno
Hai chiamato la

Word_Lette

ma nella DllImport hai scritto

DWord_Lette

Come mai?

Poi ... perché parli di Int32 ma poi utilizzi degli UShort ?
Ultima modifica effettuata da nessuno 17/03/17 21:02
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
20/03/17 8:42
Neo1986
Ciao,

Hai ragione, ho fatto un po' di confusione nell'importazione del codice dal mio sorgente al forum.
Comunque ora ho modificato il post nel modo corretto (credo).

NB. in realtà sto chiedendo aiuto per gli UInt16 ma ho ovviamente lo stesso problema su Int32.

Uso Ushort perché l'ho visto in questa tabella :

msdn.microsoft.com/en-us/library/…

E' sbagliato?

Grazie
aaa
20/03/17 11:04
nessuno
Ve bene UShort ... ma nel codice C devi scrivere

extern "C" __declspec(dllexport) UINT16 __stdcall Word_Lette(UINT16 *Valori)

e non int
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
20/03/17 15:55
Neo1986
si..... ok...... ma il problema non è quello.... il valore che restituisce la funzione
quasi non mi interessa, a me interessa modificare l'array che passo come argomento della funzione.
Lo modifico nella funzione C ma purtroppo in VB vedo sempre i vecchi valori...
aaa
20/03/17 16:58
nessuno
A te può non interessare ma al compilatore si. Tutto deve essere corretto e se è così funziona regolarmente.

Se hai ancora problemi, fai uno zip con i due progetti e provo a scaricarli e provarli.
Ultima modifica effettuata da nessuno 20/03/17 17:10
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
20/03/17 17:12
Neo1986
ho trovato la soluzione (semplicemente un errore nel codice nella modifica dell'array all'interno della funzione C).

E come ti dicevo prima, funziona sia con :

extern "C" __declspec(dllexport) int __stdcall Word_Lette(UINT16 *Valori) 


sia con

extern "C" __declspec(dllexport) UINT16 __stdcall Word_Lette(UINT16 *Valori) 

aaa
20/03/17 17:20
nessuno
Non insisto per convincerti che la firma tra le versioni deve essere uguale, te ne convincerai quando, in altri casi avrai problemi.

Ma non ho capito come hai risolto a meno che il codice che hai mostrato non era completo perché, ripeto, quello funzionava.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.