Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - C++ - Array UInt16 da VB.Net a Visual C++
Forum - C/C++ - C++ - Array UInt16 da VB.Net a Visual C++

Avatar
Neo1986 (Ex-Member)
Pro


Messaggi: 97
Iscritto: 21/06/2010

Segnala al moderatore
Postato alle 18:27
Giovedì, 16/03/2017
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).

Codice sorgente - presumibilmente C/C++

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



Adesso l'importazione in vb.net :

Codice sorgente - presumibilmente VB.NET

  1. <System.Runtime.InteropServices.DllImport("PROVA_BUS.dll")>
  2. Public Shared Function Word_Lette(ByRef Val As UShort) As UShort
  3. End Function
  4.  
  5. Private Sub ButtonPassa_Click(sender As Object, e As EventArgs) Handles ButtonPassa.Click
  6.         Dim Valori As UShort() = New UShort(4) {}
  7.  
  8.         Word_Lette(Valori(0))
  9.         MsgBox(Valori(0).ToString)
  10.  
  11. End Sub



In questo momento in Valori trovo sempre 0.

Grazie per l'aiuto!

:k:


Ultima modifica effettuata da Neo1986 il 20/03/2017 alle 9:40
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6404
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:50
Venerdì, 17/03/2017
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 il 17/03/2017 alle 22: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à.
PM Quote
Avatar
Neo1986 (Ex-Member)
Pro


Messaggi: 97
Iscritto: 21/06/2010

Segnala al moderatore
Postato alle 9:42
Lunedì, 20/03/2017
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 :

https://msdn.microsoft.com/en-us/library/47zceaw7.aspx

E' sbagliato?

Grazie

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6404
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:04
Lunedì, 20/03/2017
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à.
PM Quote
Avatar
Neo1986 (Ex-Member)
Pro


Messaggi: 97
Iscritto: 21/06/2010

Segnala al moderatore
Postato alle 16:55
Lunedì, 20/03/2017
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...

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6404
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:58
Lunedì, 20/03/2017
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 il 20/03/2017 alle 18: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à.
PM Quote
Avatar
Neo1986 (Ex-Member)
Pro


Messaggi: 97
Iscritto: 21/06/2010

Segnala al moderatore
Postato alle 18:12
Lunedì, 20/03/2017
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 :

Codice sorgente - presumibilmente C/C++

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



sia con

Codice sorgente - presumibilmente C/C++

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



PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6404
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:20
Lunedì, 20/03/2017
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à.
PM Quote