Buongiorno a tutti.
Ennesimo dubbio amletico :-)
Ho diversi programmini scritti in vari linguaggi, che richiamano una Dll scritta molto tempo fa da un collega in C++ (credo) e tutto funziona correttamente.
Nel manuale della DLL, la definizione è la seguente:
codice:
short DLL_Read( long Param1, long *Data, short Count, short Param2, short Param3);
Come potete notare, viene passata una variabile "Data" di tipo puntatore.
I vari programmini (tra cui uno scritto da me in Vb.Net), richiamano la funzione come descritto di seguito, e, come da copione, mi ritrovo la variabile "Data" riempita correttamente con un array di Integer
codice:
Declare Function DLL_Read Lib "libreria.dll" (ByVal Param1 As Integer, ByRef Data() As Integer, ByVal Count As Short, ByVal DNG_Param2 As Short, ByVal Param3 As Short) As Short
Public Sub Prova()
Dim Data(20) As Integer
RetCode = DLL_Read(5, Data, 316, 1, 1)
End Sub
Ora...Avrei la necessità di riscrivere la DLL richiamata dai vari programmi in VB.Net senza modificare i diversi programmi, ma ho qualche problema nel capire come tornare indietro la variabile puntatore.
Di seguito quello che ho fatto...ma non funziona; quando richiamo la nuova DLL Vb.Net dai programmini, mi vengono generati degli errori di Access Violation. Sapete aiutarmi?
codice:
<ExportDllAttribute("DLL_Read", System.Runtime.InteropServices.CallingConvention.Cdecl)> _
Public Shared Function DLL_Read(ByRef Param1 As Integer, ByRef Data As IntPtr, ByRef Count As Short, ByRef Param2 As Short, ByRef Param3 As Short) As Short
Dim myData() As Integer = {0, 1, 2, 3}
Dim size As Integer = Marshal.SizeOf(myData(0)) * DataIn.Length
Data = Marshal.AllocHGlobal(size)
Marshal.Copy(myData, 0, Data, Data.Length)
Grazie