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 :)