MapiRule使用心得

简介:

正文

  一、准备

    示例位置:Windows Mobile 6 SDK\Samples\Common\CPP\Win32\MapiRule

    拷贝一份出来,用Visual Studio 2005打开项目即可。

 

  二、工作原理[摘自文章1]
 

    MapiRule实际上是利用COM技术对tmail.exe功能进行扩展。像所有com程序一样,系统提供了一个接 口(协议)来让外部程序实现,外部程序通过实现该接口来为tmail.exe增加新的功能。CMapiClient是一组接口,当短信到达本地设备的时候,系统会调用一系列的函数获取并加载COM组件,然后调用ProcessMessage方法来处理到达的短消息,这个过程由系统实现,除了 ProcessMessage方法以外不需要我们来写任何程序。

    注意其实MapiRule拦截下来的时候,短信已经到达了短信(邮件)仓库,但没有到具体的信箱(如收件箱、发件箱等),所以这里处理完之后,会调用DeleteMessage来删除短信。

 

  三、 使用和代码说明
 

    3.1  使用说明

      <!--[endif]-->MapiRule的工作机制是基于COM技术的,这里只需要注册该Com组件即可,有三种方法,参加文章一,这里使用安装Cab包的方式注册。编译MapiRule工程,然后编译SetupMapiRule,拷贝在SetupMapiRule\Debug下的SetupMapiRule.CAB和SetupMapiRule.inf两个文件到Windows Mobile模拟器或者真机上安装即可。注意需要重起下系统,到这里为止还没有修改过一行代码,用真机或者Cellular Emulator测试,发送一条短信内容为"zzz"即可,即可看到效果!

 

 

3.2  代码说明

      短信内容:  pspvSubject->Value.lpszW   

      短信号码:  pspvEmail->Value.lpszW

      短信时间:  依次对应上面两项加入以下代码即可获取


// ...
SizedSPropTagArray( 1 , sptaTime)  =  {  1 , PR_MESSAGE_DELIVERY_TIME};

// ...
SPropValue  * pspvTime  =  NULL;

// ...
hr  =  pMsg -> GetProps((SPropTagArray  * & sptaTime, MAPI_UNICODE,  & cValues,  & pspvTime);
if  (FAILED(hr))
{
    
goto  Exit;
}

// 格式化时间
FILETIME ft;
SYSTEMTIME stTime;
FileTimeToLocalFileTime(
& pspvTime  -> Value.ft, & ft);
FileTimeToSystemTime(
& ft, & stTime); 

      进程通讯:

        这里采用窗口消息 WM_COPYDATA方法进行数据传递,并且这里将数据打包成了结构体。

        结构体:

typedef  struct
{
     TCHAR chMobile[
20 ];    // 电话号码
     TCHAR chSubject[ 140 ];  // 短信内容
     SYSTEMTIME SendTime;   // 发送时间
}Sms;

        发送方(MapiRule):

    Sms sms;
    memset(
& sms, 0 , sizeof (Sms));

    HWND pWnd 
=  FindWindow(NULL,L " 你主窗体的标题 " );
    
if (pWnd  ==  NULL){
        
goto  Exit;
    }
    wcscpy(sms.chSubject,pspvSubject
-> Value.lpszW);
    wcscpy(sms.chMobile,pspvEmail
-> Value.lpszW);
    sms.SendTime 
=  stTime;

    COPYDATASTRUCT cpd;                     
// 给COPYDATASTRUCT结构赋值
    cpd.dwData  =   0 ;
    cpd.cbData 
=   sizeof (sms);
    cpd.lpData 
=  ( void * ) & sms;

    ::SendMessage(pWnd,WM_COPYDATA,NULL,(LPARAM)
& cpd);

        接收方:主窗体消息队列

BEGIN_MESSAGE_MAP(CYouWindow, CWnd)
    ON_WM_COPYDATA()
END_MESSAGE_MAP()

BOOL CYouWindow::OnCopyData(CWnd
*  pWnd, COPYDATASTRUCT *   pCopyDataStruct) 
{
    Sms
*  store   =  (Sms * )pCopyDataStruct -> lpData;
}


 

  四、注意

    1.  如果以安装的方式部署的MapiRule,安装完之后需要重启一下,不然可能会截获不到的情况。

    2.  编译出错,说是签名工具问题,关掉MapiRule和SetupMapiRule项目中的证书即可:项目 - Authenticode签名 - 否;或者参照文章1里面的办法。

    3.  关于如何拷贝安装包到模拟器上,可以通过共享文件夹或者随其他工程一起当做文件来发布到模拟器上。

 

结束语

  RIL拦截短信在真机上测试失败, 后来发现很多人都是用MapiRule来实现的,现成的例子,顺便发现SDK下好多例子,有空打算每一个都跑一下看看。如果想进一步操作短信相关的东西,强烈推荐看完文章1的系列文章。



本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586568,如需转载请自行联系原作者

相关文章
|
18小时前
|
云安全 人工智能 自然语言处理
|
5天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
309 116
|
8天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
545 51
Meta SAM3开源:让图像分割,听懂你的话
|
20天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
4天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
|
3天前
|
弹性计算 人工智能 Cloud Native
阿里云无门槛和有门槛优惠券解析:学生券,满减券,补贴券等优惠券领取与使用介绍
为了回馈用户与助力更多用户节省上云成本,阿里云会经常推出各种优惠券相关的活动,包括无门槛优惠券和有门槛优惠券。本文将详细介绍阿里云无门槛优惠券的领取与使用方式,同时也会概述几种常见的有门槛优惠券,帮助用户更好地利用这些优惠,降低云服务的成本。
262 132
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
AgentEvolver:让智能体系统学会「自我进化」
AgentEvolver 是一个自进化智能体系统,通过自我任务生成、经验导航与反思归因三大机制,推动AI从“被动执行”迈向“主动学习”。它显著提升强化学习效率,在更少参数下实现更强性能,助力智能体持续自我迭代。开源地址:https://github.com/modelscope/AgentEvolver
382 29
|
14天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
702 224