Bonjour
Je dévellope depuis peu en utilisant la technologie COM. J'ai découvert récemment la possibilité d'utiliser des wrappers avec gestion d'erreurs de haut niveau et les smart pointers de visual c++ (j'utilisait les CComPtr ATL précédemment).
Cependant je ne comprend pas pourquoi les _com_ptr_t ne font pas de AddRef de trop quand on les assignent avec l'opérateur =.
Ainsi auparavant je réalisais ceci :
Dans ce cas l'appel à GetSubObject réalisait un increment de reference (comme toutes les méthodes d'API retournant une interface). L'opérateur & de CComPtr m'assurait qu'il en réalisait pas d'autres AddRef. l'appel à Release était automatique en fin de portée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 //on suppose que aPtr est un pointeur initialisé sur un autre objet d'une API CComPtr<IB> bPtr aPtr->GetSubObject(&bPtr);
Avec les _com_ptr_t et wrapper de méthodes :
Le probléme c'est que au cours de l'appel à l'opérateur =, un addRef est effectué (j'ai vérifié en Debug). Or le compteur de référence se trouve à 1 aprés cette ligne. Il devrais être à 2 (AddRef par l'api plus AddRef dans l'opérateur =).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 IBPtr bPtr; bPtr= aPtr->GetSubObject();
Ca marche c'est cool, mais je voudrais savoir pourquoi (release dans le wrapper ?), et être sur que ca marche.
Merci d'avance
Partager