2010-06-07 4 views
1

les gars! Question très importante:Besoin d'aide avec les événements dans COM en C++ pur!

Veuillez regarder my project (300Kb). Je ne peux pas utiliser MFC/ATL, C++ pur seulement.

J'ai une bibliothèque COM (niapi.dll), mais aucune source/en-tête disponible, dll seulement.

Il existe une classe pour la connexion au serveur (NiApi :: SrvrSession), la classe a un gestionnaire d'événements de connexion (NiApi :: SrvrSession :: OnLogin).

J'utilisé

#import "NiApi.dll" 

pour générer des wrappers/informations,

puis

ISrvrSessionPtr session(L"NiApi.SrvrSession"); 

pour créer un objet, puis essayer

session->put_OnLogin(); 

pour assigner des événements, mais il n'est pas un put_On ou un tel membre.

niapi.tlh a struct_ISrvrSessionEvents à l'intérieur, mais il n'a pas de relations avec SrvrSession.

J'ai besoin d'utiliser les événements de NiApi :: SrvrSession pour gérer l'état de la connexion.

S'il vous plaît aider ou mon patron me tuer! (désolé pour l'anglais cassé, je lis mieux que parler;)

+0

"S'il vous plaît aider ou mon patron me tuer!" - Pas si tu le tues en premier. –

+1

J'ai besoin de lui, il m'apporte de l'argent ... – Artem

Répondre

2

événements COM sont gérés via des points de connexion. Vous devez écrire votre propre objet COM qui implémente l'interface d'événement qui vous intéresse. Ensuite, vous devez le connecter à l'objet COM qui déclenche les événements. Tout d'abord vous QI l'objet COM pour son IConnectionPointContainer, puis trouvez le point de connexion correspondant du GUID de l'interface d'événement. Vous appelez sa méthode Advise pour la connecter à votre récepteur d'événements.

class CSrvrSessionEvents: public _ISrvrSessionEvents 
{ 
public: 
    HRESULT OnLogin(long LoginResult) 
    { 
     // do something 
     return S_OK; 
    } 
    // implement rest of _ISrvrSessionEvents 
}; 

ISrvrSession* pSrvrSession = ...; // get ISrvrSession from somewhere 
_ISrvrSessionEvents* pSrvrSessionEvents = new CSrvrSessionEvents(); 
IConnectionPointContainer* pCPC = NULL; 
pSrvrSession->QueryInterface(IID_IConnectionPointContainer, &pCPC); 
IConnectionPoint* pCP = NULL; 
pCPC->FindConnectionPoint(__uuidof(_ISrvrSessionEvents), &pCP); 
DWORD dwCookie = 0; 
pCP->Advise(pSrvrSessionEvents, &dwCookie); 
pSrvrSession->Connect(); // I assume this fires some events 
pCP->Unadvise(dwCookie); 
+1

Je rencontre COM il y a 4 heures et mon cerveau va craquer :) Luke, je le promets, dans quelques jours je deviendrai un COM-Guru! Mais à ce moment j'ai besoin de la manière la plus simple de gérer les événements. Nous avons ISrvrSession et _ISrvrSessionEvents dans niapi.tlh, doit être le moyen le plus simple de les faire travailler ensemble! (Incorrect?) COM DLL est binaire, la gestion des événements doit déjà être implémentée dans DLL. (Mauvais?) Si ce 'Sinks' est seulement un moyen de gérer les événements, s'il vous plaît, montrez-moi un code plus spécifique, un peu facile à comprendre. s'il te plaît s'il te plaît s'il te plaît! – Artem

+0

@Artem: Luke vous l'a bien expliqué.Malheureusement, COM n'est pas facile à comprendre, et en implémentant des points de connexion directement en C++ sans l'utilisation d'ATL, vous faites quelque chose de très avancé que la plupart des experts COM devraient penser. Je vous suggère de commencer à étudier des livres sur COM. 4 heures ne vont pas vous y arriver. Plus comme 4 semaines. –

+0

@Artem: Je comprends que voir le code tant à faire une chose en apparence simple, vous fait peur, mais la triste vérité est tout le code ci-dessus est nécessaire et certains détails sont importand même omis. – sharptooth

1

Ce qui est vraiment nécessaire, est de lire attentivement codeproject_TEventHandler.

Tout est expliqué ici.

+0

C'est assez simple, quand vous comprenez ce que vous faites. – Artem

Questions connexes