Pocket 通過MAPI閱讀短信

不用多說,看代碼吧

需要頭文件

#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();

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章