Marshalling

30/08/2004 - 18:01 por AJPB | Informe spam
Tengo las siguientes clases en un Modulo

Class MiClaseA
Public ClaseHija as New MiClaseB
End Class

Class MiClaseB
Public ValorB as Integer = 100
End Class

Ahora, tengo un control al cual le puedo pasar
MiClaseA.ClaseHija por referencia

Class MiControl

Public Clase as Object

Sub UsarClase(ByRef CualquierClase as Object)
Clase = CualquierClase
End Sub

End Class

Por lo tanto digo:

MiControl(MiClaseA.MiClaseHija)

Y luego puedo ver el ValorB usando MiControl

TextBox1.text = MiControl.Clase.ValorB ( Muestra 100 )

El problema viene ahora, hago un Marshal

Marshal.PtrToStructure(pMem,MiClaseA) donde hay un nuevo
valor para ValorB digamos 50

asi que:

TextBox1.text = MiControl.Clase.ValorB deberia mostrarme
50, pero no... sigue el 100!

pero en cambio si digo:

TextBox1.text = MiClaseA.MiClaseHija.ValorB si veo el
nuevo valor, el 50!

Es como si despues del Marshal tuviese otra referencia
nueva a MiClase, diferente a la de MiControl que sigue
usando la vieja, tengo que volver a pasarle la clase para
que funcione:

MiControl(MiClaseA.MiClaseHija)

No quiero hacer eso, quiero que despues del Marshal
MiControl vea el nuevo dato en MiClase sin tener que
pasarle la clase otra vez

Alguna idea?

Gracias

AJPB

Preguntas similare

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP VB]
30/08/2004 - 19:07 | Informe spam
¿Por que estas haciendo esto?

Marshal.PtrToStructure(pMem,MiClaseA)



Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
Respuesta Responder a este mensaje
#2 AJPB
30/08/2004 - 21:49 | Informe spam
Bueno es un cuento largo, estoy leyendo datos de unos
equipos de control, la gente que hizo la parte de
adquisicion utiliza marshal luego de desempaquetar los
mensajes para imprimir los nuevos valores sobre una
estructura ya definida en una clase, ( yo no se si esa es
la mejor forma, soy nuevo en .Net, pero ya esta hecho
asi :/ )

Class Motor
Public Amperaje as Single
Public Velocidad as Single
End Class

Funciona bien, ahora yo necesito agregar en la
clase "Motor" otra clase ademas, que se llame, "Alarmas"
por ejemplo asi:

Class Motor
Public Amperaje as Single
Public Velocidad as Single

Public Alarmas as New AlarmasMotor

End Class

Class AlarmasMotor
Public De_Amperaje as Integer
Public De_Velocidad as Integer
End Class

Public Shared MotorCls as New Motor


La estructura que voy a copiar usando Marshal es exacta a
la de "Motor", solo que tiene valores diferentes para sus
miembros ( los actuales que me mandan los equipos de
control ).

pMem = tiene la nueva estructura con nuevos valores
provenientes de los equipos

Marshal.PtrToStructure(pMem,MotorCls)

Ahora tengo nuevos valores para Velocidad y Amperaje, el
problema lo tengo en las alarmas pues parece que luego que
se hace el Marshal, cambia la direccion de memoria en
donde esta alojada esa estructura, no se porque!

Ejemplo:

Form1.Tag = Motor.Alarmas ( apunto el campo tag de Form1 a
esa direccion )

Aqui se hace el Marshal



Form1.Tag.De_Velocidad = Me da el valor viejo!

Motor.Alarmas.De_Velocidad = Me da el nuevo valor!

Ok bueno, vuelvo a apuntar el campo Tag



Form1.Tag = Motor.Alarmas

Form1.Tag.De_Velocidad = Ahora si me da el nuevo valor!

Asi que sospecho que el Marshal me esta copiando la nueva
estructura "Alarmas" en otra posicion de memoria y deja la
anterior ( que es a la que apunta el campo Tag ). Claro
podria apuntar Form1.Tag a Motor y no ha Motor.Alarmas, y
asi funciona, pero por otras razones no me es factible asi.

Si leiste hasta aqui gracias!

Salu2

AJPB


¿Por que estas haciendo esto?

Marshal.PtrToStructure(pMem,MiClaseA)



Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo


.

Respuesta Responder a este mensaje
#3 Eduardo A. Morcillo [MS MVP VB]
31/08/2004 - 04:01 | Informe spam
Es que se crea una nueva instancia de la clase AlarmasMotor al copiar desde
de la memoria y en la propiedad tag del formulario queda una referencia al
objeto anterior. Por eso son diferentes. Lo que puedes hacer es guardar la
referencia a Motor en la propiedad Tag.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida