Miranda IM (1) 事件处理机制

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值