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 :

[Urgent] COM, IUnknown


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 24
    Par défaut [Urgent] COM, IUnknown
    Bonjour,
    je travaille sur visual c++ 6.0, j'ai crée une classe qui implemente deux interfaces implémentant elles même l'intérface IUnknown.
    Quand je compile mon projet, j'ai une erreur: ambiguous conversions from 'class CApp *const ' to 'struct IUnknown *' dans cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(iid == IID_IUnknown)
    {
    		*ppvObject = static_cast<IUnknown *> (this);
    		AddRef();
    		return S_OK;
     
    }
    J'ai vu sur MSDN que je devais utiliser cette instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BEGIN_COM_MAP(CRTCApp)
    	COM_INTERFACE_ENTRY2(IUnknown, IRTCEventNotification)
    END_COM_MAP( )
    C'est ce que j'ai fait, mais la il me donne la même erreur avec d'autres en plus; il me dit que je ne peux pas instancier des classes abstraites.
    Est ce que quelqu'un peut me dire comment résoudre ce problème.
    Cordialement,
    Hanane


    [Balises CODE rajoutées par Loulou24, merci d'y penser à l'avenir]

  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
    Bonjour,
    ce qui est urgent, c'est de lire les règles:
    http://club.developpez.com/regles/
    Postez dans le bon forum
    Le Multipost est interdit
    Les balises Code
    Titre de votre message clair
    y'a pas de message plus urgent que les autres.

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    J'ajouterais qu'il est urgent de lire ses messages privés et d'arrêter de reposter dès qu'on te supprime ce sujet du forum C++.

  4. #4
    mat.M
    Invité(e)
    Par défaut
    il me dit que je ne peux pas instancier des classes abstraites.
    Parce que les classes COM utilisent l'héritage ; il faut redéfinir le constructeur de sa nouvelle classe..
    C'est quel type de projet ? ATL -COM ?
    Que veux-tu faire ??

    On n'adresse jamais IUnknow directement .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(iid == IID_IUnknown)
    {
          *ppvObject = static_cast<IUnknown *> (this);
          AddRef();
          return S_OK;
     
    }
    ??
    Dans un projet ATL-COM on n'a pas à écrire ce code ; c'est fait automatiquement par les assistants.
    Il suffit de créer sa propre classe d'interface et ses propres méthodes
    d'interface
    Sur www.codeproject.com il ya un tutoriel qui explique très bien comment créer un projet ATL

  5. #5
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 24
    Par défaut
    Merci pour le lien, je vais voir le tutorial puisque je crois que je suis partie sur des mauvais trucs.
    Merci bcp,
    Hanane

  6. #6
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par hanane_iaai
    Merci pour le lien, je vais voir le tutorial puisque je crois que je suis partie sur des mauvais trucs.
    Merci bcp,
    Hanane
    oui mais on ne sait tjs pas quel type de projet pourquoi faire des classes COM ?

  7. #7
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 24
    Par défaut
    En fait je travaille avec la RTC API de microsoft pour faire un programme de téléphonie.
    Donc ce que j'ai fait c'est de créer un nouveau projet MFC, dedans j'ai créer une classe aù je fais tous mes traitements. Et c'est cette classe qui implemente ces deux intérfaces pour avoir la notification des événements produits.
    Donc après votre réponse, je crois que je dois changer mon type de projet??
    Hanane

  8. #8
    mat.M
    Invité(e)
    Par défaut
    ??
    Il ne faut pas adresser IUnknow !
    MAis plutôt utiliser la classe parfaitement adéquate CComPtr qui permet de gérer les interfaces COM

    CComPtr
    template< class T >
    class CComPtr

    Parameters

    T

    A COM interface specifying the type of pointer to be stored.

    ATL uses CComPtr and CComQIPtr to manage COM interface pointers. Both classes perform automatic reference counting through calls to AddRef and Release. Overloaded operators handle pointer operations. CComQIPtr additionally supports automatic querying of interfaces though QueryInterface.

    The following code is from CFirePropNotifyEvent::FireOnRequestEdit:

    static HRESULT FireOnRequestEdit(IUnknown* pUnk, DISPID dispID)
    {
    CComQIPtr<IConnectionPointContainer,
    &IID_IConnectionPointContainer> pCPC(pUnk);
    if (!pCPC)
    return S_OK;

    CComPtr<IConnectionPoint> pCP;
    pCPC->FindConnectionPoint(IID_IPropertyNotifySink, &pCP);
    if (!pCP)
    return S_OK;

    ...
    };

    This example illustrates the following:

    The constructor for the CComQIPtr object, pCPC, calls QueryInterface on pUnk to obtain the IConnectionPointContainer pointer. The retrieved pointer is stored in pCPC.


    The function declares the CComPtr object, pCP, to hold an IConnectionPoint pointer.


    IConnectionPointContainer::FindConnectionPoint is called through pCPC to retrieve an IConnectionPoint pointer via pCP.
    #include <atlbase.h>

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_atl_CComPtr.asp

Discussions similaires

  1. IUnknown::Release sur un composant COM
    Par scolyo dans le forum Visual C++
    Réponses: 7
    Dernier message: 22/09/2008, 11h45

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