前言
關鍵字:windows mobile mapirule, mapirule 使用
關于mapirule這裡就不介紹了,主要介紹一下使用的心得和需要注意的問題。
文章
環境
1. 真機系統:windows mobile 6.1
2. 開發工具:microsoft visual studio 2005
3. sdk版本:windows mobile 6 sdk
正文
一、準備
示例位置: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 使用說明
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的系列文章。.
轉載:http://www.cnblogs.com/over140/archive/2010/04/12/1699531.html