2016-08-24 41 views
0

我有一个Outlook COM加载项(C#,Visual Studio 2012),它扩展了带有附加消息属性的标准表单。该加载项可与Outlook 2010,2013和2016一起使用。函数PropertyAccessor.DeleteProperties在Outlook 2016中不起作用?

理想情况下,我会将这些属性放在表单区域中,但属性需要位于名称空间PS_INTERNET_HEADERS中,而这对于表单区域是不可行的。相反,我有一个自定义任务窗格,其中包含所有属性的控件。为了与Outlook流保持同步以保存消息,我仍然有一个表单区域,它是隐藏的,并在命名空间PS_PUBLIC_STRINGS中包含一个内部属性。只要我的自定义任务窗格中的某个属性发生更改,就会更改此内部属性的值。然后我监听MailItem.CustomPropertyChanged,当内部属性发生该事件时,我使用PropertyAccessor.SetProperties设置名称空间PS_INTERNET_HEADERS中的属性;如果一个属性是空的,我使用PropertyAccessor.DeleteProperties,因为具有空值或根本不存在的属性存在语义差异。除了所有这些,我听Application.ItemSend,在那里我检查有效值的所有属性;如果没有,发送被取消。

大部分时间都能正常工作。但问题是,在特定情况下,Outlook 2016会失败。该场景是:

  • 创建一条消息,填写接收者,主题,正文并将其中一个PS_INTERNET_HEADERS属性控件设置为无效值。
  • 尝试发送;发送通过Application.ItemSend被取消,因为一个属性的值是无效的。
  • 删除无效值并发送消息。

现在发送的项目仍然错误地具有无效值,它不应该在那里,因为我调用PropertyAccessor.DeleteProperties。对于调试,在Application.ItemSend处理程序中,我调用PropertyAccessor.GetProperties,并且该属性实际上已经消失!如果不是删除属性,我将属性设置为一个空字符串,它可以工作 - 但正如我所说,这还不够。如果发送在Application.ItemSend处理程序中至少取消一次,我只能引发此错误。

我的解决方法是在对PropertyAccessor.SetProperties和PropertyAccessor.DeleteProperties的所有调用之后调用MailItem.Save。然而,这创建了一个草稿邮件项目,我想避免。

我能做什么的线索?

回答

0

这解决了这个问题(留出了代码以释放COM对象rdoMail):

private static void DeleteHeader(Redemption.RDOSession rdoSession, Outlook.MailItem mailItem, string name) 
    { 
     const int MapiPropertyTypeUnicodeString = 31; 
     var rdoMail = (Redemption.RDOMail)rdoSession.GetRDOObjectFromOutlookObject(mailItem); 
     var tag = rdoMail.GetIDsFromNames("{00020386-0000-0000-C000-000000000046}", name) | MapiPropertyTypeUnicodeString; 
     rdoMail.Fields[tag] = null; 
    } 
相关问题