Outlook 2007アドイン-BeforeItemMoveイベントの使用に関する問題
-
03-07-2019 - |
質問
Outlook 2007アドインを書いています。私がしていることは:
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Outlook.Folder root;
//creates Spam folder if it dosen't exist
if (!SpamFolderExist())
{
CreateSpamFolder();
}
root = (Outlook.Folder)this.Application.Session.DefaultStore.GetRootFolder();
//set BeforeItemMove event for spam and inbox folders
spamFolder = (Outlook.Folder)root.Folders["Spam"];
inboxFolder = (Outlook.Folder)this.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
spamFolder.BeforeItemMove += new Microsoft.Office.Interop.Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler(BeforeItemMoveFromSpam);
inboxFolder.BeforeItemMove += new Microsoft.Office.Interop.Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler(BeforeItemMoveFromInbox);
//set new mail event
this.Application.NewMail += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_NewMailEventHandler(OnNewMail);
}
問題は、BeforeItemMoveFromInboxメソッドとBeforeItemMoveFromSpamメソッドに何も書いていない場合でも、アプリケーションの動作がおかしいことです。いくつかのメールを移動した後、特定のメールに対してそれ以上の移動アクションは実行されません。メールがブロックされているようで、移動できません。他の移動アクションを実行すると、他のメールがブロックされ、以前にブロックされていたメールを移動できます。これは、メールがブロックされた後、常に少なくとも1つのメールを移動できないという考え方です。言い換えると、移動アクションの一部がランダムに失敗します。フォルダー間でメールを移動する以外に何もしておらず、エラーメッセージが表示されないことを言わなければなりません。また、メソッドの最後でBeforeItemMoveイベントハンドラーのキャンセルパラメーターをfalseに設定しようとしましたが、同じ動作になりました。
解決
76melが手に入りました。私は同じ問題を抱えていました(フォルダーをBeforeItemMoveイベントにフックするだけで、そのフォルダーからメッセージを移動したときに、新しいフォルダーから別のフォルダーに少しの間移動できませんでした) 。
Marshal.ReleaseComObject()をイベントハンドラの最後に追加すると、完全に修正されました。
他のヒント
上記の問題の説明を理解したら、
アイテムを受信トレイからスパムフォルダーに移動するとイベントが発生しますが、同じアイテムを元に戻すと機能しません。 ?移動元のallsフォルダーのイベントをフックする必要があるため。
発生している可能性があるのは、イベントハンドラーでオブジェクトを解放する必要がある場合があることです Marshal.ReleaseComObject()