日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CEMAPI实战攻略(四)——发送短消息

發布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.exeId

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: 調用類型, MMSSMS

??? -attach: 添加附件

??? -subject: 添加subject

??? -to: 添加目標地址

2.?????? 利用tmail.exe發送一條短消息

前面部分已經詳細的討論過,如何在具體信箱中建立一條短信息了,其實建立了一條短信,就已經完成了短信發送功能中95%內容了。這里只介紹一個方法,IMessage::SubmitMessage方法,用于像tmail.exe提交已經創建的短信息,并由tmail完成短信發送過程。該方法的定義如下:

HRESULT IMesssage::SubmitMessage(ULONG ulFlag);

?????????????????? ?返回只用于判斷方法是否正確執行。參數列表:

ulFlag:發送標志,可選擇的值有FORCE_SUBMIT0,短信應用中一般選擇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目錄,在其中添加一個名為SMSNoSentMsgDWORD類型的鍵,值為1。然后重啟設備或者仿真器即可。

5.?????? 源程序

還是等文章寫完后,整理好再發吧。

?

轉載于:https://www.cnblogs.com/wude/archive/2009/03/11/1941605.html

總結

以上是生活随笔為你收集整理的CEMAPI实战攻略(四)——发送短消息的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。