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 confirm�
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    61
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 61
    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 confirm�
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    61
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 61
    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
    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 confirm�
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    61
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 61
    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
    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 confirm�
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    61
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 61
    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