原文:http://blog.csdn.net/yzx0023/archive/2005/08/11/451491.aspx
第一次寫這玩意,感覺挺彆扭,不過想想以前遇到問題的時候,也從網路上得到過很多協助,同時在CSDN,也看到有些網友在問關於MAPI的問題,自
己雖然水平不怎麼樣,寫東西也爛,但是覺的有必要將自己這幾年積累的東西同大家分享一下,希望對大家能有些協助。我的寫作能力不怎麼樣,這點接下來看我的
文章就會有感覺,呵呵,所以我會盡量用代碼來表達我的意思,對於一些理論知識,我瞭解比較膚淺,有錯誤的地方,希望大家能夠指正,謝謝先!
對於MAPI的意義,用處我就不多說了,大家可以去MSDN上找一下,我的英語爛,免的誤導群眾。接下來的例子為了減少篇幅,我將略去所有錯誤處理,但是在平時的使用過程中,希望使用者能加上詳細的錯誤處理,這能使我們的程式更加健壯。
來看第一個例子,如何擷取tmail(就是我們熟稱的收件匣程式)下各個Message Box下的訊息。
第一步:初始化MAPI:
//session變數,在停止使用MAPI前,請不要釋放它
IMAPISession* m_pSession = NULL;
//COM初始化
CoInitializeEx(NULL, COINIT_MULTITHREADED);
MAPIInitialize(NULL);
MAPILogonEx(NULL, NULL, NULL, NULL, &m_pSession);
退出MAPI
if(m_pSession)
{
m_pSession->Logoff(0, 0, 0);
m_pSession->Release();
m_pSession = NULL;
}
MAPIUninitialize();
CoUninitialize();
第二步:擷取message store,對於message
store,我認為它是管理message和folder的一個集合,它與收件匣下的各個帳戶想對應,每個帳戶對應有一個store,我們可以通過
session來遍曆所有message store,每個store都會有一個DISPLAY
NAME,通過它我們可以獲得指定的store,下面示範如何擷取SMS的Store:
//IMAPITABLE,通過它我們可以訪問資料,比如拿Store,拿Folder,拿Message等,方法都類似,下面會有介紹
LPMAPITABLE pTable = NULL;
ULONG lCount = 0;
HRESULT hr = 0;
LPSRowSet pRows = NULL;
IMsgStore* pMsgStore = NULL;
//希望擷取多少屬性,這裡我們只需要獲得兩個屬性
ULONG ulNumCols = 2;
//通過下面的定義,我們告訴系統,我們需要擷取以下兩個屬性,一個是Entry ID,通過它我們可以擷取Store對象,一個是Display Name,我們用它來比較是不是我們需要的Store
SizedSPropTagArray(ulNumCols , Columns) =
{
ulNumCols ,
PR_ENTRYID, //Store的Entry ID
PR_DISPLAY_NAME //Store的Display Name
};
pSession->GetMsgStoresTable(MAPI_UNICODE , &pTable);
pTable->SetColumns((LPSPropTagArray)&Columns, 0);
while(SUCCEEDED(pTable->QueryRows(1, 0, &pRows)))
{
if (NULL == pRows || pRows->cRows != 1)
{
break;
}
//開始一條條記錄查詢,pRows->aRow[0].lpProps[0]代表了第一個查詢屬性,即Entry ID,pRows->aRow[0].lpProps[1]則表示Display Name。
if (_tcsicmp(pRows->aRow[0].lpProps[1].Value.lpszW, _T("SMS")) == 0)
{
ULONG ulMesageType;
//如果是SMS,則擷取Store對象
pSession->OpenEntry(pRows->aRow[0].lpProps[0].Value.bin.cb,
(LPENTRYID)pRows->aRow[0].lpProps[0].Value.bin.lpb,
NULL,
MAPI_BEST_ACCESS,
&ulMesageType,
(LPUNKNOWN*)&pMsgStore);
break;
}
FreeProws(pRows);
pRows = NULL;
}
if(pRows)
{
FreeProws(pRows);
pRows = NULL;
}
到此,就拿到了SMS的Message Store,累死了,休息一下,接下來讓我們繼續來擷取Folder。在這裡我先提醒一下,前面擷取的IMsgStore和後面要講的IMAPIFolder等對象,在不使用時候需要Release(),千萬別忘記。