最近碰到某个WM手机无法MAPI程序发短信的问题,短信一直留在发件箱里面无法发送,但系统的程序的确是可以的,分析了一下,可能是MAPI调用的问题,但无论怎么改设置过的字段和内容都无法解决。想了一下,打算模拟系统发短信的过程,既然是模拟首先得知道系统是怎么发,发了什么内容。所以第一步,得做一个MAPI监控对象:
监控一下短信:
void CXXXX::RegSMSSink()
{
HRESULT hr = S_OK;
//CdingStar: 把想得到的字段都加上,看系统是怎么变的:
ULONG uEventMask = fnevNewMail | fnevObjectCreated | fnevObjectDeleted |fnevObjectMoved |
fnevObjectModified | fnevObjectCopied | fnevTableModified | fnevStatusObjectModified | fnevReservedForMapi | fnevExtended | fnevCriticalError ;
//CdingStar: 这里新建一个短信对象 class CSMSAdviseSink : public IMAPIAdviseSink{...}
m_pSink = new CSMSAdviseSink();
//SMS Store
ASSERT(m_pMsgStore);
if(m_pMsgStore && m_pSink)
{
m_pSink->SetMsgStore(m_pMsgStore);
hr = m_pMsgStore->Advise(0, NULL, uEventMask, m_pSink, &m_ulAdviseSink); //注册接口
}
}
重载SMS SINK消息接收通知:
MAPIMETHOD_(ULONG,OnNotify)(ULONG cNotif, LPNOTIFICATION lpNotifications);
ULONG CSMSAdviseSink::OnNotify(ULONG cNotif, LPNOTIFICATION lpNotifications)
{
for(int i = 0; i < (int)cNotif; ++i)
{
//Message变化的类型,如新建短信,删除短信,修改
switch(lpNotifications[i].ulEventType)
{
case fnevObjectCreated:
//不知何故pNotify->lpEntryID的EntryID居然和pMessage里面query到的EntryID不一样
break;
case fnevObjectDeleted:
break;
case fnevObjectMoved:
break;
case fnevObjectModified:
//CdingStar:修改的变化主要就这里,得查看系统发送时候修改了什么
//lpNotifications[i].info.obj.lpPropTagArray是发生改变的属性值列表
//后面的等下再加,貌似调试发现2个过程结果差异很大啊