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++ Discussion :

Problème appel dll c++ en c++/cli


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 265
    Points : 352
    Points
    352
    Par défaut Problème appel dll c++ en c++/cli
    Bonjour,
    contexte :
    j'ai compilé une dll c++ (utilisant les dll OpenCV). dans cette dll je compile 3 classes.
    j'ai ensuite créer une classe c++/cli pour wrapper cette dll C++ (et ensuite l'utiliser dans une appli C#)
    j'ai créer un projet de test en c++/cli pour tester l'importation de la dll c++ et ma classe .
    lors des tests, lorsque je sors de ma dll c++ les objets internes a mes classes sont nettoyés.

    je suis bien rouillé en c++ et débutant en c++/cli, j'ai du rater quelque chose d'essentielle, pourriez-vous m'aider svp?

    une des classe c++
    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
     
    #define DllExport   __declspec( dllexport )  
     
     
    class DllExport RAD_Model{
    private:
    	Mat Model_descriptors;
    	vector<KeyPoint> Model_keypoints;
    	vector<int> Index_Model;
    	vector<string> SubModel_Name;
    	GpuMat Model_descriptors_GPU;
    	GpuMat Model_keypoints_GPU;
    	int NbModels;
    	int Complet;
    public :
    	RAD_Model::RAD_Model(const char* path_Model, int Mode, bool GPU);
    	RAD_Model::RAD_Model();
    	RAD_Model::RAD_Model(RAD_Model const & toCopy);
     
     
     
    };
    la classe wrapper c++/cli
    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
     
    public ref class BWorker
    {
    	private:
    		 WorkerBunny* Worker;
    		 RAD_Params* Params;
    		 RAD_Model* Model;
     
    	public:
     
    		BWorker(System::String ^Path_Model)
    		{
    			string stdPath_Model = conversion::convertStringToStlString(Path_Model);
    			Model = &RAD_Model(stdPath_Model.c_str(), 0, true);
    /* le code s'execute normalement, les variable interne sont alloué et le code semble aller au bou (affectation de la variable Complet a 1). 
     cependant, lorsque je debug en pas a pas je vois qu'en sortant du constructeur je passe par les destrcuteur de tous mes objets interne a ma classe RAD_Model
    résumer : 
    ces variables de ma classe RAD_Model sont nettoyées
           Mat Model_descriptors;
    	vector<KeyPoint> Model_keypoints;
    	vector<int> Index_Model;
    	vector<string> SubModel_Name;
    	GpuMat Model_descriptors_GPU;
    	GpuMat Model_keypoints_GPU;
    celle ci sont bien a la valeur attendu:
            int NbModels;
    	int Complet;
     */
    			Params = &RAD_Params(true);
    		}
    }


    merci pour votre attention!

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ça sent mauvais, cette syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Model = &RAD_Model(stdPath_Model.c_str(), 0, true);
    Params = &RAD_Params(true);
    Avec ça, tu crées un temporaire non-nommé avant de prendre son adresse, puis il est détruit et tes pointeurs sont "dangling"...

    Tu dois utiliser new à la place (et rajouter un finaliseur dans ta classe C++/CLI pour faire les delete, ainsi qu'un destructeur (qui appelle le finaliseur) si tu veux pouvoir gérer sa destruction par IDisposable...)
    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 averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 265
    Points : 352
    Points
    352
    Par défaut
    merci beaucoup
    c’était bien ma syntaxe pourris.

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

Discussions similaires

  1. Inno Setup - Problème appel Dll
    Par mactwist69 dans le forum Outils
    Réponses: 16
    Dernier message: 07/12/2010, 16h20
  2. [WD15] Problème appel DLL
    Par fucce dans le forum WinDev
    Réponses: 13
    Dernier message: 25/10/2010, 12h01
  3. problème appel dll c++ non managée depuis C#
    Par zwazillon dans le forum C#
    Réponses: 2
    Dernier message: 19/10/2009, 15h10
  4. Réponses: 4
    Dernier message: 30/08/2007, 18h08
  5. Problème appel JNI d'une dll via COM
    Par mfabien dans le forum C
    Réponses: 3
    Dernier message: 13/04/2007, 14h38

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