对MailItem重复进行保存操作会导致异常-可能是由于内联回复功能

时间:2018-08-07 11:56:03

标签: vb.net outlook vsto outlook-addin

我正在使用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

1 个答案:

答案 0 :(得分:0)

错误是MAPI_E_OBJECT_CHANGED,这意味着在您打开该项目并调用保存之间对其进行了修改。

根据经验,尝试避免打开消息-如果需要进行更改,请打开(例如,使用Namespace.GetItemfromID),进行更改,保存,然后释放对该项目的引用。

在特定情况下,请设置属性,但不要保存该项目-如果正在显示该项目,则决定是否需要保存该项目是用户的特权。