不用多說,看代碼吧
需要頭文件
#include "cemapi.h"
#include "mapidefs.h"
#include "mapiutil.h"
庫文件cemapi.lib
//依此讀每條記錄
HRESULT ReadMessage(IMsgStore *pStore, LPCTSTR pszFileName)
{
HRESULT hr;
static const SizedSSortOrderSet(1, sortOrderSet) = {1, 0, 0, {PR_MESSAGE_DELIVERY_TIME, TABLE_SORT_DESCEND}};
static const SizedSPropTagArray(3, spta) = {3, PR_SENDER_NAME, PR_SUBJECT, PR_MESSAGE_DELIVERY_TIME};
LPENTRYID pEntryId = NULL;
ULONG cbEntryId = 0;
CComPtr<IMAPIFolder> pFolder; //文件夾
CComPtr<IMAPITable> ptbl;
ULONG ulObjType = 0;
SRowSet *prowset = NULL;
//首先獲取收件箱的ID;
hr = pStore->GetReceiveFolder(NULL, MAPI_UNICODE, &cbEntryId, &pEntryId, NULL);
//然後通過ID來打開對象
hr = pStore->OpenEntry(cbEntryId, pEntryId, NULL, 0, &ulObjType, (LPUNKNOWN*)&pFolder);
ASSERT(ulObjType == MAPI_FOLDER);
//得到文件夾
hr = pFolder->GetContentsTable(0,&ptbl);
//再通過文件夾得到裏面的各文件
hr = ptbl->SortTable((SSortOrderSet*)&sortOrderSet,0);
//設置我們要查詢的對象
hr = ptbl->SetColumns((SPropTagArray*)&spta,0);
//最後依次讀取每條記錄
while(TRUE)
{
FreeProws(prowset);
prowset = NULL;
hr = ptbl->QueryRows(1, 0, &prowset);
if((hr != S_OK) || (prowset == NULL) || (prowset->cRows == 0))
break;
ASSERT(prowset->aRow[0].cValues == spta.cValues);
SPropValue *pval = prowset->aRow[0].lpProps;
//得到我們要查詢的:收到的名字,主題,時間
ASSERT(pval[0].ulPropTag == PR_SENDER_NAME);
ASSERT(pval[1].ulPropTag == PR_SUBJECT);
ASSERT(pval[2].ulPropTag == PR_MESSAGE_DELIVERY_TIME);
LPCTSTR pszSender = pval[0].Value.lpszW;
LPCTSTR pszSubject = pval[1].Value.lpszW;
SYSTEMTIME st = {0};
FileTimeToSystemTime(&pval[2].Value.ft, &st);
//顯示結果
AfxMessageBox(pszFileName);
AfxMessageBox(pszSender);
AfxMessageBox(pszSubject);
}
return hr;
}
//打開SMS得到記錄,讀取短信的函數
HRESULT ReadSmsMessage(IMAPISession *pSession, LPCTSTR pszFileName)
{
static const SizedSPropTagArray (2,spta) = {2, PR_DISPLAY_NAME, PR_ENTRYID};
HRESULT hr;
SRowSet *prowset = NULL; //相當於TABLE的一條記錄
CComPtr<IMAPITable> ptbl; //ISession首先要獲得的接口,TABLE相當於一個數據庫
CComPtr<IMsgStore> pStore;
hr = pSession->GetMsgStoresTable(0, &ptbl);
//設置一下數據庫中我們要查詢的列
hr = ptbl->SetColumns((SPropTagArray*)&spta,0);
//然後進入查詢狀態
while(TRUE)
{
FreeProws(prowset); //首先釋放前一個對象
prowset = NULL;
hr = ptbl->QueryRows(1, 0, &prowset); //查詢一行對象,一個記錄集
if((hr != S_OK) || (prowset==NULL) || (prowset->cRows==0)) //沒查詢到時退出循環
break;
//查看是否是我們想要的結果
ASSERT(prowset->aRow[0].cValues == spta.cValues);
SPropValue *pval = prowset->aRow[0].lpProps;
ASSERT(pval[0].ulPropTag == PR_DISPLAY_NAME);
ASSERT(pval[1].ulPropTag == PR_ENTRYID);
//找到我們想要的對象
if(!_tcscmp(pval[0].Value.lpszW , L"SMS"))
{
//打開進行讀取短信
hr = pSession->OpenMsgStore(0,pval[1].Value.bin.cb, (LPENTRYID)pval[1].Value.bin.lpb, 0, 0, &pStore);
ReadMessage(pStore, pszFileName);
}
}
FreeProws(prowset);
prowset = NULL;
return hr;
}
void CMySMSReadDlg::OnBnClickedButtonStartServer()
{
// TODO: 在此添加控件通知處理程序代碼
HRESULT hr;
ICEMAPISession *pSession=NULL; //進入MAPI首先要獲得的接口
//然後是初始化MPAI,與COM一樣都要現初始化一下才能用
hr = MAPIInitialize(NULL);
if(FAILED(hr))
{
MessageBox(L"初始化MAPI失敗");
return;
}
hr = MAPILogonEx(0,NULL,NULL,0,(LPMAPISESSION*)&pSession); //進入MAPI獲取ISession接口
//開始讀取短信的內容
ReadSmsMessage(pSession, L"TestFileName");
//最後的退出處理
hr = pSession->Logoff(0,0,0);
pSession = NULL;
MAPIUninitialize();
}