📄 mapiex.cpp
字号:
#pragma comment(lib,"cemapi.lib")
#pragma comment(lib,"UUID.lib")
#include "MAPIEx.h"
int MAPIEx::cm_nMAPICode=MAPI_UNICODE;
MAPIEx::MAPIEx()
{
m_pSession=NULL;
m_pMsgStore=NULL;
m_pFolder=NULL;
m_pContents=NULL;
m_sink=0;
}
MAPIEx::~MAPIEx()
{
Logout();
}
BOOL MAPIEx::Init()
{
if(MAPIInitialize(NULL)!=S_OK) return FALSE;
return TRUE;
}
void MAPIEx::Term()
{
MAPIUninitialize();
}
BOOL MAPIEx::Login()
{
return (MAPILogonEx(NULL,NULL,NULL,NULL,&m_pSession)==S_OK);
}
void MAPIEx::Logout()
{
//m_pSession->Logoff(0,0,0);
RELEASE(m_pContents);
RELEASE(m_pFolder);
RELEASE(m_pMsgStore);
RELEASE(m_pSession);
}
BOOL MAPIEx::OpenMessageStore()
{
if(!m_pSession) return FALSE;
LPSRowSet pRows=NULL;
const ULONG nProperties=2;
SizedSPropTagArray(nProperties,Columns)={nProperties,{PR_ENTRYID, PR_DISPLAY_NAME}};
BOOL bResult=FALSE;
IMAPITable* pMsgStoresTable;
if(m_pSession->GetMsgStoresTable(MAPI_UNICODE, &pMsgStoresTable)==S_OK)
{
if(pMsgStoresTable->SetColumns((LPSPropTagArray)&Columns, 0)==S_OK)
{
while(SUCCEEDED(pMsgStoresTable->QueryRows(1,0,&pRows)))
{
if(NULL==pRows||pRows->cRows!=1)
{
break;
}
if(_tcsicmp(pRows->aRow[0].lpProps[1].Value.lpszW,_T("SMS"))==0)
{
ULONG ulMessageType;
bResult =(m_pSession->OpenEntry(pRows->aRow[0].lpProps[0].Value.bin.cb,(LPENTRYID)pRows->aRow[0].lpProps[0].Value.bin.lpb,NULL, MAPI_BEST_ACCESS, &ulMessageType,(LPUNKNOWN*)&m_pMsgStore)==S_OK);
FreeProws(pRows);
break;
}
}
}
RELEASE(pMsgStoresTable);
}
return bResult;
}
LPMAPIFOLDER MAPIEx::OpenFolder(unsigned long ulFolderID,BOOL bInternal)
{
if(!m_pMsgStore) return NULL;
LPSPropValue props=NULL;
ULONG cValues=0;
DWORD dwObjType;
ULONG rgTags[]={ 1, ulFolderID };
LPMAPIFOLDER pFolder;
if(m_pMsgStore->GetProps((LPSPropTagArray) rgTags, MAPI_UNICODE, &cValues, &props)!=S_OK) return NULL;
hr =m_pMsgStore->OpenEntry(props[0].Value.bin.cb,(LPENTRYID)props[0].Value.bin.lpb, NULL, m_ulMDBFlags, &dwObjType,(LPUNKNOWN*)&pFolder);
MAPIFreeBuffer(props);
if(pFolder && bInternal) {
RELEASE(m_pFolder);
m_pFolder=pFolder;
}
return pFolder;
}
LPMAPIFOLDER MAPIEx::OpenSpecialFolder(unsigned long ulFolderID,BOOL bInternal)
{
LPMAPIFOLDER pInbox=OpenInbox(FALSE);
if(!pInbox || !m_pMsgStore) return FALSE;
LPSPropValue props=NULL;
ULONG cValues=0;
DWORD dwObjType;
ULONG rgTags[]={ 1, ulFolderID };
LPMAPIFOLDER pFolder;
if(pInbox->GetProps((LPSPropTagArray) rgTags, MAPI_UNICODE, &cValues, &props)!=S_OK) return NULL;
m_pMsgStore->OpenEntry(props[0].Value.bin.cb,(LPENTRYID)props[0].Value.bin.lpb, NULL, m_ulMDBFlags, &dwObjType,(LPUNKNOWN*)&pFolder);
MAPIFreeBuffer(props);
RELEASE(pInbox);
if(pFolder && bInternal) {
RELEASE(m_pFolder);
m_pFolder=pFolder;
}
return pFolder;
}
LPMAPIFOLDER MAPIEx::OpenInbox(BOOL bInternal)
{
if(!m_pMsgStore) return NULL;
return OpenFolder(PR_CE_IPM_INBOX_ENTRYID,bInternal);
}
LPMAPIFOLDER MAPIEx::OpenOutbox(BOOL bInternal)
{
return OpenFolder(PR_IPM_OUTBOX_ENTRYID,bInternal);
}
LPMAPIFOLDER MAPIEx::OpenSentItems(BOOL bInternal)
{
return OpenFolder(PR_IPM_SENTMAIL_ENTRYID,bInternal);
}
LPMAPIFOLDER MAPIEx::OpenDeletedItems(BOOL bInternal)
{
return OpenFolder(PR_IPM_WASTEBASKET_ENTRYID,bInternal);
}
LPMAPIFOLDER MAPIEx::OpenDrafts(BOOL bInternal)
{
return OpenSpecialFolder(PR_IPM_DRAFTS_ENTRYID,bInternal);
}
BOOL MAPIEx::GetContents(LPMAPIFOLDER pFolder)
{
if(!pFolder) {
pFolder=m_pFolder;
if(!pFolder) return FALSE;
}
RELEASE(m_pContents);
if(pFolder->GetContentsTable(MAPI_UNICODE,&m_pContents)!=S_OK) return FALSE;
const int nProperties=MESSAGE_COLS;
SizedSPropTagArray(nProperties,Columns)={nProperties,{PR_MESSAGE_FLAGS, PR_ENTRYID }};
return (m_pContents->SetColumns((LPSPropTagArray)&Columns,0)==S_OK);
}
int MAPIEx::GetRowCount()
{
ULONG ulCount;
if(!m_pContents || m_pContents->GetRowCount(0,&ulCount)!=S_OK) return -1;
return ulCount;
}
LPCTSTR MAPIEx::GetValidString(SPropValue& prop)
{
LPCTSTR s=prop.Value.LPSZ;
return s;
}
BOOL MAPIEx::GetNextMessage(SmsMessage& message,BOOL bUnreadOnly)
{
if(!m_pContents) return FALSE;
DWORD dwMessageFlags;
LPSRowSet pRows=NULL;
BOOL bResult=FALSE;
while(m_pContents->QueryRows(1,0,&pRows)==S_OK) {
if(pRows->cRows) {
dwMessageFlags=pRows->aRow[0].lpProps[PROP_MESSAGE_FLAGS].Value.ul;
if(bUnreadOnly && dwMessageFlags&MSGFLAG_READ) {
FreeProws(pRows);
continue;
}
bResult=message.Open(this,pRows->aRow[0].lpProps[PROP_ENTRYID].Value.bin,dwMessageFlags);
}
FreeProws(pRows);
break;
}
MAPIFreeBuffer(pRows);
return bResult;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -