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 :

Dll c++ natif dans appli .Net - Perte de pointeur


Sujet :

C++/CLI

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Dll c++ natif dans appli .Net - Perte de pointeur
    Bonjour,

    J'ai une dll en c++ natif/mfc, que je souhaite utiliser dans une application .Net (en c#).

    J'ai donc essayé de réaliser un wrapper en C++/CLI pour les classes de la dll (ici un thread) que je souhaite utiliser, suivant le tutoriel de nico-pyright.

    Ma classe ThreadWrapper contient comme attribut un pointeur vers ma classe native, CThread, qui elle-même dérive de CWinThread.

    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
    public ref class ThreadWrapper 
    	{
    		public:
    			ThreadWrapper();
    			~ThreadWrapper();
    
    		// Members
    		protected:
    			CThread*  m_pThread;
    
    		// Service
    		public:
    			CThread* GetThread() { return m_pThread; }
    
    			Boolean	 CreateThread();
    
    			void StopThread();
    
    			ThreadWrapper^ operator=(ThreadWrapper^ src) ;
    
    	};

    A la compilation, tout semble fonctionner, mais à l'exécution, lors du retour de la méthode CreateThread(), le pointeur m_pThread est corrompu et du coup mon programme plante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
         Boolean ThreadWrapper::CreateThread()
    	{
    		return (m_pThread->CreateThread()==0 ? false : true);
    	}
    Je pense que c'est un problème d'espace mémoire managé/non managé, mais je n'arrive pas à comprendre le mécanisme exact.

    Si quelqu'un peut m'éclairer sur ce sujet...
    Merci.

  2. #2
    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
    corrompu ca veut dire que ca vaut NULL ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Non, en fait les attributs de l'objet pointé sont remplis de valeurs aléatoires..
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CWinThread { m_pMainWnd=0xFEEEFEEE m_pActiveWnd=0xFEEEFEEE m_bAutoDelete=-17891602 ...}

  4. #4
    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
    ca ressemble à quelque chose qui aurait été désalloué

    je connais pas CThread, mais y a pas besoin d'un new qqpart ?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Ben le new est fait dans le constructeur de mon wrapper :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ThreadWrapper::ThreadWrapper()
    	{
    		m_pThread = new CThread();
    	}
    CThread est une classe à moi, j'ai changé le nom pour simplifier.

  6. #6
    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
    ben, je sais pas, mais ca m'étonnerait que ca soit la faute du wrapper

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Alors tu pnses que c'est la faute de ma classe CThread ?

    Parce que je l'utilise dans une autre application, en c++ natif, et elle fonctionne très bien.

    Ca peut pas être un problème de pointeur alloué sur le tas du gc puis passé à ma classe native, qui donc perdrait l'adresse du pointeur lorsque celui-ci est déplacé par le gc ?

  8. #8
    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
    je pense pas que le GC touche à ton pointeur qui pointe sur le heap natif, car c'est bien un objet natif ce CThread, non ?

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Oui, c'est un objet natif, qui dérive d'une classe MCF (CWinThread)

  10. #10
    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
    y a pas de raison d'etre déplacé par le GC alors

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    ok ben merci

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

Discussions similaires

  1. Injection de dll native dans une appli .Net
    Par LEK dans le forum C++/CLI
    Réponses: 1
    Dernier message: 16/01/2010, 10h04
  2. dll (mapnik) c++ dans ASP.Net
    Par Ghurdyl dans le forum ASP.NET
    Réponses: 1
    Dernier message: 25/06/2009, 23h18
  3. Creation dll et utilisation dans appli C#
    Par moulefrite dans le forum Windows Forms
    Réponses: 5
    Dernier message: 19/08/2008, 09h46
  4. [AJAX] Bandeau AJAX dans appli .NET
    Par Invité dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 04/05/2007, 11h53
  5. [C#] Ressources importantes dans une appli .net
    Par tiboleo dans le forum Windows Forms
    Réponses: 31
    Dernier message: 07/09/2004, 19h27

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