Outlook 365 MAPI插件:共享约会修改后详情页不刷新求助
Outlook共享日历约会详情页未刷新问题(MAPI C++插件场景)
你遇到的问题确实是Outlook界面缓存未同步导致的:预览面板会直接读取MAPI属性的最新值,但约会详情窗口加载时复用了之前缓存的对象实例,没有重新从MAPI存储拉取更新后的属性。以下是无需重启Outlook即可解决的方法:
解决方法
1. 强制重新获取MAPI对象
在更新属性并调用SaveChanges后,不要保留原有的IMessage或AppointmentItem实例,而是通过条目ID重新获取对象,确保Outlook后续读取的是最新存储数据:
// 假设pMsg是已更新的IMessage指针 LPSPropValue pEntryID = nullptr; ULONG cValues = 0; HRESULT hr = pMsg->GetProps((LPSPropTagArray)&PR_ENTRYID, MAPI_UNICODE, &cValues, &pEntryID); if (SUCCEEDED(hr)) { IMessage* pNewMsg = nullptr; // 通过条目ID重新打开对象 hr = pFolder->OpenEntry(pEntryID->Value.bin.cb, (LPENTRYID)pEntryID->Value.bin.lpb, nullptr, 0, nullptr, (LPUNKNOWN*)&pNewMsg); if (SUCCEEDED(hr)) { pNewMsg->Release(); } MAPIFreeBuffer(pEntryID); } pMsg->Release();
2. 触发文件夹刷新通知
通过IMAPIFolder::Notify方法给共享日历文件夹发送变更通知,强制Outlook更新视图缓存:
// pFolder为共享日历的IMAPIFolder指针 ULONG ulNotifyFlags = fnevTableModified; HRESULT hr = pFolder->Notify(nullptr, ulNotifyFlags, nullptr, nullptr);
3. 更新元数据属性
Outlook依赖PR_LAST_MODIFICATION_TIME判断条目是否修改,确保更新属性时同步修改该时间戳:
SYSTEMTIME stNow; GetSystemTime(&stNow); FILETIME ftNow; SystemTimeToFileTime(&stNow, &ftNow); LPSPropValue pProp = nullptr; HRESULT hr = MAPIAllocateBuffer(sizeof(SPropValue), (LPVOID*)&pProp); if (SUCCEEDED(hr)) { pProp->ulPropTag = PR_LAST_MODIFICATION_TIME; pProp->Value.ft = ftNow; hr = pMsg->SetProps(1, &pProp, nullptr); MAPIFreeBuffer(pProp); if (SUCCEEDED(hr)) { pMsg->SaveChanges(KEEP_OPEN_READWRITE); } }
执行以上操作后,用户关闭并重新打开约会详情页即可看到最新内容;若详情页已打开,可先关闭窗口再重新打开,无需重启Outlook。
内容的提问来源于stack exchange,提问作者Mahesh Amarelia
相关产品推荐
相关产品推荐

