2016-04-28 8 views
1

短い質問: Outlookのアイテムを使用した後に正しく閉じる方法?あまりにも多くのOutlookファイルが開かれたときにCOMExceptionが発生する


問題を再現するコード

Dim olApp As New Microsoft.Office.Interop.Outlook.Application 
Dim olSelection As Microsoft.Office.Interop.Outlook.Selection = olApp.ActiveExplorer.Selection 

For i As Integer = 1 To olSelection.Count 'Outlook starts counting at 1 
    Dim olItem As Object = olSelection(i) 
    Dim sSubject As String = olItem.Subject 
    olItem.Close(Microsoft.Office.Interop.Outlook.OlInspectorClose.olDiscard) 
    Runtime.InteropServices.Marshal.ReleaseComObject(olItem) 
Next 

説明:
Outlookアイテムをコピーすることが可能である(基本的にMailItemDocumentItemPostItem、任意の項目)へ私のアプリケーション。これを達成するために、アクティブなOutlookウィンドウの選択された項目について繰り返します。 それは正常に動作しますが、250以上のアイテムが選択され、COMExeptionがスローされた(別の番号構成に応じてあるかもしれない)とき:型「System.Runtime.InteropServices.COMException」が

未処理の例外Microsoft.VisualBasic.dllで発生しました

追加情報:サーバー管理者は、同時に開くことのできるアイテムの数を制限しています。開いているメッセージを閉じるか、作成中の未送信メッセージから添付ファイルと画像を削除してみてください。

私はそれらをもう必要としないときにアイテムを閉じようとしましたが、何もしないようです。同じエラーに関する


その他の質問
私は同じエラーについては約this他の質問を知っているが、私はすでに最初の2つの答えの助言及び第三、受理(そして最後の)に従います答えが私の文脈に収まらない

+0

あなたは[この回答](http://stackoverflow.com/questions/36826927/outlook-add-in-crashes-or-your-server-administratorを確認しました-has-limited-the-number-it?rq = 1)?つまり、 'ReleaseComObject()'の後に、olItemへの参照を 'Nothing'に設定します。 –

+0

@ SuperPeanut返信ありがとうございますが、 'ReleaseComObject'の後に' olItem = Nothing'を追加すると助けにならなかった – Breeze

答えて

0

Selectionコレクションにアイテムへの参照が含まれていると指摘した@Dmitry Streblechenkoのおかげで、解決策が見つかりました。処理後にSelectionからアイテムを削除し、例外が発生するたびにコレクションを更新します。ここで

はコードです:

Dim olApp As New Microsoft.Office.Interop.Outlook.Application 
Dim olExplorer As Microsoft.Office.Interop.Outlook.Explorer = olApp.ActiveExplorer 
Dim olSelection As Microsoft.Office.Interop.Outlook.Selection = olExplorer.Selection 

Dim items as New List(Of Object) 

While True 
    Try 
     For i As Integer = 1 To olSelection.Count 
      Dim olItem As Object = olSelection(i) 
      Dim sSubject As String = olItem.Subject 
      olItem.Close(Microsoft.Office.Interop.Outlook.OlInspectorClose.olDiscard) 
      olExplorer.RemoveFromSelection(olItem) 
      Runtime.InteropServices.Marshal.ReleaseComObject(olItem) 
     Next 
     Exit While 
    Catch ex As Exception 
     Runtime.InteropServices.Marshal.ReleaseComObject(olSelection) 
     olSelection = olExplorer.Selection 
    End Try 
End While 
+1

メッセージが選択解除されたときにユーザーがそれを好きになるのではないかと疑っています.... –

0

あなたができることは何もありません。選択コレクション自体はアイテムへの参照を保持しています。キャッシュモードを有効にしてください。

+0

あなたの答えをありがとう、それは私に解決策をもたらしました。あなたがそれを見て、私が見落としたものがあるかどうかを教えてもらえれば嬉しいです – Breeze

関連する問題