Hallo zusammen,
mein Programm verabschiedet sich mit der Meldung "RPC_E_SYS_CALL_FAILED", wenn es zu lange läuft.
Das Problem ist: Diese lange Laufzeit ist normal. Die Software öffnet Word und fügt aus verschiedenen Wordvorlagen den Inhalt in ein "Hauptdokument" ein.
Kurz zum Ablauf: Ein Benutzer wählt in der Programmoberfläche aus, welche Daten das Dokument beinhalten soll. Es gibt aktuell 121 Einträge.
Wähle ich so 60-70 aus, klappt das auch noch einwandfrei, bei allen ist die Laufzeit sehr lang und nach ca. 3 Minuten stürzt das Programm mit der angegebenen Meldung ab.
Ich habe jetzt nachgelesen, dass es daran liegt, dass die COM-Objekte geschlossen werden, weil sie auf eine Antwort warten, aber eigentlich wird das Hauptdokument permanent beschrieben, also sollte die Verbindung ja offen bleiben. Die Vorlagen werden immer nur temporär geöffnet mit folgendem Code:
Kurz zur Beschreibung des Codeschnipsels: Vorher wird natürlich Word schon gestartet und das Hauptdokument erstellt, für jede Datei, aus der kopiert werden soll, wird eine neue Instanz von word gestartet und auch wieder geschlossen.
Ich bin kein VB-Profi, deshalb stehe ich ein bisschen ratlos da...
mein Programm verabschiedet sich mit der Meldung "RPC_E_SYS_CALL_FAILED", wenn es zu lange läuft.
Das Problem ist: Diese lange Laufzeit ist normal. Die Software öffnet Word und fügt aus verschiedenen Wordvorlagen den Inhalt in ein "Hauptdokument" ein.
Kurz zum Ablauf: Ein Benutzer wählt in der Programmoberfläche aus, welche Daten das Dokument beinhalten soll. Es gibt aktuell 121 Einträge.
Wähle ich so 60-70 aus, klappt das auch noch einwandfrei, bei allen ist die Laufzeit sehr lang und nach ca. 3 Minuten stürzt das Programm mit der angegebenen Meldung ab.
Ich habe jetzt nachgelesen, dass es daran liegt, dass die COM-Objekte geschlossen werden, weil sie auf eine Antwort warten, aber eigentlich wird das Hauptdokument permanent beschrieben, also sollte die Verbindung ja offen bleiben. Die Vorlagen werden immer nur temporär geöffnet mit folgendem Code:
Quellcode
- For i = 0 To (Modul_Global.analysen.Rows.Count - 1) Step 1
- AddProgressbarStep()
- Label2.Text = "Verarbeite: " & Modul_Global.analysen.Rows(i)("Dateiname")
- Dim wordtemp As New Microsoft.Office.Interop.Word.Application
- Dim doctemp As Microsoft.Office.Interop.Word.Document
- doctemp = wordtemp.Documents.Open(filepath & Modul_Global.analysen.Rows(i)("Dateiname"))
- doctemp.Activate()
- doctemp.Range.WholeStory()
- doctemp.Range.Copy()
- doc_gesamt.Activate()
- word.Selection.EndKey(Unit:=Microsoft.Office.Interop.Word.WdUnits.wdStory)
- word.Selection.WholeStory()
- word.Selection.NoProofing = True
- word.Selection.EndKey(Unit:=Microsoft.Office.Interop.Word.WdUnits.wdStory)
- word.Selection.PasteAndFormat(wordoptions.WdRecoveryType.wdFormatOriginalFormatting)
- If i < (Modul_Global.analysen.Rows.Count - 1) Then
- word.Selection.InsertBreak(Type:=Microsoft.Office.Interop.Word.WdBreakType.wdPageBreak)
- word.Selection.EndKey(Unit:=Microsoft.Office.Interop.Word.WdUnits.wdStory)
- Else
- word.Selection.GoTo(What:=wordoptions.WdGoToItem.wdGoToPage, Which:=1)
- End If
- doctemp.Close(False)
- wordtemp.Quit()
- System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doctemp)
- Next
Kurz zur Beschreibung des Codeschnipsels: Vorher wird natürlich Word schon gestartet und das Hauptdokument erstellt, für jede Datei, aus der kopiert werden soll, wird eine neue Instanz von word gestartet und auch wieder geschlossen.
Ich bin kein VB-Profi, deshalb stehe ich ein bisschen ratlos da...