2016-08-24 19 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プロパティコントロールの1つを無効な値に設定します。
  • 送信してください。プロパティは無効な値を持つため、送信はApplication.ItemSend経由で取り消されます。
  • 無効な値を削除し、メッセージを送信します。

私はPropertyAccessor.DeletePropertiesを呼び出して以来、送信されたアイテムは依然として誤って無効な値を持っています。デバッグのためには、Application.ItemSendハンドラでPropertyAccessor.GetPropertiesを呼び出し、そのプロパティは実際にはなくなりました!プロパティを削除する代わりに、プロパティを空の文字列に設定すると機能しますが、それだけでは十分ではありません。このエラーは、SendがApplication.ItemSendハンドラで少なくとも1回キャンセルされた場合にのみ発生します。

私の回避策は、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; 
    } 
関連する問題