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 :

Echange d'objet entre classe manag�e et non manag�e


Sujet :

C++/CLI

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    D�tails du profil
    Informations personnelles :
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Par d�faut Echange d'objet entre classe manag�e et non manag�e
    Bonjour,

    Voici mon soucis :
    J'ai une classe non manag�e qui fait appel � un objet d'une classe manag�e...

    ex
    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
     
    class A_unmanaged
    {
      ...
      int ma_fonctionA();
    }
    ...
     
    ref class B_managed
    {
     
         ...
      int ma_fonctionB(String ^ Var);
    }
    ...
     
    int  A_unmanaged::ma_fonctionA()
    {
     
        gcroot<B_managed ^> monB = gcnew B_managed(); //Ici tout va bien , mon objet est créée...
     
        gcroot<String ^> monParam = "YOUPIE";
     
       monB->ma_fonctionB(monParam);  //Ici ca va encore, c'est dans la fonction que va planter
    }
     
    ...
    int B_managed::ma_fonctionB(String ^ Var)
    {
       //Ici dès que j'essaie de faire qqchose avec Var (qui vient de monParam), ca plante !!
    }
    Donc, voil�, le param�tre cr��e dans ma fonction non-manag�e n'est pas exploitable dans ma fonction manag�e...

    Une id�e ?

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Essaie avec L"YOUPIE", puis avec gcnew String(L"YOUPIE") si �a ne marche toujours pas...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    D�tails du profil
    Informations personnelles :
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Par d�faut
    Et non, ca ne fonctionne pas...

    Une autre id�e ?

    Je suppose que la variable instanci�e dans la partie non manag�e n'est pas disponible dans la partie manag�e...mais il me semblait qu'un passage de param�tre cr�er une copie de l'objet...

    Maintenant, est-ce que la copie entre la pile standard et la pile manag�e est possible ?
    D'autant qu'il s'agit de "String ^" donc de "r�f�rence" (entre guillemets car je ne sais pas trop ce que signifie r�ellement le "^" )...
    J'ai essay� en passant des CString en param�tre, j'ai le m�me soucis...

    Une autre id�e ?

  4. #4
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    D�tails du profil
    Informations personnelles :
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Par d�faut
    J'ai essay� sur une autre fonction avec des int, ca marchait tres bien...

  5. #5
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Au fait : M�me si ta classe elle-m�me n'est pas manag�e, si tu n'as pas mis de #pragma unmanaged, le code est toujours manag�.

    Donc, tu devrais pouvoir y utiliser directement un B_managed^ et un String^, sans passer par gcroot<>.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    D�tails du profil
    Informations personnelles :
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Par d�faut
    Ma classe est #pragma managed ...mais ce n'est pas une "ref class" ...

    Et si je ne fais pas de gcroot<> ca ne marche pas...c'est le seul moyen d'utiliser des objets "ref class" dans une "class" normale (sachant que mon objet de type B_managed est en fait une donn�e membre de A_unmanaged)

    Mais ce qui est super bizarre, c'est que j'ai exactement le meme fonctionnement entre ma classe A_unmanaged et une classe C_managed, qui marche nickel et avec B_managed, ca ne marche pas.... je ne comprends pas..

    Certainement une erreur stupide que je ne vois plus...

  7. #7
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Ce code compile parfaitement sans gcroot avec /clr...
    Code C++/CLI : 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"
    using namespace System;
     
    class A_unmanaged
    {
    public:
    	int ma_fonctionA();
    };
     
    ref class B_managed
    {
    public:
    	int ma_fonctionB(String ^ Var);
    };
     
    int A_unmanaged::ma_fonctionA()
    {
    	B_managed ^ monB = gcnew B_managed(); //Ici tout va bien , mon objet est créée...
    	String ^ monParam = "YOUPIE";
     
    	monB->ma_fonctionB(monParam);  //Ici ca va encore, c'est dans la fonction que va planter
    	return 0;
    }
     
    int B_managed::ma_fonctionB(String ^ Var)
    {
    	//Ici dès que j'essaie de faire qqchose avec Var (qui vient de monParam), ca plante !!
    	if(Var != nullptr)
    		Console::WriteLine(Var);
    	return 0;
    }
     
    void TestManaged(void)
    {
    	A_unmanaged a;
    	a.ma_fonctionA();
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    D�tails du profil
    Informations personnelles :
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Par d�faut
    Essaie la meme chose en mettant ton objet B_managed en donn�es membres de ta classe A_unmanaged pour voir ...

  9. #9
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    D�tails du profil
    Informations personnelles :
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Par d�faut
    Bon effectivement, si mon objet B_managed n'est plus une donn�e membre et que donc, je peux me passer du gcroot..et bien ca fonctionne...

    L� o� je ne comprends pas c'est que dans mon appli je faisais la m�me chose avec une classe C_managed qui �tait donn�e membre et d�clar�e avec gcroot et tout fonctionne....

    Enfin, bon, je peux me passer de B_managed comme donn�e membre donc c'est bon... Merci beaucoup

  10. #10
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Pour les donn�es membres en effet, il faut utiliser gcroot.
    Et �a marche...
    Code C++/CLI : 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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #include "stdafx.h"
    #include <vcclr.h>
    #include "TestManaged.h"
    using namespace System;
     
    ref class B_managed
    {
    public:
    	int ma_fonctionB(System::String ^ Var);
    };
     
    class A_unmanaged
    {
    public:
    	A_unmanaged();
    	int ma_fonctionA();
    private:
    	gcroot<B_managed ^> monB;
    	gcroot<String^> maString;
    };
     
     
    A_unmanaged::A_unmanaged()
     : monB(gcnew B_managed), maString("COUCOU")
    {
    }
     
    int A_unmanaged::ma_fonctionA()
    {
    	String ^ monParam = "YOUPIE";
     
    	monB->ma_fonctionB(maString);
    	monB->ma_fonctionB(monParam);
     
    	int val = 0;
    	try{
    		val = Convert::ToInt32(maString);
    	} catch(FormatException^) {
    		val = 0;
    	}
    	val++;
    	maString = val.ToString();
    	return 0;
    }
     
    int B_managed::ma_fonctionB(String ^ Var)
    {
    	//Ici dès que j'essaie de faire qqchose avec Var (qui vient de monParam), ca plante !!
    	if(Var != nullptr)
    		Console::WriteLine(Var);
    	return 0;
    }
     
     
    void TestManaged(void)
    {
    	A_unmanaged a;
    	a.ma_fonctionA();
    	a.ma_fonctionA();
    	a.ma_fonctionA();
    }
    Produit en sortie:
    Code X : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    COUCOU
    YOUPIE
    1
    YOUPIE
    2
    YOUPIE
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    D�tails du profil
    Informations personnelles :
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Par d�faut
    Et si tu d�clares et instancies MaString dans ta fonction , donc pas comme une donn�e membre, ca fonctionne aussi ?

    (Meme si j'ai trouv� une solution, j'essaie de comprendre mon erreur)

    EDIT : ah oui, c'est ce que tu as fait avec "YOUPIE" ... bon...je ne comprends pas...


    RE-EDIT : Ca ne marche encore pas d�s que j'essaie d'utiliser la variable...je vais m'a�rer un peu et revenir sur mon code..

  12. #12
    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
    Par d�faut
    tu veux faire quoi au juste ?

  13. #13
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    D�tails du profil
    Informations personnelles :
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Par d�faut
    JE veux faire exactement ce qui est dans l'exemple...

    Appeller une fonction d'un objet manag� depuis une fonction d'un objet non manag�e...

    Mais ca parait super simple, en plus je l'ai d�j� fait dans une autre partie de mon code avec un passage de "int". Mais dans mon deuxi�me cas, ca ne marche pas..

    Et � vrai dire, ca fait 10x que je v�rifie mon code, et je ne vois pas o� j'ai pu me tromper.. ca plante d�s que j'essaie d'acc�der au param�tre de ma fonction manag�e..
    ( si je fais :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    int ma_fonctionB(String ^ Var)
    {
       return 1;
    }
    ca marche alors que si je fais
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int ma_fonctionB(String ^ Var)
    {
       if (Var != nullptr) //Ca ou meme < if(Var == "") > par exemple
        return 0;
      else
        return 1;
    }
    ca plante...

    J'ai alors penser que c'�tait le type String ^ qui avait du mal � �tre transmis en param�tre en non manag� et manag�e, mais le test que l'on a fait hier semble me prouver le contraire.

    Ce qui veut dire que mon errreur est ailleurs, dans la conception de ma classe o� quelquechose comme ca....
    J'ai la t�te plus fraiche ce matin, je devrais pouvoir trouver....

  14. #14
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Attention : Var == nullptr n'est pas du tout la m�me chose que Var ==""
    N'oublie pas que l'op�rateur == est surcharg� pour les String^...

    Pourrais-tu poster un exemple compilable minimal qui montre le probl�me ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    D�tails du profil
    Informations personnelles :
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Par d�faut
    Citation Envoy� par M�dinoc
    Attention : Var == nullptr n'est pas du tout la m�me chose que Var ==""
    Ca je sais, c'�tait juste pour montrer que d�s que j'essaie de m'en servir, ca plante...
    Si je fais Var += " TEST" ca va planter aussi...

    Non, mais clairement, vu le nombre de test que j'ai fait, je pense que l'erreur est ailleurs et que je passe compl�tement � cot�...

  16. #16
    Membre confirm�
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    D�tails du profil
    Informations personnelles :
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Par d�faut
    Bon, je savais bien que c'�tait une connerie...

    En fait, quand je cr�ais mon ex�cutable je faisais "G�n�rer > G�n�rer MonTest" donc il ne r�compiler que les fichiers modifi�s...

    En fait, il faut qu'� chaque modification, je fasse bien "G�n�rer > REg�n�rer MonTest" ... sans doute qu'� ce moment il cr�e les passerelles ad�quates entre la pile manag�e et la zone m�moire non manag�e..

    Ca explique pourquoi je tournais en rond, un coup ca marchait, puis ca ne marchait plus...tout d�pendait de ma m�thode de compilation (compl�te ou incr�mentielle...) ..

    Donc, un conseil, si faite du C++/CLI en mode mixte , �vitez les compilations incr�mentielles !!!

Discussions similaires

  1. [EJB] echange d'objet entre des javabeans
    Par archer dans le forum Java EE
    R�ponses: 0
    Dernier message: 30/09/2010, 15h13
  2. Communication entre C# et C++ non manag�
    Par MottetCCSF dans le forum C#
    R�ponses: 0
    Dernier message: 13/07/2009, 17h27
  3. Echange d'objets entre web applications
    Par manube dans le forum D�veloppement Web en Java
    R�ponses: 2
    Dernier message: 13/11/2007, 11h01
  4. partager un objet entre classes
    Par kirua2150 dans le forum Access
    R�ponses: 5
    Dernier message: 26/01/2007, 11h33
  5. R�ponses: 7
    Dernier message: 07/01/2007, 13h50

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