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 d'une fonction d'une classe managee dans une dll c++ ou C (?) par delegate


Sujet :

C++/CLI

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    13
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Juillet 2012
    Messages : 13
    Par d�faut passage d'une fonction d'une classe managee dans une dll c++ ou C (?) par delegate
    Bonjour a tous, j'ai un petit pb de passage du monde non manage dans le monde manage..

    je possede une dll ecrite en je ne sais quoi (C++ je pense) dont une des methode est

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    typedef void(* cm2::fem::solver_static_Newton::operating_mode_type::display_handler_type)(unsigned level, const char *msg)
    le but �tant de passer la fonction de gestion "log" en tant que parametre.

    pour le moment j'utilise une fonction globale, exterieure a une classe, qui est :

    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
    /**
            \fn        logfile_handler()
            \brief   utilise en tant que Handler pour les solveurs
     */	
    static void logfile_handler(unsigned level, const char* msg)
    {
       StreamWriter ^stream = File::AppendText("LOG.txt");
     
       if (level < 10) 
       {
          String ^message = gcnew String(msg);
          stream->WriteLine(message);
       }
     
       stream->Close();
    }
    et elle est passee en pointeur dans la classe de la dll par :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
       solver_static_Newton::operating_mode_type solver_operatingmode;
       // initialise le mode operatoire du solveur
     
       solver_operatingmode.display_hdl = &logfile_handler;


    Or, je voudrai utiliser des evenements .NET et de ce fait utiliser une
    methode interne a une classe managee.

    j'ai un peu regarde les fonctions de mashalisations et de delegate.

    j'ai une classe managee :

    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
    public ref class gsd_fea
      {
    constructeurs destructeur methodes etc...
     
    // je cree un delegate et une fonction qui me permettrait de gérer
            // le handler du solveur :
     
          public: delegate void gsdfea_delegate_logfile_handler(unsigned level, const char* msg);
     
          void gsdfea_logfile_handler(unsigned level, const char* msg)
          {
             StreamWriter ^stream = File::AppendText("LOGDELEGATE.TXT");
     
             if (level < 10)
             {
                String ^message = gcnew String(msg);
                stream->WriteLine(message);
             }
     
     
      }
             stream->Close();
          }
    }
    et la j'utilise la fonction de marshalisation pour passer du monde manage au non manage par :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
       solver_static_Newton::operating_mode_type solver_operatingmode;
     
       // initialise le mode operatoire du solveur
       gsd_fea::gsdfea_delegate_logfile_handler ^logtodo = gcnew gsd_fea::gsdfea_delegate_logfile_handler(this,&gsd_fea::gsdfea_logfile_handler);
       solver_operatingmode.display_hdl = (cm2::fem::solver_static_Newton::operating_mode_type::display_handler_type) Marshal::GetFunctionPointerForDelegate(logtodo).ToPointer();

    Le code compile sans warnings mais plante a l'execution comme si il n'arrivait pas a passer de messages ou d'arguments.

    Existe t'il une autre voie pour faire cela ?

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    13
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Juillet 2012
    Messages : 13
    Par d�faut
    peut etre ne suis je pas sur le bon forum..
    c'est plus du .NET que du C++/CLI ?

  3. #3
    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
    J'ai appris des trucs, merci.

    Primo, nommage C++ export� d'une Dll, c'est bien pourri, l'�diteur de la Dll doit �tre un amateur.
    Je crains donc des "plaisanteries" avec des conventions d'appels "exotique" qui vont vous mettre dans l'embarras.

    http://msdn.microsoft.com/en-us/libr...v=vs.110).aspx
    Vous avez des petits d�tails comme l'utilisation de GCHandle::Alloc.

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    13
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Juillet 2012
    Messages : 13
    Par d�faut
    bonjour Bacelar,

    ravi que cela puisse servir a qque chose

    Qu'appelez vous "nommage" ?
    dans le code plus haut, a quoi est ce que ca se refere ?

    je peux echanger avec l'editeur de la dll pour que sa dll soit plus compatible, mais faut t'il encore que je sache quoi lui demander ;-)

    merci pour le doc, je vais lire ca avec attention deja

  5. #5
    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
    cm2: : fem : :solver_static_Newton::operating_mode_type::display_handler_type

    Ca ressemble � un nom C++ et non C.
    Mais l'�diteur � peut-�tre fourni des en-t�tes compatible C++ pour encapsuler des fonctions C++.

    Utiliser dependency walker (http://www.dependencywalker.com/) sur la Dll pour v�rifier que c'est bien des fonctions C qui sont export�es.

    Si c'est des fonctions C++ (avec une d�coration des noms tout bizarre), c'est tr�s tr�s moyen car cela interdit d'utiliser un autre compilateur ou version des librairies que ceux utilis� pour g�n�rer le Dll.

    Bonne lecture.

  6. #6
    Expert confirm�
    Avatar de Mat.M
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 538
    D�tails du profil
    Informations personnelles :
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 538
    Par d�faut
    Salut juste une question
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    static void logfile_handler(unsigned level, const char* msg)
    ce qui me chagrine c'est de passer un char* , est-ce que c'est possible en code managed ?

  7. #7
    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
    C'est la Dll qui appelle, donc c'est elle qui m�ne le jeu. Il faut vous y conformer.
    Mais je ne vois pas de difficult�s.
    Au d�but de votre fonction, vous n'avez qu'a cr�er une String^ avec la chaine pass�e en param�tre.

  8. #8
    Expert confirm�
    Avatar de Mat.M
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 538
    D�tails du profil
    Informations personnelles :
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 538
    Par d�faut
    Citation Envoy� par denisdg Voir le message
    Le code compile sans warnings mais plante a l'execution comme si il n'arrivait pas a passer de messages ou d'arguments.
    ce n'est pas possible de mettre un point d'arr�t et tracer pas-�-pas ?

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    13
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Juillet 2012
    Messages : 13
    Par d�faut
    malheureusement non car dans la gestion du solveur,

    le mode de travail (et le handler) sont pass� dans une classe operating_mode
    et le solveur appele par sa fonction run() doit utiliser qque part les parametres
    de cette classe.

    mais aucun n'est accessible donc.. rap� !

  10. #10
    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
    Je ne vois pas d'impossibilit�.

    Vous passez un pointeur sur une fonction ok ?
    Qu'est-ce qui vous interdit de mettre un point d'arr�t au d�but de la dite fonction ?

  11. #11
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    13
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Juillet 2012
    Messages : 13
    Par d�faut
    exact ! pfff.. c'etait si evident.

    alors..
    j'ai modifi� le code en ajoutant le GCHandle::Alloc(ledelegate);

    lors de la premiere iteration, le handler rentre bien dans la fonction
    avec les bons parametres et peut faire une premiere ecriture.

    ensuite, des le moment ou le programme sort de la fonction et doit retourner dans la suite du solveur pour commencer sa seconde iteration.. Exception !

    "
    An unhandled exception of type 'System.AccessViolationException' occurred in Ophelia.exe

    Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
    "

    j'ai regard� la doc la dessus :

    http://msdn.microsoft.com/fr-fr/libr...exception.aspx

    aie !!

  12. #12
    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
    Si vous ne lui avez pas fourni de pointeurs foireux ou de pointeurs sur objets manag�s "migrants", c'est que c'est chez lui qu'il y a un probl�me.

    Pouvez-vous avoir acc�s au code de la Dll, ou sinon � ses symboles shrink�s (.sym, .pdb, .deb, ...).

    L'�diteur a eu l'intelligence de ne pas intercept� en aveugle les exceptions, vous devriez donc avoir acc�s aux motifs r�els du probl�me. Un pointeur foireux, fait juste savoir d'o� il sort.

    Courage

  13. #13
    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
    D�j�, pourriez-vous poster votre code actuel? Dans une balise [ code ] si possible?
    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.

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

Discussions similaires

  1. Plusieurs classes CSS dans une fonction JavaScript
    Par Lillie CHARLOTTE dans le forum G�n�ral JavaScript
    R�ponses: 14
    Dernier message: 25/05/2015, 15h29
  2. R�ponses: 1
    Dernier message: 07/10/2011, 10h21
  3. [Java] cast de classe Java dans une fonction Matlab
    Par steph_ch dans le forum MATLAB
    R�ponses: 1
    Dernier message: 14/04/2008, 15h55
  4. R�ponses: 5
    Dernier message: 09/03/2007, 21h14
  5. R�ponses: 9
    Dernier message: 13/03/2006, 17h45

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