Com et evenements

hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 - 3 déc. 2003 à 10:33
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 - 3 déc. 2003 à 16:00
Bonjour,

j'ai un objet com (non activex) et je voudrais qu'il puisse réagir à des evenements.
Avec un activeX, le classwizard me genere automatiquement les BEGIN_EVENT_MAP et autres choses nécessaires, par contre, il refuse de le faire lorsque c'est un objet COM.
Que dois-je faire ?

Merci de votre aide

1 réponse

hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
3 déc. 2003 à 16:00
Alors, je crois que j'ai trouvé, mais c'est tout une histoire... Je le mets ici, si y en a que ca interesse.

Alors, c'est un extrait de mon code, avec des commentaires :
(ma classe com est un clavier virtuel (keyboard_com)

alors, il faut dans le .odl (c'est la définition de la méthode qui réagit à l'evenement)

[ uuid(5E01B260-5C15-11cf-A78C-00AA00A70FC2),	  helpstring("Event interface for Keyboard") ]
dispinterface IKeyboardEvent
{
properties:
//  Event interface has no properties
methods:
[id(1)] void KeyPress(short LABEL, VARIANT_BOOL* Cancel);
};


dans le .h qui hérite de CCmdTarget bien sur (on remarque que le guid est contruit)

#define EVENT_PARAM(vtsParams) (BYTE*)(vtsParams)
#include <ole2.h>
#include 
DEFINE_GUID(IID_IKeyboardEvent, 
0x5e01b260, 0x5c15, 0x11cf, 0xa7, 0x8c, 0x0, 0xaa, 0x0, 0xa7, 0xf, 0xc2);


en protected : (définition des méthodes qui envoie l'évenement)

void FireEventV(DISPID dispid, BYTE* pbParams, va_list argList);
void AFX_CDECL FireEvent(DISPID dispid, BYTE* pbParams, ...);



ensuite la définition de l'évenement
//{{AFX_MSG(Keyboard_com)
// NOTE - the ClassWizard will add and remove member functions here.
afx_msg void FireKeyPress(short label, BOOL FAR* Cancel);
//}}AFX_MSG
public:
enum {
eventidEvent1 = 1L,
};
protected:
BEGIN_CONNECTION_PART(Keyboard_com, EventConnPt)
CONNECTION_IID(IID_IKeyboardEvent)	                  
END_CONNECTION_PART(EventConnPt)
DECLARE_CONNECTION_MAP()


dans le .cpp :
(dans le constructeur)
EnableConnections();


préciser le point de connexion :
BEGIN_INTERFACE_MAP(Keyboard_com, CCmdTarget)
INTERFACE_PART(Keyboard_com, IID_IConnectionPointContainer, ConnPtContainer)
END_INTERFACE_MAP()

BEGIN_CONNECTION_MAP(Keyboard_com, CCmdTarget)
CONNECTION_PART(Keyboard_com, IID_IKeyboardEvent, EventConnPt)
END_CONNECTION_MAP()



et les méthodes d'envoi :
void Keyboard_com::FireKeyPress(short label, BOOL FAR * cancel) 
{
FireEvent(eventidEvent1,EVENT_PARAM(VTS_I2 VTS_PBOOL),label,cancel);
}

void Keyboard_com::FireEventV(DISPID dispid, BYTE* pbParams,va_list argList)
{
COleDispatchDriver driver;

const CPtrArray* pConnections = m_xEventConnPt.GetConnections();
ASSERT(pConnections != NULL);

int i;
int cConnections = pConnections->GetSize();
LPDISPATCH pDispatch;

for (i = 0; i < cConnections; i++)
{
pDispatch = (LPDISPATCH)(pConnections->GetAt(i));
ASSERT(pDispatch != NULL);
driver.AttachDispatch(pDispatch, FALSE);
TRY
driver.InvokeHelperV(dispid, DISPATCH_METHOD, VT_EMPTY, NULL,
pbParams, argList);
END_TRY
driver.DetachDispatch();
}
}

void AFX_CDECL Keyboard_com::FireEvent(DISPID dispid, BYTE* pbParams, ...)
{
va_list argList;
va_start(argList, pbParams);
FireEventV(dispid, pbParams, argList);
va_end(argList);
}


Voila, ca a l'air compliqué comme ca, et effectivement ca l'est ...

Bon courage si y en a qui font pareil :)
0
Rejoignez-nous