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 :

Question sur COM et CComPtr


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Par défaut Question sur COM et CComPtr
    Bonjour à tous, je dois bien qu'ayant aucune connaissance à la base developper un projet utilsant les objets COM d'un logiciel quelconque. A force de lecture de tutoriels dont celui de developpez. com (remarquable au passage) et d'exemples, j'ai réussi à créer des programmes qui marchent. Sauf qu'à la fin du ledit programme, j'ai des problèmes de désalocations mémoires (le débuggeur me dit qu'il bloque sur la fonction release) dans la définition du fichier CComPtr mais tout les exemples que j'ai lu utilise ce template. Alors que fais-je de mal?
    J'aimerai donc savoir ce que fait exactement CComPtr?
    Y a t il une différence entre:
    -IInteface* objet=NULL
    - CComPtr<IInterface> objet

    Je remercie par avance toute réponse ca me permettra de finir mon projet.

    Cordialement

  2. #2
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Comment initialises-tu ton pointeur ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Par défaut
    Bah j'ai toujours utilisé CComPtr, mais depuis mes soucis j'ai essayé la deuxième formulation qui donne les mêmes résultats et rend les choses plus stable. J'ai eu donc l'impression que c'était les CComPtr qui me posait problème .
    Mais j'y comprend donc plus rien car selon MSDN CComPtr est une template servant à initialiser un pointeur d'une interface COM et devrait donc à priori poser aucun problème d'autant plus que tous mes exemples utilise cette template.
    Donc d'où la question que font réellement les CComPtr et eventuellement y-a-til des précautions d'usage.

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Par défaut
    Salut,
    Ce que tu as est donc un smart pointer. Il faut bien comprendre q'un smart pointer encapsule une interface. De ce fait lorsque tu fait ptr = NULL, un release est fait sur ton interface. De même lorsqu'un smart pointer est détruit un release est effectué sur l'interface.
    IInterface = NULL est différent de ptr = NULL, car dans le premier cas, ton interface n'est pas détruite (pas de release donc risque de perdre ton interface) mais dans le deuxième, ton interface est détruite (release).
    Il faut que tu faces très attention aux AddRef et Release qui sont fait sur tes interfaces pour ne pas en perdre.
    Une autre remarque, lorsque tu crée un CComPtr, un Addref est effectué sur ton interface passé en paramètre, le CComPtr prend contrôle de ton interface donc si tu n'as plus besoin de ton interface après, tu dois faire un release.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Par défaut
    Il faut que tu fasses très attention aux AddRef et Release qui sont faits sur tes interfaces pour ne pas en perdre.
    Justement c'est le point avec leque j'ai le plus du mal. Car jusqu'à ce jour j'utilisais des constructeurs et des destructeurs et je me posais pas plus de question. Donc j'ai du mal à voir pourquoi un compteur d'interface est nécesssaire.


    le CComPtr prend contrôle de ton interface
    Pour moi avec le CComPtr servait à crèer un pointeur d'une instance de l'interface (que je manipule comme une classe classique). Donc quand tu dis "prend le contrôle" tu sous-entends un mécanisme particulier à la technologie COM.
    et dermier point obscur

    smart pointer encapsule une interface
    Pour moi c'était une classe qui en encapsulait une autre et non pas un pointeur. Donc qu'apporte ce mécanisne du point de vue des propriétées?

  6. #6
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Bonsoir,

    La différence entre un pointeur d'interface et un objet CComPtr n'est pas très grande.

    La règle COM dit que :"Si tu veux utiliser une interface IInterface d'un objet COM tu dois incrémenter son compteur de référence en appelant AddRef() sur l'interface. Si tu as finis avec cette interface tu invoques Release() sur la même interface."
    Ainsi COM sait combien de client se sont liés sur cette interface et sait quant-est-ce qu'il faut libérer l'objet COM lorsque aucun client n'empreinte l'interface.

    La classe CComPtr est une classe template de ATL (Active Template Library) c'est au fait une sorte de pointeur intelligent.
    Mais pourquoi est-il intelligent?

    Souvent les utilisateurs (programmes clients qui utilisent des objets COM) n'appliquent pas soigneusement la combinaison des AddRef()/Release() ce qui provoque le plus souvent des fuites de mémoire et par conséquent non libération des ressouces.
    Pour palier à cet inconvénient le smart pointeur CComPtr est fournit afin d'encapsuler l'interface COM et de gérer à notre place cette paire de AddRef()/Release(). CComPtr les utilise lors qu'il est soit construit où lors des assignations(affections). Son opérateur "=", masque ces appels.

    CComPtr a également pour but d'empêcher l'utilisateur d'appeler directement sur lui cette paire de AddRef()/Release() En utilisant la classe _NoAddRefReleaseOnCComPtr voir sa méthode de l'opérateur surchargé "operator->".

    La bibliothèque ATL fournit également d'autres pointeurs intelligents comme CComQIPtr qui lui hérite de CComPtr en gèrant également les QueryInterface() à notre place.

    Gabrielly

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    bonsoir,
    tres bien tout ça ! ,ça sent la question pour la faq (M. Gabrielly) ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Par défaut
    Souvent les utilisateurs (programmes clients qui utilisent des objets COM) n'appliquent pas soigneusement la combinaison des AddRef()/Release()
    C'est bizarre mais je me sens pas concerné .
    J'ai donc tout intérêt à utiliser les CComPtr, il prend en charge le tout dont notamment la désalocation mémoire.
    Merci à tous pour ces indications et vous souhaite une bonne fin de semaine (expression Quebecquoise pour week-end).
    Grand merci et à une prochaine

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

Discussions similaires

  1. trouver ses questions sur developpez.com
    Par ickyknox dans le forum Général Conception Web
    Réponses: 2
    Dernier message: 26/05/2012, 16h28
  2. [MySQL] Question sur l'API YouTube lors de l'envoi de video, relatif au tuto de dev.com
    Par dekker dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 15/12/2011, 16h40
  3. Question sur le dico de developpez.com
    Par sovo dans le forum Evolutions du club
    Réponses: 8
    Dernier message: 15/09/2006, 12h42
  4. Réponses: 2
    Dernier message: 11/08/2002, 21h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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