IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Pointer sur un champ d'une structure/classe


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 84
    Par défaut Pointer sur un champ d'une structure/classe
    Bonjour

    J'ai une structure qui contient des données continuellement rafraichies. Elle est dans une DLL dont je ne peux pas modifier le code
    Je cherche à créer une procédure qui permet d'en lire n'importe quelle valeur. Je ne sais pas à l'avance quelle variable va être lue.

    J'ai tenté ce type de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    'partie dans la DLL fournie
           Structure struct_READ
                   Dim champ_a As Integer
                   Dim champ_b As String
           End Structure
           Dim READABLE As New struct_READ ' instancie la structure
           ... Les variables de l'objet READABLE sont mises à jour ...
     
    ' Procédure generique qui permet de lire n'importe quelle valeur de ma structure
    Private Sub READ_ONE_VALUE(ByRef my_field As object)
            MsgBox(my_field.ToString)
    End Sub
     
    'Appel de la procédure pour lire un champs
    Private Sub test_me()
            READ_ONE_VALUE(READABLE.champ_a) ' le problème est là, cela envoi la valeur de la variable et non son adresse
    End Sub
    Le soucis c'est qu'une fois que j'appelle la SUB test_me, la valeur reste figée --> champs_a est un integer et c'est sa valeur qui est copiée par l'adresse de l'object. Il faudrait utiliser un pointeur mais je ne suis pas sûr de bien m'y prendre (genre avec IntPtr).

    Avez-vous une idée pour manipuler l'objet (la variable) et non sa valeur ?

    Merci pour vos conseils

    Dan

  2. #2
    Membre éprouvé
    Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2010
    Messages : 127
    Par défaut
    Un struct est un type valeur, une classe est un type référence

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 84
    Par défaut
    Merci pour ton retour cela explique pourquoi je n'arrive pas à manipuler la référence de ma variable.

    Devant faire avec cette structure je n'ai donc pas d'autres choix que d'utiliser un pointeur.
    Je vais me pencher sur IntPtr en particulier sur l'article suivant :
    http://www.binaryintellect.net/artic...546cd8fa8.aspx

    Je mettrai ici mon code si j'y parviens.

    Dan

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 84
    Par défaut
    J'ai essayé deux méthodes (avec WriteInt32 et alloc/GCHandle)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    'Tentative de lire un integer dans la structure
    Dim ptr As IntPtr
    ptr = Marshal.AllocHGlobal(4)
    Marshal.WriteInt32(ptr, READABLE.champ_a)
     
    ...
     
    'lecture de la valeur
    Dim new_integer As Integer = Marshal.ReadInt32(ptr) 'valeur correcte mais fixe
    J'obtiens bien la valeur mais uniquement celle du départ. Si entre temps la valeur dans la structure évolue, elle ne change pas au niveau du pointeur.
    Même comportement avec alloc/GCHandle.

    Je me suis aperçu que l’adresse du pointeur est différente à chaque mise à jour de la valeur de la variable. Le pointeur sur la variable n'est donc pas utilisable.
    Merci pour votre aide

    Dan

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    reflection ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 84
    Par défaut
    Merci de m'avoir orienté sur reflection.

    Cela fonctionne. Je précise que mon objet contient des structures imbriquées ce qui m'oblige à parcourir en deux fois:
    1 - Une fois pour trouver les objets qui le compose
    2 - Pour chaque objet trouvé, en extraire ses propriétés et ses valeurs

    Cela donne le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim My_object As Type = My_DLL.My_Object.GetType() 'L'objet contenant des structures avec des propriétés
     For Each Nested_Type As Type In FindNestedTypes(My_object) ' récupére chaque structure de mon object
                Dim my_properties As PropertyInfo() = Nested_Type.GetProperties ' recupere la liste des propriétés de la structure
                For Each property_element As PropertyInfo In my_properties
                    'on extrait le nom de la propriété et sa valeur
                    Dim name As String = property_element.Name
                    Dim value As String = property_element.GetValue(My_DLL.My_Object.SIM, Nothing).ToString()
                    End If
                Next
    Next
    Ca fonctionne très bien même. le code demande de l'optimisation pour ne pas trop plomber les perfs.

    je clos le thread.

    Merci encore

    Dan

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Itérer sur les champs d'une classe
    Par LGnord dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 27/05/2013, 17h46
  2. Réponses: 2
    Dernier message: 25/08/2011, 17h43
  3. Réponses: 1
    Dernier message: 02/06/2009, 17h50
  4. Réponses: 2
    Dernier message: 19/03/2008, 15h35
  5. contrainte sur deux champs d'une table
    Par bdkiller dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 17/09/2004, 18h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo