无聊客的专栏

寻找逝去的岁月

陈军ID:yzx0023
49245次访问,排名2147好友11人,关注者32
yzx0023的文章
原创 16 篇
翻译 0 篇
转载 0 篇
评论 357 篇
无聊客的公告
本BLOG所有文章都系作者无聊客原创,请尊重作者辛苦劳动,转载请注明版权出处。
最近评论
prow:不好意思,继续问问,如果点击了 通知图标 系统会给定义的窗口发送消息吗 谢谢
prow:我用了你的自定义菜单,可是点击图标后没有菜单弹出啊,而且那个图标也消失,有什么办法想 显示电池图标一样,不消失啊谢谢
hans:每条SMS有唯一标识吗?如何取得?
就像联系人的OID~~~
chendeke:对不起,我不是有意的,我的网络慢,还以为没有发出去呢,所以多点了几下,没想到会这样,对不起。
chendeke:amoica8 ,“对你的文章很感兴趣,按照你说的进行了一些尝试,效果。现在有一个问题想请较一下:
我在短信的编辑菜单里添了一个扩展菜单,被调用时,已经能获得IMessage的指针,也能取得PR_SUBJECT,但无法更改正文的内容,比如我想在现有的内容后面加一些字,如何实现呢?谢谢”
我现在想要实现的一个功能就是你说的这个,在短信的编辑菜单里加一个菜单项,通过点……
文章分类
收藏
    相册
    me
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 (原创)CE MAPI实例讲解 --- 监视Message的状态改变(三)收藏

    新一篇: (原创)CE MAPI实例讲解 --- IMAPIAdviseSink的一个例子(四) | 旧一篇: Windows Mobile5.0 安全模型学习笔记 by无聊客( 一 )

    有时候,我们需要关心某条message的改变,需要做出及时的响应,我们当然不能主动的不断的QUERY MESSAGE的状态,好在系统提供了IMAPIAdviseSink,通过它我们可以获得Message移动、改变以及删除等等通知。

         首先我们要做的是实现自己的IMAPIAdviseSink接口,原型是:

           class CAdviseSink : public IMAPIAdviseSink 

         {

             public:

                  CAdviseSink();

                  ~CAdviseSink();

                  MAPIMETHOD_(ULONG,OnNotify)(ULONG cNotif, LPNOTIFICATION lpNotifications);

                  MAPIMETHOD(QueryInterface)(REFIID iid, void** ppvObject);

                  MAPIMETHOD_(ULONG, AddRef)();

                  MAPIMETHOD_(ULONG, Release)();

     

             private:

                  ULONG              m_cRef;

         };

           我们主要关注的是OnNotify,其他函数我们可以按照标准实现就可以了。我们先来看看OnNotify的一个简单的实现,关键地方我加了注释:

         ULONG CAdviseSink::OnNotify(ULONG cNotif, LPNOTIFICATION lpNotifications)

         {       

             // cNotif : 指定有多少个Notification通知

             // lpNotifications : Notification数组,个数为cNotif

              for(int i = 0; i < (int)cNotif; ++i)

             {

                  //根据不同的Notification类型做不同的处理,类型有很多种,这里只是简单的列出的几种,要获取这些通知和注册AdviseSink密切相关,你需要告诉系统,你关心哪些方面的消息,比如消息的移动,删除等等,系统就会把这些相应的通知发给你,而其他你不关心的,就不会通知到你,这些我们会在后面注册部分讲到。

                  switch(lpNotifications[i].ulEventType)

                  {

                       case fnevObjectMoved:

                            break;

                       case fnevObjectModified:

                            break;  

                       case fnevObjectDeleted:

                            break;

                       default:

                           break;  

                  }

             }

             return 0;

         }   

        

         接下来是注册AdviseSink,它与每个AccountStore相对应,比如SMSOUTLOOK等等。以下是注册步骤:

    A.        获取要监视的Message Store对象,从前面的文章里的我们已经知道如何获得指定的Message Store,这里我们拿SMSStore来举例。

    B.        创建我们自己的CAdviseSink对象

    C.        调用IMsgStore::Advise注册

    以下是注册示例代码:

    IMsgStore* pMsgStore   = …… //获取SMS Message Store

    CAdviseSink* g_pAdviseSink = new CAdviseSink();

    ULONG m_ulAdviseSink   = 0; //用来标识AdviseSink,当取消注册时我们需要用到它。

    // uEventMask : 它的作用是告诉系统,我们关心哪些方面的notification,没有列出来的事件在CAdviseSink::OnNotify里面就不会响应到。

    ULONG uEventMask = fnevCriticalError | fnevNewMail | fnevObjectCreated | fnevObjectDeleted |

                  fnevObjectModified | fnevObjectMoved | fnevObjectCopied | fnevSearchComplete | fnevTableModified |      

                  fnevStatusObjectModified | fnevReservedForMapi | fnevExtended; 

    pMsgStore->Advise(0, NULL, uEventMask, g_pAdviseSink, &m_ulAdviseSink);

    这样就注册成功了。

     

    以下是取消注册的示例代码:

    if(m_ulAdviseSink)

    {

         pMsgStore->Unadvise(m_ulAdviseSink);

    }

    //记的释放对象

    if(g_pAdviseSink)

    {

         delete g_pAdviseSink;

         g_pAdviseSink = NULL;

    }

     

         前面只是简单的介绍了下AdviseSink的用法,在下一篇里,我会通过一个具体的例子来讲述在平时开发中AdviseSink的用途。

        无聊客

    yzx0023@gmail.com

       2006.4.25

    发表于 @ 2006年04月25日 23:11:00|评论(loading...)|编辑

    新一篇: (原创)CE MAPI实例讲解 --- IMAPIAdviseSink的一个例子(四) | 旧一篇: Windows Mobile5.0 安全模型学习笔记 by无聊客( 一 )

    评论

    #灰色代码 发表于2006-04-26 12:35:00  IP: 221.3.42.*
    很棒的文章.期待你出一个MAPI系列的教程.
    #great_mountain 发表于2006-07-13 13:27:00  IP: 10.193.74.*
    如果我用smartphone中自带的程序删除一条短信,用这种方法好像检测不到这条删除消息,如果想捕获到这条消息用什么方法啊????谢谢啦
    #yzx0023 发表于2006-07-13 20:45:00  IP: 220.191.34.*
    To great_mountain:你所说的smartphone中自带的程序是指什么?收件箱?应该可以收到的
    #flyfromme 发表于2006-09-27 15:50:00  IP: 219.239.32.*
    请问用MailRule将DLL加载到系统中后,如何DEBUG?
    #flyfromme 发表于2006-09-27 15:51:00  IP: 219.239.32.*
    请问用MailRule将DLL加载到系统中后,如何DEBUG?
    #yzx0023 发表于2006-09-27 19:33:00  IP: 60.176.55.*
    To flyfromme:你可以调试tmail.exe试试
    #hdw191 发表于2007-08-10 11:21:39  IP: 219.136.30.*
    无聊客你好~

    非常感谢你的这段解释与源代码, 通过这些我现在已经可以成功捕捉到短信的一些改变消息,并可以让它正常的为我的程序工作.

    现在我遇到一个问题,即在调用 IMAPISession::Advise 函数后,似乎在某些情况下革忽然收不到任何事件消息, (暂时还未调试到出现该问题的具体原因,但我已遇到两次),出现该问题后,重启我的程序,即重新调用 IMAPISession::Advise后又可以正常工作了.
    我查过msdn 里面有提到:
    Advise establishes a connection between the caller's advise sink object and the session. This connection is used to send notifications to the advise sink when one or more events as specified in the ulEventMask parameter occur to the session.

    ...我想它应该是讲 Advise函数会在调用者advise sink对象与 session之间建立一个连接, 我看来看去实在不明白这里的session指的是什么, 我想是不是它存在一些生命周期之类的,导致建立的这条连接断开了,假如是这样,我想是不是程序会收到某些消息....
    我的问题就是这样, 无聊客能否给指点一下?
    先谢谢了~
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 无聊客