2016-04-28 5 views
1

Kurze Frage: wie Outlook-Elemente nach dem Verwenden ordnungsgemäß zu schließen?COMException, wenn zu viele Outlook-Dateien geöffnet wurden


-Code das Problem zu reproduzieren:

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 

Erläuterung:
Es ist möglich, Outlook-Elemente zu kopieren (MailItem, DocumentItem, PostItem, im Grunde jedes Element) in meine Bewerbung. Um dies zu erreichen, iteriere ich über die ausgewählten Elemente des aktiven Outlook-Fensters. Es funktioniert gut, aber wenn mehr als 250 (es kann auch eine andere Anzahl je nach Konfiguration) Elemente ausgewählt sind, ein COMExeption geworfen wird:

Eine nicht behandelte Ausnahme des Typs ‚System.Runtime.InteropServices.COMException‘ aufgetreten in Microsoft.VisualBasic.dll

Zusätzliche Informationen: Ihr Server-Administrator hat die Anzahl der Elemente begrenzt, die Sie gleichzeitig öffnen können. Versuchen Sie, Nachrichten zu schließen, die Sie geöffnet haben, oder entfernen Sie Anhänge und Bilder von nicht gesendeten Nachrichten, die Sie verfassen.

Ich habe versucht, die Elemente zu schließen, wenn ich sie nicht mehr brauche, aber es scheint nicht, dass es irgendetwas tut.


Andere Fragen zu den gleichen Fehler
Ich weiß über this andere Frage, die über den gleichen Fehler, aber ich bereits die Beratung der ersten beiden Antworten und die dritte, akzeptiert (und letzten) folgen Antwort passt nicht in meinen Kontext

+0

Haben Sie [diese Antwort] geprüft (http://stackoverflow.com/questions/36826927/outlook-add-in-crashes-or-your-server-administrator -hat-die-Anzahl-davon-begrenzt? Rq = 1)? Kurz gesagt, nach 'ReleaseComObject()', setze den Verweis auf olItem auf 'Nothing'. –

+0

@SuperPeanut Vielen Dank für die Antwort, aber das Hinzufügen von 'olItem = Nothing' nach' ReleaseComObject' hat nicht geholfen – Breeze

Antwort

0

Dank @Dmitry Streblechenko, der darauf hingewiesen, dass die Selection Sammlung Referenzen zu den Elementen enthält, fand ich eine Lösung. Es entfernt die Artikel aus Selection nach der Verarbeitung und erneuert die Sammlung bei jeder Ausnahme. Hier

ist der Code:

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

Ich bezweifle, dass es den Nutzern gefallen wird, wenn die Nachrichten abgewählt werden .... –

0

Es gibt nichts, was Sie tun können - die Selection-Sammlung selbst enthält Verweise auf die Elemente. Versuchen Sie, den Cache-Modus einzuschalten.

+0

danke für Ihre Antwort, es führte mich zu einer Lösung. Ich würde mich freuen, wenn du es dir ansehen könntest und mir erzählst, ob es etwas gibt, das ich übersehen habe – Breeze