CEMAPI实战攻略(四)——发送短消息
CEMAPI實(shí)戰(zhàn)攻略(四)——發(fā)送短消息
By 吳春雷
QQ:819543772
EMail:wuchunlei@163.com
四.發(fā)送短消息
發(fā)送短信是一個(gè)相對(duì)比較簡單的過程,之所以拿出來一節(jié)來討論,是因?yàn)槲覀儾粌H僅要討論如何發(fā)送短信,還要討論一個(gè)重要的進(jìn)程,也就是tmail.exe進(jìn)程。簡單的講,這個(gè)進(jìn)程在后臺(tái)控制著短信和郵件的接收和發(fā)送過程,在前臺(tái)提供一個(gè)顯示UI,供大家對(duì)短信進(jìn)行操作。本文短信發(fā)送部分,就是利用tmail的短信發(fā)送功能實(shí)現(xiàn)的,不需要直接使用AT命令,這使得我們發(fā)送短信部分的代碼變得異常簡單。
1.?????? tmail.exe進(jìn)程
a)???????? 什么是tmail.exe進(jìn)程
tmail.exe是微軟處理消息的核心模塊,處理包括短信,outlook等郵件消息,也包括第三方定制的MMS功能模塊。為了方便第三方開發(fā),微軟定義了一些列的COM接口,可以將很多第三方開發(fā)的模塊集成到tmail.exe中,從而擴(kuò)展了tmail.exe的功能。WM5.0版本以前的彩信功能,多半是第三方開發(fā)者通過實(shí)現(xiàn)該COM接口提供的。最后我們提到的短信攔截的程序MapiRule,本質(zhì)也是實(shí)現(xiàn)了IMapiClient接口的ProcessMessage方法,然后注冊(cè)到系統(tǒng)中,tmail在啟動(dòng)時(shí)加載了這個(gè)COM組件,從而擁有了短信截獲的功能。
b)???????? 判斷tmail.exe進(jìn)程是否正在運(yùn)行
??????????????? ? 很多時(shí)候,我們希望能夠知道目前tmail.exe是否在運(yùn)行,從而進(jìn)行后續(xù)的操作。比如,發(fā)送短信的時(shí)候我們要確保tmail.exe已經(jīng)在運(yùn)行中,否則即便成功發(fā)送短信的程序,短信也只會(huì)被存在發(fā)件箱中,等待tmail.exe啟動(dòng)以后才能被發(fā)送出去。也有些時(shí)候,我們不希望tmail.exe運(yùn)行,比如后面為tmail.exe注冊(cè)MapiRule的時(shí)候。所以,要想繼續(xù)本文的內(nèi)容,首先需要解決tmail.exe進(jìn)程的查找問題,也就是判斷tmail.exe進(jìn)程是否正在運(yùn)行。這部分內(nèi)容雖然不屬于cemapi的范疇,但卻是必須的基礎(chǔ)。
判斷tmail.exe進(jìn)程是否在運(yùn)行的思路是,首先對(duì)系統(tǒng)進(jìn)程、堆、線程做一個(gè)快照,然后在快照中遍歷所有進(jìn)程,查找進(jìn)程名為tmail.exe的進(jìn)程,如果存在則認(rèn)為tmail.exe進(jìn)程正在運(yùn)行,否則tmail.exe進(jìn)程不再運(yùn)行。我直接給出了這部分的源程序,并在上面增加了注釋和說明,程序很簡單,非常容易理解,您也可以直接復(fù)制過去使用,畢竟這不是本文關(guān)注的重點(diǎn)。
??????????????????????????? ?//參數(shù)為要查找的進(jìn)程全名,如:tmail.exe
??????????????????????????? ?//返回0則進(jìn)程不存在,否則返回進(jìn)程Id
DWORD FindProcess(CString strProcessName)
{
DWORD dwPid = 0;????????? //用于保存tmail.exe的Id
HANDLE hHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);? //為當(dāng)前系統(tǒng)進(jìn)程建立快照
DWORD dwId = ::GetCurrentProcessId();???? //當(dāng)前進(jìn)程的Id
????? if (INVALUE_HANDLE_VALUE!=hHandle) ?????//如果快照建立成功
????? {
????????? PROCESSENTRY32 stEntry;
????????? stEntry.dwSize = sizeof(PROCESSENTRY32);
????????? if(Process32First(hHandle, &stEntry))???? //在快照中查找一個(gè)進(jìn)程,stEntry返回進(jìn)程相關(guān)屬性和信息
????????? {
????????????? do
????????????? {
????????????????? if(wcsstr(stEntry.szExeFile,strProcessName))? ?//比較該進(jìn)程名稱是否與strProcessName相符
????????????????? {
????????????????????? if(dwId != stEntry.th32ProcessID)?????? //如果相等,且該進(jìn)程的Id與當(dāng)前進(jìn)程不相等,則找到strProcessName對(duì)應(yīng)的進(jìn)程。
????????????????????? {
????????????????????????? dwPid = stEntry.th32ProcessID;?
????????????????????????? break;
????????????????????? }
????????????????? }
????????????? }while(Process32Next(hHandle, &stEntry));?? //再快照中查找下一個(gè)進(jìn)程。
????????? }
????????? CloseToolhelp32Snapshot(hHandle);?????? ??????? //釋放快照句柄。
????? }
????? return dwPid;
}
?
程序很好理解,需要提醒一下讀者的是,使用CreateToolhelp32Snapshot函數(shù)需要包含tlhelp32.h這個(gè)頭文件,并且需要添加toolhelp.lib庫文件。
c)???????? 殺掉tmail.exe進(jìn)程
獲取到了進(jìn)程ID以后,殺掉這個(gè)進(jìn)程就變得很簡單了。代碼如下:
DWORD dwPid=FindProcess(_T(“tmail.exe”));
if(0!=dwPid){????? //找到進(jìn)程
HANDLE?? hHandle=OpenProcess(PROCESS_TERMINATE,FALSE,dwPid);?? ??//根據(jù)進(jìn)程ID,獲取tmail.exe的句柄
TerminateProcess(hHandle,0);??????? //關(guān)閉進(jìn)程
}
d)???????? 啟動(dòng)tmail.exe進(jìn)程
直接調(diào)用CreateProcess函數(shù)就可以啟動(dòng)進(jìn)程,代碼如下:
//啟動(dòng)tmail.exe進(jìn)程
CreateProcess(_T("tmail.exe"), _T("-RunInBKG"),NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL);
命令行參數(shù) –RunInBKG,表示tmail.exe后直接在后臺(tái)運(yùn)行,避免短信郵件瀏覽器的出現(xiàn)。另外tmail.exe還有很多很有用的命令行參數(shù),下面一一列舉出來。(這部分內(nèi)容雖然很多網(wǎng)站都有有介紹,但由于我是在無聊客的文章中最先看到的,所以這里就只注明引用自無聊客的《MAPI的一些問題解答(by 無聊客)》)
-service: 調(diào)用類型, MMS或SMS
??? -attach: 添加附件
??? -subject: 添加subject
??? -to: 添加目標(biāo)地址
2.?????? 利用tmail.exe發(fā)送一條短消息
前面部分已經(jīng)詳細(xì)的討論過,如何在具體信箱中建立一條短信息了,其實(shí)建立了一條短信,就已經(jīng)完成了短信發(fā)送功能中95%內(nèi)容了。這里只介紹一個(gè)方法,IMessage::SubmitMessage方法,用于像tmail.exe提交已經(jīng)創(chuàng)建的短信息,并由tmail完成短信發(fā)送過程。該方法的定義如下:
HRESULT IMesssage::SubmitMessage(ULONG ulFlag);
?????????????????? ?返回只用于判斷方法是否正確執(zhí)行。參數(shù)列表:
ulFlag:發(fā)送標(biāo)志,可選擇的值有FORCE_SUBMIT和0,短信應(yīng)用中一般選擇0,我加上了FORCE_SUBMIT標(biāo)志,感覺沒什么不同,估計(jì)是要用在特定環(huán)境中的吧,具體作用大家補(bǔ)充吧。
??????? 發(fā)送短信的代碼與建立消息基本上完全一樣,大家可以參考,唯一不同的是要將最后m_pMsg->SaveChange(0)這句替換成m_pMsg->SubjectMessage(0)即可。
4.?????? 如何屏蔽掉短信發(fā)送后的系統(tǒng)提示信息
??????????????? 每次消息發(fā)送后,系統(tǒng)都會(huì)出現(xiàn)一個(gè)提示框,提示消息已經(jīng)發(fā)送。如果開發(fā)我們自己的應(yīng)用程序,當(dāng)然不希望每發(fā)一次消息,提示框就出來露次臉了,那么如果屏蔽掉短信發(fā)送后的系統(tǒng)提示信息呢?其實(shí),這部分也跟cemapi沒啥關(guān)系,但為了文章盡量系統(tǒng),也把它寫在這里吧。
????? 在Windows(是PC端哈)菜單上選擇“開始”——“程序”——“Microsoft Visual Studio 2005”——“Visual Studio Remote Tools”啟動(dòng)“遠(yuǎn)程注冊(cè)表編輯器”,在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Inbox目錄下創(chuàng)建一個(gè)Settings目錄,在其中添加一個(gè)名為SMSNoSentMsg的DWORD類型的鍵,值為1。然后重啟設(shè)備或者仿真器即可。
5.?????? 源程序
還是等文章寫完后,整理好再發(fā)吧。
?
轉(zhuǎn)載于:https://www.cnblogs.com/wude/archive/2009/03/11/1941605.html
總結(jié)
以上是生活随笔為你收集整理的CEMAPI实战攻略(四)——发送短消息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DirectoryEntry所有字段对应
- 下一篇: IE8 能否再创辉煌?