MapiRule使用心得-阿里云开发者社区

开发者社区> 科技小先锋> 正文

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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10095 0
java内部类深入详解 内部类的分类 特点 定义方式 使用
本文关键词: java内部类 内部类的分类 特点  定义方式 使用   外部类调用内部类 多层嵌套内部类  内部类访问外部类属性  接口中的内部类  内部类的继承  内部类的覆盖  局部内部类 成员内部类 静态内部类 匿名内部类 内部类定义 将一个类定义放到另一个类的内部,这就是内部类 ...
2546 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
2963 0
使用spring@Schedule注解定时任务时将时间表达式写入配置文件中的方法
@PropertySource("classpath:root/test.props") 然后修改你的@Scheduled(cron="0/5 * * * * ? ") 为 @Scheduled(cron="${jobs.
1994 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10886 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13893 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
11893 0
面试官:讲讲Redis的五大数据类型?如何使用?(内含完整测试源码)
最近面试跳槽的小伙伴有点多,给我反馈的面试情况更是千差万别,不过很多小伙伴反馈说:面试中的大部分问题都能够在我的公众号【冰河技术】中找到答案,面试过程还是挺轻松的,最终也是轻松的拿到了Offer!听到这些,我也确实替小伙伴们高兴!今天,我们再分享一个面试场景:讲讲Redis的五大数据类型?如何使用?
27 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7365 0
[Android]使用自定义JUnit Rules、annotations和Resources进行单元测试(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5795091.html 使用自定义JUnit Rules、annotations和Resources进行单元测试 原文:http://www.thedroidsonroids.com/blog/android/unit-tests-rules-annotations-resources 简介 Unit Test并不只有断言和测试方法组成。
862 0
6967
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载