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 :

Mixer natif et manag� en C++/CLI


Sujet :

C++/CLI

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre � l'essai
    Homme Profil pro
    D�veloppeur .NET
    Inscrit en
    Novembre 2013
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2013
    Messages : 6
    Par d�faut Mixer natif et manag� en C++/CLI
    Bonjour,
    Sous Visual Studio 2010, j'ai cr�� un projet C++/CLI qui comporte deux classes : l'une manag�e, l'autre native, respectivement MUCam et NCam.


    La classe manag�e (MUCam.h) d�clare un objet de la classe native NCam de la fa�on suivante : private: NCam * Cam;

    1 - une m�thode "A" de la classe manag�e cr�e l'instance Cam : Cam = &NCam( ref );
    2 - et retourne la valeur de la m�thode Statut de NCam : return = Cam->Statut();
    3 - je constate que le destructeur ~NCam(void) est appel� lors de cette instruction return, AVANT l'appel � la m�thode Statut(). Ce qui signifie aussi que l'objet Cam n'est plus utilisable par la suite :

    Questions :
    1 - Est-il correct de proc�der de cette fa�on en faisant cohabiter les deux classes dans le m�me projet C++/CLI ?
    2 - Si oui, pourquoi le destructeur est-il appel� � cet instant dans la m�thode "A" ?
    3 - Comment instancier et utiliser un objet natif dans une classe manag�e en C++/CLI ? J'avais cru comprendre que ce langage permettait de faire cohabiter les deux mondes...

    J'esp�re avoir �t� assez clair.
    Merci de vos r�ponses.
    Cordialement

  2. #2
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    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 505
    Par d�faut
    Pouvez-vous nous donner la pile d'appel lors de l'appel au destructeur de Cam ?

  3. #3
    Membre � l'essai
    Homme Profil pro
    D�veloppeur .NET
    Inscrit en
    Novembre 2013
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2013
    Messages : 6
    Par d�faut
    Bien volontiers.

    La m�thode d'appel :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    bool MUCam::OpenCamera(unsigned int camera)
    {
    	Cam = &NCam(camera);
    	return Cam->Statut();
    }
    La pile d'appel lors du breakpoint sur le destructeur de Cam :

     	UCamClr.dll!NCam::~NCam() Line 50	C++
    	UCamClr.dll!MUCam::OpenCamera(unsigned int camera) Line 173	C++
     	Test.exe!Test.Form1.Test_Click(object sender, System.EventArgs e) Line 57 + 0x1a bytes	C#
     	[External Code]	
     	Test.exe!Test.Program.Main() Line 18 + 0x1d bytes	C#
     	[External Code]	
    la ligne 173 est celle du return ci-dessus.

    Mais ai-je vraiment le droit d'inclure une classe native et une classe manag�e dans le m�me projet C++/CLI ?
    J'ai vu qu'il fallait d�velopper un wrapper pour passer de l'un � l'autre...

    Merci de votre r�ponse
    Cordialement

  4. #4
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    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 505
    Par d�faut
    Heu, c'est pas plus :
    Mais ai-je vraiment le droit d'inclure une classe native et une classe manag�e dans le m�me projet C++/CLI ?
    C'est tr�s vague votre question.
    Dans certain cas de figure oui, mais normalement, pas dans le votre.

  5. #5
    Membre � l'essai
    Homme Profil pro
    D�veloppeur .NET
    Inscrit en
    Novembre 2013
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2013
    Messages : 6
    Par d�faut
    Non, si j'�cris : Cam = new NCam(camera);
    alors on passe deux fois dans le constructeur de la classe NCam ! Je ne m'explique pas pourquoi.

    Bon, je laisse tomber cette fa�on de faire avec deux classes.
    Je m'oriente vers l'�criture d'un Wrapper vrai. Les premiers essais sont concluants.

    Merci en tout cas d'avoir pris le temps de vous pencher sur cette question.
    Je note la discussion close.
    Cordialement

  6. #6
    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
    Normalement, les wrappers C++/CLI sont bel et bien faits avec deux classes...

    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
    ref class MClass
    {
    	NClass* pNative;
     
    	MClass(/*paramètres*/)
    	{
    		pNative = new NClass(/*paramètres convertis*/);
    	}
    	//Finaliseur: Détruit ressources natives sans toucher à la moindre référence managée, qui peut être invalide
    	!MClass()
    	{
    		delete pNative, pNative=nullptr;
    	}
    	//Destructeur: Équivalent méthode IDisposable::Dispose(): Détruit ressources natives et managées.
    	~MClass()
    	{
    		//Détruire ressources managées puis appeler finaliseur
    		this->!Mclass();
    	}
     
    	void UneMethode() { pNative->UneMethode(); }
    };

    PS: Cam = &NCam(camera); est une horreur: Tu m�morises l'adresses d'un temporaire non-nomm�! Tout aussi grave que retourner l'adresse d'une variable locale.
    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.

Discussions similaires

  1. R�f�rence OCX depuis C++ natif (NON manag�)
    Par cyrille37 dans le forum D�buter
    R�ponses: 8
    Dernier message: 17/03/2010, 15h04
  2. mixer du MFC avec du c++/cli (voire avec C#)
    Par Axiome dans le forum Windows Forms
    R�ponses: 3
    Dernier message: 19/01/2009, 17h38
  3. R�ponses: 1
    Dernier message: 12/06/2006, 16h40
  4. [C#] Comment integrer dll C++ mixte manag�/natif ?
    Par groskek dans le forum C++/CLI
    R�ponses: 5
    Dernier message: 25/01/2006, 21h46

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