2010-02-25 3 views
1

J'apprends le C++ et j'essaie de mieux le comprendre. Je lisais les documents msdn sur la façon d'utiliser XML Lite. il a dit que je dois utiliser une classe qui implémente l'interface IStream. Il a dit de déclarer et d'instancier ma classe qui étend Istream et utilise CComPtr lors de la déclaration de la variable. alors il m'a montré ce qui suit.Est-il possible d'implémenter une interface COM sans créer une interface personnalisée?

CComPtr<IStream> pFileStream; 
CComPtr<IXmlReader> pReader; 

Je suis un peu confus. si CComptr est utilisé pour extraire le fichier XML. pourquoi dois-je étendre. Pourquoi ne pas simplement avoir CComptr déjà implémenter IStream et simplement appeler CComptr. Ou CComptr a-t-il déjà IStream et le seul moyen pour istream d'être efficace est de s'étendre comme ci-dessus ???

Répondre

1

si CComptr est utilisé pour extraire le fichier XML. pourquoi dois-je étendre. Pourquoi ne pas simplement avoir CComptr déjà implémenter IStream et simplement appeler CComptr?
IStream est une interface - dire "Je veux une classe qui implémente cette interface" ne dit pas comment vous voulez réellement obtenir les données. CComPtr est seulement un pointeur vers une coclasse qui implémente une interface - elle n'implémente pas réellement une interface elle-même. Est-il possible d'implémenter une interface COM sans créer une interface personnalisée?

Est-il possible d'implémenter une interface COM sans créer une interface personnalisée?
Je ne suis pas 100% positif ici, mais je ne crois pas que vous devez implémenter une interface . Vous devez cependant implémenter l'interface elle-même dans une coclasse.

+0

Vous avez raison. C'est assez commun en fait. Par exemple, toutes les extensions Shell implémentent les interfaces COM d'utilisationb par Explorer.exe. Peu d'ajouter des interfaces personnalisées; Explorer ne les utilisera pas, ils seront donc uniquement destinés à un usage interne. – MSalters

+0

Ok, je suis habitué aux langages où si une classe implémente une interface. vous pouvez simplement appeler la classe. Vous n'êtes pas obligé de faire la classe . Je suis sous l'impression qu'en C++, pour que le compilateur prenne note de l'interface, vous devez l'appeler comme la classe . Corrigez-moi si je me trompe. – numerical25

+1

@ numerical25 Ce n'est pas un problème de langage C++. C'est COM. COM ne fait pas partie de C++. C'est une convention Microsoft au niveau binaire. Vous pouvez également implémenter des objets COM dans C. http://en.wikipedia.org/wiki/Component_Object_Model – sergiom

1

CComPtr<> est un pointeur intelligent utilisé pour automatiser la gestion de la durée de vie de l'objet. Il est plus ou moins le même que le Interface*Interface est le paramètre de modèle CComPtr <> (IStream* ou IXmlReader* dans cet exemple), mais fournit des fonctionnalités supplémentaires qui n'influencent pas le mode de fonctionnement de l'objet.

Donc CComPtr<IStream> a un IStream* à l'intérieur et un operator ->() surchargé qui redirige les appels vers celui IStream*. La même chose s'applique à CComPtr<IXmlReader> - il a IXmlReader* à l'intérieur.

-1

Cette question nécessite une réponse complexe.

Les interfaces COM ne font pas partie du langage C++. Ils peuvent être implémentés en utilisant différentes langues. C++ est juste l'un d'entre eux.

Chaque interface COM hérite de l'interface IUnknown, qui implémente QueryInterface() AddRef() et Release() méthodes

QueryInterface() doit être utilisé pour demander les interfaces objet COM. Puisque chaque interface COM hérite de IUnknown, elle peut être appelée sur n'importe quelle interface. AddRef() et Release() doivent être appelés pour gérer la durée de vie de l'objet.

> Est une classe de modèle, implémentée dans la bibliothèque Microsoft ATL, pour envelopper n'importe quelle interface COM, qui appelle automatiquement QueryInterface(), AddRef() et Release() lorsque cela est nécessaire.

Dans votre exemple, CComPtr pFileStream peut être utilisé pour accéder aux membres de l'interface IStream d'un objet.

http://msdn.microsoft.com/en-us/library/ezzw7k98%28VS.80%29.aspx

Questions connexes