我有一個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。然而,這創建了一個草稿郵件項目,我想避免。
我能做什麼的線索?