Foros del Web » Programación para mayores de 30 ;) » .NET »

Operaciones de memoria NO ADMINISTRADA

Estas en el tema de Operaciones de memoria NO ADMINISTRADA en el foro de .NET en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 09/02/2010, 14:40
Avatar de neo101  
Fecha de Ingreso: julio-2007
Mensajes: 73
Antigüedad: 16 años, 8 meses
Puntos: 1
Exclamación Operaciones de memoria NO ADMINISTRADA

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 original
  1. Private Sub Command2_Click() 'obtener la información de red del disp. conectado
  2.    Dim devnetinfo As NETINFO
  3.     If CKT_GetDeviceNetInfo(reader, devnetinfo) Then
  4.         msg$ = "IP: " & devnetinfo.IP(0) & "." & devnetinfo.IP(1) & "." & devnetinfo.IP(2) & "." & devnetinfo.IP(3) & Chr$(10)
  5.         msg$ = msg$ + "Mask: " & devnetinfo.Mask(0) & "." & devnetinfo.Mask(1) & "." & devnetinfo.Mask(2) & "." & devnetinfo.Mask(3) & Chr$(10)
  6.         msg$ = msg$ + "Gate: " & devnetinfo.Gateway(0) & "." & devnetinfo.Gateway(1) & "." & devnetinfo.Gateway(2) & "." & devnetinfo.Gateway(3) & Chr$(10)
  7.         msg$ = msg$ + "Server: " & devnetinfo.ServerIP(0) & "." & devnetinfo.ServerIP(1) & "." & devnetinfo.ServerIP(2) & "." & devnetinfo.ServerIP(3) & Chr$(10)
  8.         msg$ = msg$ + "MAC: " & devnetinfo.MAC(0) & "." & devnetinfo.MAC(1) & "." & devnetinfo.MAC(2) & "." & devnetinfo.MAC(3) & "." & devnetinfo.MAC(4) & "." & devnetinfo.MAC(5) & Chr$(10)
  9.         MsgBox(msg$)
  10.     End If
  11. 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
  1. Public Type NETINFO
  2.    ID          As Long
  3.    IP(3)       As Byte
  4.    Mask(3)     As Byte
  5.    Gateway(3)  As Byte
  6.    ServerIP(3) As Byte
  7.    MAC(5)      As Byte
  8. 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
  1. <StructLayout(LayoutKind.Auto, Size:=26, CharSet:=CharSet.Auto)> _
  2.     Public Structure NETINFO
  3.         <FieldOffset(0)> _
  4.         Public ID As Integer
  5.         <FieldOffset(4)> _
  6.         Public IP() As Byte
  7.         <FieldOffset(8)> _
  8.         Public Mask() As Byte
  9.         <FieldOffset(12)> _
  10.         Public Gateway() As Byte
  11.         <FieldOffset(16)> _
  12.         Public ServerIP() As Byte
  13.         <FieldOffset(20)> _
  14.         Public Mac() As Byte
  15.  
  16.         Public Sub Start()
  17.             ReDim IP(3)
  18.             ReDim Mask(3)
  19.             ReDim Gateway(3)
  20.             ReDim ServerIP(3)
  21.             ReDim Mac(5)
  22.         End Sub
  23.  
  24.     End Structure
  25.  
  26. 'llamada de la fn a la DLL
  27.  
  28.  <DllImport("Libreria.DLL", CharSet:=CharSet.Auto)> _
  29.     Public Function CKT_GetDeviceNetInfo(ByVal Serial As Integer, _
  30.     <MarshalAs(UnmanagedType.Struct)> ByRef PNetInfo As NETINFO) As Integer
  31.     End Function
  32.  
  33. 'llamada de la fn ya en la app
  34.  
  35. Private Sub infonet_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles infonet.Click
  36.         ip1.Clear()
  37.         mask1.Clear()
  38.         gate1.Clear()
  39.         srv1.Clear()
  40.         mac1.Clear()
  41.         Dim ret As Integer
  42.         Dim Devnetinfo As New NETINFO
  43.         Devnetinfo.Start()
  44.         Try
  45.             ret = CKT_GetDeviceNetInfo(Lector, Devnetinfo)
  46. 'AQUI ES DONDE REVIENTA EL ERROR, CLARO VA AL CATCH...
  47.         Catch ex As Exception
  48.             MsgBox(ex.Message)
  49.         End Try
  50.         MsgBox("done.")
  51.     End Sub
__________________
Everything that has a beginning, has an end...
  #2 (permalink)  
Antiguo 16/02/2010, 19:03
Avatar de neo101  
Fecha de Ingreso: julio-2007
Mensajes: 73
Antigüedad: 16 años, 8 meses
Puntos: 1
Respuesta: Operaciones de memoria NO ADMINISTRADA

Bueno, pues se que no le sinteresó a muchos pero cierro el tema diciendoles que solucioné este y otros detalles a traves de la clase Marshal, que tiene una serie de metodos para utilizar el monton no administrado de memoria y por ende usarle sin problemas.

Gracias por sus lecturas XD
(Espero esto no cuente como Spam
__________________
Everything that has a beginning, has an end...

Etiquetas: memoria, operaciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:07.