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 :

[C++] Comment manager dans une classe non managée ?


Sujet :

C++/CLI

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 61
    Points : 48
    Points
    48
    Par défaut [C++] Comment manager dans une classe non managée ?
    Bonjour,
    Je voudrais utiliser un composant managé (par exemple String) dans du code non managé.

    Dans un source mfc j'ajoute le classe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public __gc class CMyClass
    {
    public:
        CMyClass(void);
        ~CMyClass(void);
    };
    Si je veux l'instancier dans un .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CMyClass *x = new CMyClass();
    J'ai l'erreur
    "arguments de positionnement non autorisés lors de la création d'instances de classes managées"
    Je n'arrive pas à comprendre le problème.
    Le projet est compilé avec l'option /clr.

    Si quelqu'un a un exemple d'utilisation de composants de la librairie .NET ou d'une classe managée dans un source non managé je suis preneur.

    En fait, ce que je veux c'est pouvoir utiliser le composant XmlDocument de la librairie .NET dans un projet MFC.

    Merci d'avance.

  2. #2
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par psau
    En fait, ce que je veux c'est pouvoir utiliser le composant XmlDocument de la librairie .NET dans un projet MFC.

    Merci d'avance.
    A moins de preuve du contraire c'est difficilement réalisable , je ne vois pas trop comment.
    MFC code natif et .NET code "managed" ce sont 2 techs radicalement différentes.
    Utiliser un composant ou .exe sous .NET c'est possible , l'inverse je ne vois vraiment pas...
    Aller sur www.codeproject.com peut-être que quelqu'un a trouvé une astuce...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    Après avoir pas mal cherché, cette implémentation semble fonctionner. Je ne suis pas sûr d'avoir bien compris quoi est exactement managé comment et où mais ça compile et ça fonctionne.

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    //
    // dll écrite à partir du wizard .NET -> Bibliothèque de classes.
    // Compilée /clr
    //
    // ----- .h (extrait) -----
     
    using namespace System;
    using namespace System::IO;
    using namespace System::Xml;
    using namespace Microsoft::Win32;
     
    namespace BdrXml_dll
    {
       public __gc class CXmlAccess
       {
       public:
          CXmlAccess(void);
          ~CXmlAccess(void);
     
          XmlDocument *m_xmlDoc;
     
          // retourne dans RetValue la valeur lue pour le noeud Key
          // dans le fichier File.
          bool ReadString(String *File, String *Key, String* &RetValue);
       }
    };
     
    // ----- .cpp (extrait) -----
     
    #include "BdrXml_dll.h"
    using namespace BdrXml_dll;
     
    bool CXmlAccess::ReadString(String *File, String *Key, String *&RetValue)
    {
       m_xmlDoc = new XmlDocument();
       m_xmlDoc->Load(File);
       XmlNode *n = m_xmlDoc->SelectSingleNode(Key);
       RetValue = n->InnerText;
       return(true);
    }
    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
    32
    33
     
    //
    // exe écrit à partir du wizard .MFC -> Application MFC
    // basée sur une boîte de dialogue.
    // Compilée /clr
    //
    // ----- .cpp (extrait) -----
     
    #include "TestBdrXml.h"
    #include "TestBdrXmlDlg.h"
    using namespace BdrXml_dll;
     
    using namespace System;
    using namespace System::Runtime::InteropServices;
     
    void CTestBdrXmlDlg::OnBnClickedOk()
    {
    // Pour éviter l'erreur "arguments de positionnement ..."
    // lors de la compilation en mode débug
    #pragma push_macro("new")
    #undef new
     
       String* returnString;
       LPSTR buffer;
       CXmlAccess *x = new CXmlAccess();
     
       // Lecture du noeud XML
       x->ReadString(S"FileXml", S"NodeXml", returnString);
       // Conversion du String en char*
       buffer = (LPSTR)(void*)Marshal::StringToHGlobalAnsi(returnString);
     
    #pragma pop_macro("new")
    }
    Mais tout n'est pas encore réglé (si tant est que ce code soit correct...)
    Par exemple dans le cas de cet appel qui initialise un Array de bytes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Array *returnBytes;
    x->ReadBinary(S"FileXml", S"NodeXml", returnBytes);
    Je n'arrive pas à convertir (marshaler) cet Array en tableau de type UNIT[n];
    J'ai à chaque fois l'erreur : error C2440:'cast de type' : impossible de convertir de 'System::Object __gc* en 'UINT' et je n'ai tjrs pas trouvé la bonne méthode pour faire cette conversion.

    Merci pour toute proposition.

  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
    en passant au c++/cli, tu peux utiliser le wrapper gcroot, et à la rigueur, regarder les sources http://nico-pyright.developpez.com/t...grationcppnet/

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    Ben oui, j'ai bien vu qu'il y avait la possibilité d'utiliser le C++/CLI mais il s'agit simplement d'ajouter quelques évolutions à une application existante écrite en C++ sous VC++ et recompilée sous Visual Studio. Et puis j'ai déjà pas mal investi de temps pour écrire ces trucs en C++ alors je préfèrerais continuer avec ce language si c'est possible.
    Sinon, peut-être serait-il préférable de passer plutôt au c# non ?

    En tous cas, merci pour les liens.

  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
    le c++/cli est justement là, profiter de toute la puissance du c++ et du framework .Net 2.0 sans avoir à tout changer en c#
    Et puis avec IJW, c'est une simplicité de mixer du code managé et non managé

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    Oups !! Petite précision, je suis sous VS 2003 donc pas de c++/cli.

    Je suis tjrs aussi paumé pour mixer du non managé et du managé.

    Voilà ce que je voudrais faire, dans le principe, car dans le concret, le compilo n'accepte rien de tout ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //
    // Source MFC compilé avec l'option /clr
    //
    CMaClass *x = new CMaClass ();
    BYTE *pData;
    x->ManagedMethod(pData); // Allouer et remplir pData
    free(pData);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //
    // Dll créée à partir du wizard de création de bibliothèque de classes.
    //
    CMaClass::ManagedMethod(Byte *pData)
    {
       pData= new Byte[100];
       for(int i = 0; i < 100] i++)
          pData[i] = i;
    }
    Si seulement une bonne âme pouvait corriger ces lignes incongrues...

Discussions similaires

  1. instancier une classe non managée dans une Windows Form
    Par maestro_mirou dans le forum C++/CLI
    Réponses: 2
    Dernier message: 07/05/2012, 14h09
  2. Réponses: 5
    Dernier message: 14/01/2008, 16h39
  3. Réponses: 1
    Dernier message: 26/09/2007, 17h16
  4. Type DWord dans une classe non managé
    Par julioMEL dans le forum C++/CLI
    Réponses: 1
    Dernier message: 26/04/2007, 20h08
  5. Réponses: 3
    Dernier message: 19/02/2007, 15h07

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