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