Question

Si j'ai une classe C ++, X, qui met en œuvre les interfaces COM IY et IZ, et j'ai un pointeur y à l'interface IY d'un objet de type X, et je fais ceci:

IZ *z = dynamic_cast<IZ *> ( y );

Cela ne cogne pas le compteur de référence de l'objet, le fait? Je n'ai pas à faire une version () pour tenir compte, non?

S'il importe, j'utilise ATL / COM.

Je devine que la réponse est « non il n'a pas cogner le compte de référence, et ne vous ne pas Release () », mais je veux être sûr.

Merci d'avance.

Était-ce utile?

La solution

Chiffres de référence pour les objets COM sont incrémentés lorsque quelqu'un appelle IUnknown :: AddRef (). QueryInterface (), selon les règles COM, car il donne un nouveau pointeur d'interface, appelle en interne AddRef ().

Dans votre code de affiché le, vous n'êtes pas appeler AddRef (), et vous n'êtes pas d'appeler une fonction qui pourrait appeler AddRef (), alors pourquoi vous pensez que le nombre de référence serait incrémenté?

En dépit de ce que ATL / MFC fait à son cerveau, il n'y a pas de magie. En cas de doute, vous pouvez toujours consulter le démontage dans VS et étape à travers elle et prouver pour vous que AddRef () n'est pas appelé.

Edit: Et je veux répéter ce que dit Dewfy, ne pas faire cela . Utilisez QueryInterface (). Ou CComQIPtr <> (si vous devez vraiment).

De plus modifier: Si vous utilisez CComPtr <> et CComQIPtr <> alors vous ne devez pas appeler Release () et une grande partie de la charge de déterminer l'arbitre-comptage correct est soulagées. Vous devriez vraiment envisager de les utiliser.

Autres conseils

dynamic_cast ne doit pas être utilisé sur plusieurs raisons:

  • Vous ne savez pas si la destination prend en charge RTTI
  • Vous ne savez pas si OLE ne crée pas de proxy pour vous
  • ...

Au lieu d'utiliser QueryInterface - il fait ce que vous voulez

.

Même si vous vous en question ci-dessus - coulée ne pas refcounter changements

En C ++ Builder, dynamic_cast sur un pointeur d'interface COM ne fait QueryInterface. et le pointeur de retour, si le QI réussit, se AddRef'd.

Les classes qui mettent en œuvre des objets COM ont des dispositions plus générales C ++ classes vtable, donc un C ++ - le style dynamic_cast ne peut pas travailler; donc je suppose que c'est pourquoi C ++ Builder fait la chose plus sensible de faire QueryInterface.

(L'idée originale de COM était de généraliser le modèle objet C de être agnostique langue et à un niveau binaire, ils rebaptisés dynamic_cast QueryInterface)

.

Je suppose que la réponse haut fait référence à MSVC, si dynamic_cast provoque un comportement non défini.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top