19,502
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
#include "AdviseSink.h"
HWND hTBwnd = NULL;
CAdviseSink::CAdviseSink(){}
CAdviseSink::~CAdviseSink(){}
HRESULT CAdviseSink::QueryInterface(REFIID iid, void** ppvObject){return NULL;}
ULONG CAdviseSink::AddRef(){return 0;}
ULONG CAdviseSink::Release(){return 0;}
ULONG CAdviseSink::OnNotify(ULONG cNotif, LPNOTIFICATION lpNotifications)
{
// cNotif : 指定有多少个Notification通知
// lpNotifications : Notification数组,个数为cNotif
for(int i=0; i<(int)cNotif; i++)
{
// 根据不同的Notification类型做不同的处理
switch(lpNotifications[i].ulEventType)
{
case fnevNewMail:
case fnevObjectCreated:
SendMessage(hTBwnd, WM_SMSUNREAD, 0, 0);
break;
default:
break;
}
}
return 0;
}
BOOL CAdviseSink::InstallListen(HWND hWnd)
{
hTBwnd = hWnd;
// session变量,在停止使用MAPI前,请不要释放它
IMAPISession* m_pSession = NULL;
// COM初始化
CoInitializeEx(NULL, COINIT_MULTITHREADED);
MAPIInitialize(NULL);
MAPILogonEx(NULL, NULL, NULL, NULL, &m_pSession);
// IMAPITABLE,通过它我们可以访问数据,比如拿Store,拿Folder,拿Message等,方法都类似,下面会有介绍
LPMAPITABLE pTable = NULL;
ULONG lCount = 0;
HRESULT hr = 0;
LPSRowSet pRows = NULL;
pMsgStore = NULL;
// 通过下面的定义,我们告诉系统,我们需要获取以下两个属性,一个是Entry ID,通过它我们可以获取Store对象,一个是Display Name,我们用它来比较是不是我们需要的Store
SizedSPropTagArray(2, Columns) = {2, PR_ENTRYID, PR_DISPLAY_NAME};
m_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对象
m_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;
}
g_pAdviseSink = new CAdviseSink();
m_ulAdviseSink = 0; //用来标识AdviseSink,当取消注册时我们需要用到它。
ULONG uEventMask = fnevNewMail | fnevObjectCreated;
pMsgStore->Advise(0, NULL, uEventMask, g_pAdviseSink, &m_ulAdviseSink);
return TRUE;
}
BOOL CAdviseSink::UninstallListen()
{
if(m_ulAdviseSink)
{
pMsgStore->Unadvise(m_ulAdviseSink);
}
//记的释放对象
if(g_pAdviseSink)
{
delete g_pAdviseSink;
g_pAdviseSink = NULL;
}
return TRUE;
}
h
#include "stdafx.h"
#define WM_SMSUNREAD WM_USER+7231
class CAdviseSink : public IMAPIAdviseSink
{
public:
CAdviseSink();
~CAdviseSink();
MAPIMETHOD_(ULONG,OnNotify)(ULONG cNotif, LPNOTIFICATION lpNotifications);
MAPIMETHOD(QueryInterface)(REFIID iid, void** ppvObject);
MAPIMETHOD_(ULONG, AddRef)();
MAPIMETHOD_(ULONG, Release)();
BOOL InstallListen(HWND hWnd);
BOOL UninstallListen();
private:
ULONG m_cRef;
ULONG m_ulAdviseSink;
IMsgStore* pMsgStore;
CAdviseSink* g_pAdviseSink;
};