Necesito utilizar una DLL q en VB6 corre bien, esta DLL controla un hardware conectado vía red. Ahora bien, he encontrado algunos problemas al querer intentar usar esta DLL con vb.net 2005, El error más grave: ', "Intento de leer o escribir en la memoria protegida. Esto a menudo indica que otra memoria está dañada.". Por ejemplo: en vb6 tengo el sig código:
Código vb:
Ver original
Private Sub Command2_Click() 'obtener la información de red del disp. conectado Dim devnetinfo As NETINFO If CKT_GetDeviceNetInfo(reader, devnetinfo) Then msg$ = "IP: " & devnetinfo.IP(0) & "." & devnetinfo.IP(1) & "." & devnetinfo.IP(2) & "." & devnetinfo.IP(3) & Chr$(10) msg$ = msg$ + "Mask: " & devnetinfo.Mask(0) & "." & devnetinfo.Mask(1) & "." & devnetinfo.Mask(2) & "." & devnetinfo.Mask(3) & Chr$(10) msg$ = msg$ + "Gate: " & devnetinfo.Gateway(0) & "." & devnetinfo.Gateway(1) & "." & devnetinfo.Gateway(2) & "." & devnetinfo.Gateway(3) & Chr$(10) msg$ = msg$ + "Server: " & devnetinfo.ServerIP(0) & "." & devnetinfo.ServerIP(1) & "." & devnetinfo.ServerIP(2) & "." & devnetinfo.ServerIP(3) & Chr$(10) msg$ = msg$ + "MAC: " & devnetinfo.MAC(0) & "." & devnetinfo.MAC(1) & "." & devnetinfo.MAC(2) & "." & devnetinfo.MAC(3) & "." & devnetinfo.MAC(4) & "." & devnetinfo.MAC(5) & Chr$(10) MsgBox(msg$) End If End Sub
Donde CKT_GetDeviceNetInfo se define como una función dll q lleva 2 parámetros: (identificador del Dispositivo, estructura donde vaciar la informacion solicitada). esta estructura se define en vb6:
Código vb:
Ver original
Public Type NETINFO ID As Long IP(3) As Byte Mask(3) As Byte Gateway(3) As Byte ServerIP(3) As Byte MAC(5) As Byte End Type
hasta ahi, me consta q todo en vb6 corre como se espera... Pero al momento de trasladar las cosas a .net, y llevando a cabo las operaciones necesarias (como cambiar el type de vb6 por el Structure de vb.net o demás) que he escrito, SIGO TENIENDO ESTE TIPO DE PROBLEMAS!!!
Avances: leer o escribir un tipo de la ddl declarado como long, en un long de .net provoca este error, investigando llego a la conclusión de que el tipo de dato long de vb6 es apenas el integer de vb.net y al cambiar estas declaraciones han corrido procedimientos relacionados con; pero en este caso que intento escribir sobre la estructura, me salen estos errores.
Dejo el código de estos segmentos en vb.net y espero puedan ayudarme, saludos y gracias por la atencion!!
Codigo de la estructura en .net (segun yo):
Código vb.net:
Ver original
<StructLayout(LayoutKind.Auto, Size:=26, CharSet:=CharSet.Auto)> _ Public Structure NETINFO <FieldOffset(0)> _ Public ID As Integer <FieldOffset(4)> _ Public IP() As Byte <FieldOffset(8)> _ Public Mask() As Byte <FieldOffset(12)> _ Public Gateway() As Byte <FieldOffset(16)> _ Public ServerIP() As Byte <FieldOffset(20)> _ Public Mac() As Byte Public Sub Start() ReDim IP(3) ReDim Mask(3) ReDim Gateway(3) ReDim ServerIP(3) ReDim Mac(5) End Sub End Structure 'llamada de la fn a la DLL <DllImport("Libreria.DLL", CharSet:=CharSet.Auto)> _ Public Function CKT_GetDeviceNetInfo(ByVal Serial As Integer, _ <MarshalAs(UnmanagedType.Struct)> ByRef PNetInfo As NETINFO) As Integer End Function 'llamada de la fn ya en la app Private Sub infonet_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles infonet.Click ip1.Clear() mask1.Clear() gate1.Clear() srv1.Clear() mac1.Clear() Dim ret As Integer Dim Devnetinfo As New NETINFO Devnetinfo.Start() Try ret = CKT_GetDeviceNetInfo(Lector, Devnetinfo) 'AQUI ES DONDE REVIENTA EL ERROR, CLARO VA AL CATCH... Catch ex As Exception End Try End Sub