Miranda 是一个支持多协议的,运行于windows平台下的IM软件。其使用pure c语言编写,其架构体系支持插件方式加载,如多协议的支持msn,yahoo,gtalk等都以插件的方式加载,用户可以根据需要加载,同时皮肤界面相关组件如clist等也以插件的方式加载。
如上所述平台的实现以一些技术实现为基础,先要说的是miranda中的事件定义,通知机制。因为使用纯C编写的,所以不可能采用如com中的连接点等方式来作为事件通知,但miranda采用的事件通知方式,跟COM的连接点方式原理类似。所不同的是 COM的实现如MFC,ATL有一套机制来实现,这样用户可以定义不同的事件接口函数。而在纯C的实现中,我们要保证程序的简洁实用,最简单的办法当然是所有事件函数的原型是一样的,这样有助于事件的管理和程序实现。其事件原型是 typedef int (*MIRANDAHOOK)(WPARAM,LPARAM) 有点类似于win32的消息处理函数。
1 事件定义:
HANDLE CreateHookableEvent(const char *name) 创建一个事件,即其他模块可以和这个事件绑定,到此事件发生时,通知相应模块。
static THookList *hook 。此链表记录通过上面函数创建的事件。创建的时候以一个hash算法将字符串转化为一个整数,这个整数为这个事件的唯一标识。
2 HookEvent:
即相当于COM 连接点的Advise的过程。
HANDLE HookEvent(const char *name,MIRANDAHOOK hookProc)
THookList结构中THookSubscriber* 记录通过HookEvent传递的事件函数指针,其也为一个链表。
3 卸载Hook
int UnhookEvent(HANDLE hHook)
调用此函数卸载通过HookEvent放上去的事件。
4 事件通知
当特定事件产生需要通知时,调用函数来实现事件回调并通知
int (*NotifyEventHooks)(HANDLE,WPARAM,LPARAM)
由THookSubscriber定义
typedef struct {
MIRANDAHOOK pfnHook;
HINSTANCE hOwner;
HWND hwnd;
UINT message;
} THookSubscriber;
可知其还可以实现一个win32消息的回调,即通过Windows消息的方式来通知那些通过HookEventMessage添加的窗口句柄。
综上所述,miranda在事件实现这块代码并不复杂,虽然不像COM的连接点那样灵活,但也基本上满足需要。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/alexding2008/archive/2008/07/14/2647006.aspx