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 :

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);
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.

Avec les _com_ptr_t et wrapper de méthodes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
IBPtr bPtr;
bPtr= aPtr->GetSubObject();
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 =).

Ca marche c'est cool, mais je voudrais savoir pourquoi (release dans le wrapper ?), et être sur que ca marche.

Merci d'avance