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

C++/CLI Discussion :

Passage objet manag� � une callback appel�e par une dll native


Sujet :

C++/CLI

  1. #1
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 21
    Par d�faut Passage objet manag� � une callback appel�e par une dll native
    Bonjour � tous,

    Pb assez sp�cifique d'o� l'intitul� qui fait 20bornes

    Je d�veloppe un projet Windows Form en c++ manag� qui n�cessite l'utilisation d'une dll native.

    Celle-�i contient une m�thode du type :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    void addCallback(void* object, void (*returnValueCallback)(void*, int));
    Voici l'interface de mon objet manag� :

    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
     
    #pragma once
     
    #include "cli_ptr.h"
     
    using namespace System;
    using namespace System::Windows::Forms;
     
    public ref class MonObjet
    {
    public:
    	MonObjet(String^ name, String^ ip, int port);
    	~MonObjet();
     
    	String^ m_name;
    	String^ m_ip;
    	int m_port;
     
    };
    et l'impl�mentation :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    #include "stdafx.h"
    #include "MonObjet.h"
     
    void callback_portMonObjetValueChanged(void* baton, int port);
     
    MonObjet::MonObjet(String^ name, String^ ip, int port)
    {
    	m_name = name;
    	m_ip = ip;
    	m_port = port;
     
    	shared_ptr<cli_ptr<MonObjet>> ptr = cli_ptr<MonObjet>::Create(this);
    	void* objetVoid = ptr->GetNative();
     
    	maDll->addCallback(objetVoid , &callback_portMonObjetValueChanged);
     
    }
     
    MonObjet::~MonObjet()
    {
     
    }
     
    ///////////////////////////////////////////////////////////
    //Callbacks
    ///////////////////////////////////////////////////////////
     
    void callback_portMonObjetValueChanged(void* objet, int port)
    {
    	// get the managed object
    	shared_ptr<cli_ptr<MonObjet>> ptr2 =  cli_ptr<MonObjet>::Create(objet);
    	MonObjet^ monObjet= ptr2->GetManaged<MonObjet>();
     
    	// update the MonObjet port attribute
    	monObjet->m_port = port;
    }
    Pour convertir mon O.M. en void* (qui sera en fait le premier arg du callback appel� par ma dll) et vice-versa j'utilise la merveilleuse classe "cli_ptr" que j'ai trouv� sur le blog de Paslatek http://www.paslatek.net/shared_ptr-o...090909-23.aspx

    Mon pb : impossible de r�cup la bonne instance de MonObjet dans le callback
    Je r�cup�re bien un Objet du type MonObjet mais impossible d'acc�der � ses membres, monObjet est nullptr !

    Je pr�cise que la classe "cli_ptr" fonctionne si je l'utilise simplement, sans passer par la dll native.

    Ce que je veux faire est il possible ?
    Si oui j'ai du faire une bourde qlq part...
    Qlq'un a-t-il une id�e svp ?

  2. #2
    Membre chevronn�

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de D�me (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par d�faut
    Salut,

    Et �a, �a peut t'aider?? C'est dans la FAQ : Comment utiliser des objets manag�s dans une classe native ?


    Oups,
    Je me rends compte que je suis hors sujet, ici il s'agit de cr�er un nouvel objet, pas de le transformer...
    Toutes mes excuses...

  3. #3
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 21
    Par d�faut
    Salut bertry,

    Je me rends compte que je suis hors sujet, ici il s'agit de cr�er un nouvel objet, pas de le transformer...
    Oui effectivement ce n'est pas ce que je recherche, je veux juste convertir l'instance de mon objet manag� en void* pour le passer � ma dll et la re-convertir en instance d'objet manag� dans le callback appel� par ma dll pour effectuer un traitement dessus.

    Je r�cup�re bien un void* non nul dans ce callback mais lorsque je veux faire la conversion inverse, l'objet que j'obtiens est � "valeur non d�finie" :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    // get the managed object
    	shared_ptr<cli_ptr<MonObjet>> ptr2 =  cli_ptr<MonObjet>::Create(objet);
    	MonObjet^ monObjet= ptr2->GetManaged<MonObjet>();
    Je me demande si je ne perds pas l'adresse de l'instance de mon objet due � la diff�rence d'allocation entre du code manag� et du code natif...

    Mais merci quand m�me pour ton post bertry !
    Ca ne peut que faire avancer le schmilblik

    Quelqu'un d'autre aurait une id�e svp ?

  4. #4
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 21
    Par d�faut
    Bon j'ai trouv� une solution de contournement en parcourant la FAQ, merci encore nico-pyright !

    Je cr�e finalement une classe native "de ma classe manag�e" qui va faire le dialogue avec ma dll native, et plus de pb de passage de callbacks

    Je passe � ma classe native une instance de mon manag� avec gcroot pour y avoir acc�s et le tour est jou� !

    Pour ceux qui auront un pb similaire, voici le code du .h:

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    #pragma once
     
    using namespace System;
    using namespace System::Windows::Forms;
     
    class MonObjetNatif;
     
    public ref class MonObjet
    {
    public:
    	MonObjet(String^ name, String^ ip, int port);
    	~MonObjet();
     
    	String^ m_name;
    	String^ m_ip;
    	int m_port;
     
    };
     
    class MonObjetNatif
    {
    public:
             MonObjetNatif(MonObjet^ monObjet);
    	~MonObjetNatif();
     
             void setPort(int port)
            {
               m_objetManage->m_port = port;
            };
     
    private:
             gcroot<MonObjet^>  m_objetManage;
    }
    De cette fa�on je passe directement l'instance de mon objet natif au callback appel� par ma dll dans lequel j'appelle la m�thode setPort(...).

  5. #5
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    Par d�faut
    La solution marche car vous utilisez une r�f�rence manag�, le "^" de MonObjet^.

    Le probl�me n'est pas trop un probl�me de mapping, mais que les objets .NET change souvent de place en m�moire pour des probl�matiques de garbage collection.

    Donc �vitez les void* sur des objets .NET.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 12
    Dernier message: 11/09/2012, 19h48
  2. Appel d'une classe Java par une page HTML
    Par kqman dans le forum G�n�ral Java
    R�ponses: 7
    Dernier message: 06/04/2011, 14h58
  3. Variable dans une fonction appel�e par une autre fonction
    Par CyrilD dans le forum G�n�ral JavaScript
    R�ponses: 7
    Dernier message: 21/12/2010, 13h42
  4. Appel d'une fonction C++ par une DLL en C
    Par oodini dans le forum C++
    R�ponses: 4
    Dernier message: 03/02/2009, 14h44
  5. Appel d'une s�quence sonore par une fonction
    Par Henri dans le forum Code::Blocks
    R�ponses: 1
    Dernier message: 05/11/2007, 01h55

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