Saludos a todos, tengo un problema un poco dificil, trataré de explicarlo lo más sencillo y completo posible:
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 originalPrivate 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 originalPublic 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