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

MFC Discussion :

Mettre un objet utilisant COM dans un vecteur


Sujet :

MFC

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 201
    Points : 132
    Points
    132
    Par défaut Mettre un objet utilisant COM dans un vecteur
    Bonjour le forum

    Je souhaiterais mettres plusieurs objets qui utilisent des interfaces COM dans un vecteur.

    Je m'explique:

    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
     
    #define Groupe_Vecteur vector < CGroupe >
    Groupe_Vecteur m_Groupe;
     
    CClient::AjouterGroupe(parametres)
    {
       CGroupe Groupe(parametres);
       m_Groupe.push_back(Groupe);
       m_Groupe[0].Methode(); // l'element accede aux interfaces COM car l'objet qui les a implement existe
       ...
    }
    CClient::AutreMethode()
    {
       m_Groupe[0].Methode(); // l'element n'a plus acces aux interfaces COM car l'objet qui les a implemente n'existe plus
    }
    En esperant trouver une solution.

    Merci pour vos reponses

  2. #2
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    lorsque tu fais un push_back, ce n'est pas l'objet qui est mis en pile mais une copie. De mémoire je sais qu'il faut créer un contructeur de copie CClient(CClient&) mais je ne sais plus si il faut implémenter l'opérateur '='

    ou sinon le plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef vector < CGroupe* > Vecteur_pGroupe;
    il y a du linge sur la corde à linge

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 201
    Points : 132
    Points
    132
    Par défaut
    Oula si je fais ce que tu m'as dit de faire Ca sera encore pire.
    Le fait de faire un vecteur qui contient des references sur des objets va me
    faire planter puisque l'objet que je vais ajouter dans mon vecteur est cree en locale dans une fonction.
    Or qui dit local dit qu'il sera detruit des la fin de la methode dans lequel il a ete cree.
    Ce qui implique que l'objet qui se trouve dans le vecteur va pointer sur un objet qui malheureusement n'existe plus.

    Ta solution fonctionne que si l'objet que je cree dans la fonctions n'est jamais detruit car a ce moment la l'element du vecteur pointera bien sur un objet existant.

    EDIT: Merci quand meme

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il faut simplement créer tes objets sur le tas et non en local. Comme te l'a dit ouate mille fois Luc, tu ne pourras pas gérer tes objets COM par copie, ceux-ci ont une sémantique de référence.

    Stocker des pointeurs (intelligents -- com_ptr) te gêne vraiment ? Etant donné que c'est la seule solution, tu n'as pas trop le choix.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 201
    Points : 132
    Points
    132
    Par défaut
    Disons que ça ne me gêne pas

    Mais le seul soucis (et oui y en a un) c'est que je ne sais pas utilise tes
    Stocker des pointeurs (intelligents -- com_ptr)
    Donc si tu as un exemple ou quelque chose je suis disposer a le regarder.

    PS: je suis qu'un simple etudiant

  6. #6
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<CComPtr<IDirect3DSurface9> >  m_surfaces;
    Tu as des exemples comme ceci dans le SDK de directshow. Le sample c'est VMR9Allocator.

    Dans cette déclaration par exemple, les objets sont tous initialisés à NULL.

    Pour tout effacer (release):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(size_t i = 0; i < m_surfaces.size(); ++i)
        m_surfaces[i] = NULL;
    A savoir que c'est fait automatiquement, à la destruction du vecteur.

    Après pour utiliser tout ça c'est un peu plus complexe. Voir les exemples et la classe CComPtr.

  7. #7
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par 0xYg3n3
    Disons que ça ne me gêne pas

    Mais le seul soucis (et oui y en a un) c'est que je ne sais pas utilise tes
    Stocker des pointeurs (intelligents -- com_ptr)
    Donc si tu as un exemple ou quelque chose je suis disposer a le regarder.

    PS: je suis qu'un simple etudiant

    Non seulement Moldavi a donné un exemple et en plus l'utilisation de CComPtr se trouve facilement dans le MSDN :

    CComPtr::CComPtr
    CComPtr( );

    CComPtr( T* lp );

    CComPtr ( const CComPtr< T >& lp );

    Parameters

    lp

    [in] Used to initialize the interface pointer, p.

    T

    [in] A COM interface.

    Remarks

    The default constructor sets p to NULL. The copy constructor sets p to the member pointer of lp and calls AddRef through p. If you pass a pointer type derived from T, the constructor sets p to the T* parameter and calls AddRef.

    The destructor calls Release through p.

    CComPtr Overview | Class Members

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Février 2005
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 201
    Points : 132
    Points
    132
    Par défaut
    Citation Envoyé par mat.M
    Citation Envoyé par 0xYg3n3
    Disons que ça ne me gêne pas

    Mais le seul soucis (et oui y en a un) c'est que je ne sais pas utilise tes
    Stocker des pointeurs (intelligents -- com_ptr)
    Donc si tu as un exemple ou quelque chose je suis disposer a le regarder.

    PS: je suis qu'un simple etudiant

    Non seulement Moldavi a donné un exemple et en plus l'utilisation de CComPtr se trouve facilement dans le MSDN :

    CComPtr::CComPtr
    CComPtr( );

    CComPtr( T* lp );

    CComPtr ( const CComPtr< T >& lp );

    Parameters

    lp

    [in] Used to initialize the interface pointer, p.

    T

    [in] A COM interface.

    Remarks

    The default constructor sets p to NULL. The copy constructor sets p to the member pointer of lp and calls AddRef through p. If you pass a pointer type derived from T, the constructor sets p to the T* parameter and calls AddRef.

    The destructor calls Release through p.

    CComPtr Overview | Class Members
    Desole mais moi je vois pas le rapport en CComPtr et ma classe.

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/04/2009, 17h56
  2. Mettre un objet dans un document RTF
    Par Terminator dans le forum Windows
    Réponses: 6
    Dernier message: 15/07/2006, 01h13
  3. Tri d'objets dans un vecteur
    Par Jahjouh dans le forum C++
    Réponses: 5
    Dernier message: 26/01/2006, 18h23
  4. destruction d'objets dans un vecteur
    Par titouille dans le forum C++
    Réponses: 12
    Dernier message: 28/07/2005, 19h20
  5. Mettre un objet dans un TListView
    Par FredericB dans le forum C++Builder
    Réponses: 4
    Dernier message: 20/04/2004, 09h32

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