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

Windows Forms Discussion :

Utilisation de copymemory


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 39
    Par défaut Utilisation de copymemory
    Bonjour,
    je recherche une solution pour utiliser copymemory voici mon code :

    j'ai une structure du type qui se situe dans la classe C_Struc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Public Structure ST1
     
       Public Int1 As Integer
     
       Public long1 As Long
     
       Public long2 As Long
     
    End Structure


    je souhaite réaliser un copymemory de cette structure pour cela je fait :

    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
     
    Dim tab_Byte() As Byte
     
    Dim St1 As C_Struc.ST1
     
    'je renseigne ma structure
    St1.Int1 = 14
     
    St1.long1 = -140
     
    St1.long2 = -33
     
    ReDim tab_Byte(9)
     
     
    'et je réalise la copy
    CopyMemory(tab_Byte(0), St1, 10)
    Je ne retrouve pas mes éléments de ma structure sous tab_byte!!!!???
    Help Me.

    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tu parles de l'API Windows CopyMemory ? Tu l'as déclarée comment ?

    Essaie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CopyMemory(tab_Byte, St1, 10)

  3. #3
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Dur de copier de la mémoire quand c'est des structs. Les structure en .NET ont une grande différence avec les classes c'est qu'elles sont passée par valeur et pas par référence (en gros, quand tu passe en argument un struct à une méthode, la valeur est copiée vers la méthode et si cette dernière modifie la valeur la structure d'origine n'est pas changée). De ce fait, changer la valeur d'origine c'est dur avec des valeur en références, alors deux moyens, soit passer la structure ByRef à une méthode de copie, soit changer les structure en class (en pratique ça va pas changer grand chose normalement).

    Sinon comment copier la mémoire d'une classe vers une autre ? (en supposant que la classe ne contienne que des champs de taille fixe) :
    Code c# : 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
    18
    19
    20
    21
     
    public virtual void CopyStructs(object a, object b)
            {
                if (a == null || b == null)
                    throw new ArgumentNullException(a == null ? "a" : "b");
                else if (a == b)
                    throw new InvalidOperationException("a = b");
                else if (Marshal.SizeOf(a) != Marshal.SizeOf(b))
                    throw new InvalidOperationException("Ce cas n'a pas été prévu");
     
                IntPtr mem = Marshal.AllocHGlobal(Marshal.SizeOf(a));
                try
                {
                    Marshal.StructureToPtr(a, mem, true);
                    Marshal.PtrToStructure(mem, b);
                }
                finally
                {
                    Marshal.FreeHGlobal(mem);
                }
            }

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    bizarre, j'aurais dit exactement le contraire concernant les structs et les classes... on peut assez facilement copier des structs, mais pas des classes

    De toutes façons l'objectif est de copier la structure dans un tableau de bytes, pas dans une autre struct. Avec la classe Marshal on peut faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim s As Integer = Marshal.SizeOf(St1)
    Dim ptr As IntPtr = Marshal.AllocHGlobal(s)
    Marshal.Copy(ptr, tab_Byte, 0, s)
    Mais bon, quelque part c'est un peu bizarre de passer par de la mémoire non managée pour copier des données entre 2 objets managés... Il y a sans doute un meilleur moyen

  5. #5
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Citation Envoyé par tomlev Voir le message
    bizarre, j'aurais dit exactement le contraire concernant les structs et les classes... on peut assez facilement copier des structs, mais pas des classes

    De toutes façons l'objectif est de copier la structure dans un tableau de bytes, pas dans une autre struct. Avec la classe Marshal on peut faire comme ça :
    PFFFFFFFFFFFFFFFFFFF
    Je suis fatigué, j'ai vu qu'il voulais copier une struct vers une autre, et là c'est frustrant. Copier une struct vers un byte[], ça c'est facile.
    Et dans ce cas, j'ai déjà donné tout ce qu'il faut ici :
    http://www.developpez.net/forums/d65...ct-via-reseau/
    (cf. Classe StructGetter)

    Citation Envoyé par tomlev Voir le message
    Mais bon, quelque part c'est un peu bizarre de passer par de la mémoire non managée pour copier des données entre 2 objets managés... Il y a sans doute un meilleur moyen
    Quand on travail avec des structs, Marshal est très pratique et très rapide alors pourquoi s'en passer ? d'ailleurs il n'y a pas de moyen facile de convertir un struct en byte sans ça.

  6. #6
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 39
    Par défaut
    Merci pour toute vos réponses.
    J'ai résumé tout ca dans 2 fonctions :

    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
    18
    19
    20
     
        Public Function StructToByteArray(ByVal Struct As Object) As Byte()
            Dim StructSize As Integer = Marshal.SizeOf(Struct)
            Dim StructPrt As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(Struct))
            Dim StructBytes() As Byte = CType(Array.CreateInstance(GetType(Byte), StructSize), Byte())
            Marshal.StructureToPtr(Struct, StructPrt, False)
            Marshal.Copy(StructPrt, StructBytes, 0, StructSize)
            Marshal.FreeHGlobal(StructPrt)
            Return StructBytes
        End Function
        Public Function ByteArrayToStruct(ByVal tableauByte() As Byte, ByVal StrucTType As Type, ByVal size As Integer) As Object
            Dim p As IntPtr = Marshal.AllocHGlobal(size)
            Dim Result As Object
     
            Marshal.Copy(tableauByte, 0, p, size)
            Result = Marshal.PtrToStructure(p, StrucTType)
            Marshal.FreeHGlobal(p)
     
            Return Result
        End Function

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

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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