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

VC++ .NET Discussion :

Utilisation correcte de StructureToPtr


Sujet :

VC++ .NET

  1. #1
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut Utilisation correcte de StructureToPtr
    Bonjour,

    (Visual Studio 2005)

    J'ai une classe déclarée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public ref class MyClass{ ... }
    Je voudrais récupérer un pointeur void * d'une instance de cette classe. J'ai donc procédé ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // je crée un IntPtr alloué avec la taille de l'objet dont je veux récupérer un pointeur
    int rawsize =  sizeof( this );
    IntPtr objectAddress = System::Runtime::InteropServices::Marshal::AllocHGlobal( rawsize ); 
     
    // je convertis mon objet en IntPtr
    System::Runtime::InteropServices::Marshal::StructureToPtr(this, (IntPtr)objectAddress, true);  
     
    // et hop j'ai mon pointeur
    void * ptr = (void *)objectAddress;
    Mais à l'éxécution du StructureToPtr j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Additional information: La structure spécifiée doit être blittable ou avoir des informations de disposition.
    De ce que j'ai compris, les variables blittable sont de type simple (bool, int, etc).

    Et effectivement ma classe contient des objets de classe plus complexe. Donc elle n'est pas blittable ? Je fais comment alors ?

    De plus pourquoi doit-on allouer de la mémoire pour récupérer un pointeur sur un objet qui est déjà alloué ?

    Merci.

    Flo.

  2. #2
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Je réponds à ma propre question (il faut en fait passer par GCHandle) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
           MyClass ^ myObj = gcnew MyClass();
           GCHandle gcHandle = GCHandle::Alloc(myObj );
           void * objectAddress = (void *)GCHandle::ToIntPtr(gcHandle);
    Et son correspondant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	// void * objectAddress;
    	GCHandle gcHandle = GCHandle::FromIntPtr((IntPtr)objectAddress);
    	MyClass ^ myObj = (MyClass ^)gcHandle.Target;
    Merci. A+

    Flo.

  3. #3
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    tu peux aussi utiliser les classes de marshal, comme Marshal.AllocHGlobal

    voir http://blog.developpez.com/index.php...&c=1&tb=1&pb=1

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 16/08/2007, 11h40
  2. [GRASP] Est-ce que j'utilise correctement les design pattern?
    Par Tourix dans le forum Design Patterns
    Réponses: 7
    Dernier message: 21/06/2006, 18h27
  3. comment utiliser correctement les sessions?
    Par cladsam dans le forum Langage
    Réponses: 5
    Dernier message: 06/02/2006, 11h56
  4. [C#] Comment utiliser correctement Stream.Read ?
    Par ArChAnGe76 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 20/12/2005, 20h48
  5. Comment utiliser correctement le debugger de DevCPP
    Par Le Furet dans le forum Dev-C++
    Réponses: 2
    Dernier message: 29/09/2005, 09h56

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