2010-11-30 7 views
4

Je suis un programmeur Linux et nouveau dans la programmation COM et j'ai hérité d'un programme que je suis en train de modifier. J'ai un fichier IDL avec la dispinterface suivante et j'essaye de mettre en place un rappel en C++. J'ai fait des recherches sur le web et j'ai trouvé des trucs avec des points de connexion, mais je ne vois pas un exemple simple que je peux suivre, alors je me demandais si quelqu'un pouvait m'aider.simple rappel dans le visuel C++

Le dispinterface:

[ 
    helpstring("Event interface"), 
    helpcontext(0x00000006) 
] 
dispinterface _DEvents { 
    properties: 
    methods: 
     [id(0x00000001), helpstring("Occurs when about to begin."), helpcontext(0x0000000d)] 
     void Starting(); 
     [id(0x00000002), helpstring("Occurs at the beginning."), helpcontext(0x00000011)] 
     void Begin(); 
     [id(0x00000003), helpstring("Occurs at the end."), helpcontext(0x00000012)] 
     void End(); 
}; 

Le coclasse:

[ 
    helpstring("C Class"), 
    helpcontext(0x0000009e) 
] 
coclass C { 
    [default] interface IE; 
    [default, source] dispinterface _DEvents; 
}; 

L'interface évier:

[ 
    odl 
] 
interface INotifySink : IUnknown { 
    HRESULT _stdcall Starting(); 
    HRESULT _stdcall Begin(); 
    HRESULT _stdcall End(); 
}; 

J'ai trouvé ces deux articles, mais je ne peux pas faire la tête ou queues d'entre eux:

J'imagine que je dois faire une nouvelle classe qui étend INotifySink, et met en œuvre les fonctions, mais que dois-je faire après cela?

Merci, Jayen

post-scriptum Faites-moi savoir si je dois fournir plus d'informations et je modifierai cette question. Merci.

+0

jetez un oeil à http://www.codeproject.com/KB/COM/intro_connectionpoints.aspx –

+0

qui ne vous aide pas vraiment. 1) J'ai déjà un coclass (que j'ai maintenant ajouté à la question). 2) VS2008 ne me montre pas l'option 'Mettre en place un point de connexion ...' – Jayen

+0

Qu'est-ce que vous utilisez pour implémenter la coclasse? MFC? ATL? MFC et ATL ont toutes les deux des facilités pour faire l'implémentation de IConnectionPointContainer et IConnectionPoint, etc. ne vous font pas perdre votre santé mentale. –

Répondre

1

Demandez-vous comment consommer les événements de la coclass existante? Pour ce faire, vous devez créer un objet qui implémente l'interface _DEvents, pas une nouvelle interface.

Quelque chose comme:

class EventSink : public _DEvents 
{ 
    AddRef() { ... } 
    Release() { ... } 
    QueryInterface(...) { ... } 
    Starting() { printf("Starting happend\n"); } 
    Begin() { ... } 
    End() { ... } 
} 
EventSink *es = new EventSink; 
IE *objectOfInterest = ...; 
IConnectionPointContainer *cpc; 
objectOfInterest->QueryInterface(&cpc); 
IConnectionPoint *cp; 
cpc->FindConnectionPoint(__uuidof(_DEvents), &cp); 
cp->Advise(es, &cookie); 
objectOfInterest->somethingthatfiresanevent(); 

Est-ce que sens?

+0

Oui, cela semble logique. Je vais essayer et vous le faire savoir. Dois-je remplacer AddRef, Release et/ou QueryInterface? Maintenant, je me demande ce que l'interface INotifySink dans le logiciel tiers est utile pour ... – Jayen

+0

Vous devrez les implémenter en quelque sorte (ils sont purement virtuel). –