我正在使用VSTO开发Outlook 2013加载项。
如果功能区ID是Mail.Read或Mail.Compose,功能区将显示一个执行此操作的按钮:
Public Sub waitClick(control As Office.IRibbonControl)
Dim insp As Inspector = control.Context
insp.Activate() '// doesnt change anything for the better
Dim currentMail As MailItem = insp.CurrentItem
currentMail.UserProperties("Status").Value = "WAITING"
currentMail.Save()
End Sub
和另一个将状态设置为“完成”的按钮。
现在,当我不止一次触发这些按钮中的任何一个时,它们在保存方法上均失败,并引发以下异常:
"System.Runtime.InteropServices.COMException" in outlook-add-in-dummy.dll
"System.Reflection.TargetInvocationException" in mscorlib.dll
,并显示消息:“无法保存,因为该项目已更改”。
如果我随后尝试关闭显示邮件的窗口,则会收到有关未保存的更改的警告,但是尝试保存它们会产生错误,因为邮件已被“另一个用户或窗口”更改。
MailItem.Save方法上的文档指出
如果邮件是嵌入式回复,则在该邮件上调用“保存”可能会 失败并导致意外行为。
因此,我认为问题可能出在Outlook的默认情况下,其外观似乎是右侧的检查器窗口(尽管在Application对象上的Inspector-collection循环始终仅显示一个检查器),并且该检查器以某种方式干扰了/处于内联回复模式。
我绝对不知道该怎么办。我非常感谢任何想法。
///我描述的整个行为都是可重现的,而不是由于与Outlook的大量随机交互
//这是一个无引用的变体,它产生相同的错误:
(很奇怪的是,它现在让我在产生此错误之前最多将状态字段切换三到四次-因此我感到这是某种不受欢迎的缓存机制。)
Dim mailID As String = addIn.Application.ActiveInspector.CurrentItem.EntryID
addIn.Application.GetNamespace("MAPI").GetItemFromID(mailID).UserProperties("Status").Value = "WAIT"
Try
addIn.Application.GetNamespace("MAPI").GetItemFromID(mailID).Save()
Catch ex As System.Runtime.InteropServices.ComException
End Try
答案 0 :(得分:0)
错误是MAPI_E_OBJECT_CHANGED,这意味着在您打开该项目并调用保存之间对其进行了修改。
根据经验,尝试避免打开消息-如果需要进行更改,请打开(例如,使用Namespace.GetItemfromID),进行更改,保存,然后释放对该项目的引用。
在特定情况下,请设置属性,但不要保存该项目-如果正在显示该项目,则决定是否需要保存该项目是用户的特权。