Fehler bei Öffnen eines Worddokumentes
-
Montag, 23. April 2012 14:41
Hallo,
ich habe folgendes Problem mit meinem in VB2008 geschriebenen Programm: ein externes Programm speichert in einer Datenbank Worddokumente (Word2003, Windows7) als binäre Dateien, eine Prozedur meines Programms prüft alle 10 Minuten, ob neue Worddokumente gespeichert wurden und druckt sie dann aus. Hier ein Ausschnitt aus dem Code:
....
‘ Datei aus der Datenbank auslesen
M_SQLStr = "SELECT DBI_DATA FROM TestTablle WHERE Test_ID = xxx "
M_command = New OleDbCommand(M_SQLStr, Conn)
M_reader = M_command.ExecuteReader()
While M_reader.Read()
TmpFile = IO.Path.GetTempFileName + ".doc"
' Binäredatei in ein Stream einlesen
Stream = New IO.MemoryStream
BinDate = CType(M_reader("DBI_DATA"), Byte())
Stream.Write(BinDate, 0, BinDate.Length)
NewFile = New IO.FileStream(TmpFile, FileMode.OpenOrCreate)
Stream.WriteTo(NewFile)
Stream.Close()
NewFile.Close()
‘ prüfen ob Word läuft
ProzID = ProzessID("WINWORD")
If ProzID = 0 Then
P_V_WordApp = CreateObject("Word.Application")
ElseIf ProzID > 0 Then
P_V_WordApp = GetObject(Class:="Word.Application")
End If
‘ Worddokument öffnen, druckenm schließen und wieder löschen
P_V_WordApp.Documents.Open(TmpFile)
P_V_WordApp.Documents.Item(TmpFile).PrintOut(Copies:=1)
P_V_WordApp.Documents.Item(TmpFile).Close
(Word.WdSaveOptions.wdDoNotSaveChanges)
FileInfo = New IO.FileInfo(TmpFile)
FileInfo.Delete()
End While
…..
Zunächst lief alles gut! Nach mehreren Monaten, nachdem Tausende von Dokumenten fehlerfrei ausgedruckt wurden, tritt jetzt ein Fehler bei Öffnen der Datei im Word auf: “Unzureichender Arbeitsspeicher, Speichern Sie jetzt Ihr Dokument!“, wobei die Meldung manchmal nur bei einem der gefundenen Dokumente, manchmal bei allen, manchmal aber bei keinem Dokument angezeigt wird. Öffne ich danach Word, dann sehen ich in einer Spalte mit der Beschriftung „Dokumentwiederherstellung“ eine Liste all dieser Dokumenten, die nicht geöffnet werden konnten. Starte ich das Programm an einem anderen Rechner, dann läuft alles wieder wie gehabt. Ich habe schon den Arbeitsspeicher vergrößert, es hat aber nichts gebracht.
Hätte vielleicht jemand einen Tipp für mich?!
Gruß
Christoph
- Bearbeitet Christoph Michalski Montag, 23. April 2012 14:43
- Typ geändert Robert BreitenhoferMicrosoft Contingent Staff, Moderator Freitag, 3. August 2012 13:21 Keine Rückmeldung des Fragenstellender
Alle Antworten
-
Montag, 23. April 2012 16:34
Hallo Christoph,
das ist ja scheinbar nur ein Teil des Codes, da ist es schwierig zu sagen, woran es liegt.
Hast Du mal (über Taskmanager) kontrolliert, ob Word den auch immer richtig beendet (fehlt in Deinem Snippet) wird? In alten VBA/VB6 war es so, das man auch mit GetObject immer eine neue Instanz erhalten hatte, auch wenn wie hier Word bereits läuft.
Also nicht, das bereits Word ein paar Hundert mal läuft.Falls es nicht im weiteren Teil Deines Codes erfolgt, solltest Du auch immer Dispose für Klassen aufrufen, die Resourcen halten, wie File und Stream.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing -
Dienstag, 24. April 2012 13:22
Hallo Olf,
vielen Danke für Deine Antwort. WORD wird zur Ende der Prozedur immer mit Quit geschlossen:
P_V_WordApp.Quit()
und ich beende auch den Prozeß im Taskmanager:
For Each oProcess As Process In Process.GetProcesses If oProcess.ProcessName = "WINWORD" Then oProcess.Kill() End If Next
Die Klassen File und Stream beende ich jetzt mit Dispose.
Leider hat es nichts gebracht. Ich habe es heute etwas genauer beobachtet. Der Fehler trifft immer beim Öffnen der gestreamten Datei im WORD auf. Komischerweise läuft alles wieder normal, wenn ich mich an gleichem Rechner über einen anderen Usernamen anmelde. Es ist, als ob da mit der Zeit irgendetwas den Arbeitsspeicher oder irgendeinen Ordner des Users zumüllt, aber was und wo?
Gruß
Christoph
-
Mittwoch, 25. April 2012 05:48
WORD wird zur Ende der Prozedur immer mit Quit geschlossen:
P_V_WordApp.Quit()
und ich beende auch den Prozeß im Taskmanager:
For Each oProcess As Process In Process.GetProcesses
Hallo Christoph,
das beantwortet die Frage nicht; hast Du im Taskmanager kontrolliert, ob das noch Word Prozesse laufen? Nur weil Du Quit & Kill ausführst, heisst das noch lange nicht, das die Prozesse auch wirklich beendet werden.
Hast Du auch mal kontrolliert, wie viel Speicher Deine Applikation im laufe der Zeit benötigt? Es kommt nicht selten vor, das durch fehlerhafte Programmierung die Garbage Collection die entfernten Objekte abräumen kann, weil z.B. noch weitere Verweise vorhanden sind. Gerade wenn man mit COM Objekten arbeitet, kann das vorkommen.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing -
Mittwoch, 25. April 2012 07:44
Guten Morgen Olaf,
1. ich habe es mehrfach geprüft: nach der Beendigung der Przedur ist WORD weder unter Anwendungen noch unter Prozessen in dem Task-Mangager zu sehen. Also das Schließen von WORD scheint nicht das Problem zu sein.
2. Meine Applikation belegt tatsächlich sehr viel Arbeitsspeicher: 80.000 bis 100.000 K. Aber kann das die Ursache sein, wo das Problem am gleichen Rechner mal auftritt, mal nicht, je nach dem mit welchem Windowsuser-Namen man sich angemledet hat. Ich habe tatsächlich im Standardordner "TEMP", in den die Dokumente aus der Datenbank gestreamt werden, die Dateien gefunden, die nicht geöffnet werden konnten und dazu eine Menge leerer Temp-Dateien. Aber auch nachdem ich alles gelöscht habe, tritt der Fehler wieder aus.
Gruß
Christoph
-
Montag, 30. April 2012 08:49
Hallo Olaf,
ich habe jetzt versucht das Problem direkt auf dem Windows7-Rechner nachzuvollziehen, wo mein Programm auch normalerweise läuft. WORD wird über folgende Prozedur iniziert:
Try
ProzID = ProzessID("WINWORD")
If ProzID = 0 Then
P_V_WordApp = Nothing
P_V_WordApp = CreateObject("Word.Application")
ElseIf ProzID > 0 And P_V_WordApp Is Nothing Then
P_V_WordApp = GetObject(Class:="Word.Application")
End If
Catch ex As Exception
Call FehlerMeld(2067899101, " " & ex.Message)
End Try
Beim Debuggen wurde mir einmal bei "CreateObject("Word.Application")" folgende Information angezeigt:
"Reentrancy wurde erkannt.
Message: Es wurde versucht, einen Aufruf in den verwalteten Code durchzuführen, ohne dass zunächst ein Übergang erfolgt ist. Versuchen Sie nicht, verwalteten Code innerhalb von systemeigenen Erweiterungspunkten auf niedriger Ebene auszuführen, z.B. im vektoriellen Ausnahmehandler, da dies Datenbeschädigung und -verlust zur Folge haben kann."
Im Internet habe ich im Zusammenhang mit dem Begriff "Reentrancy" nur das gefunden:
"Einige MDAs werden auf 64-Bit-Plattformen nicht unterstützt. Beispiele: Reentrancy, LoaderLock, PInvokeStackImbalance"
Ich verstehe zwar den Zusammenhang nicht, aber das könnte der Hinweis auf die Ursache des Problems sein, weil dieses nur auf den 64-bit-Rechnern mit Windows7 auftritt! Sag dir das vielleicht was???
Gruß Christoph
-
Dienstag, 8. Mai 2012 20:42
> Zunächst lief alles gut! Nach mehreren Monaten,
> nachdem Tausende von Dokumenten fehlerfrei ausgedruckt wurden,
> tritt jetzt ein Fehler bei Öffnen der Datei im Word auf:
> “Unzureichender Arbeitsspeicher, Speichern Sie jetzt Ihr Dokument!“Was mich ein bisschen stutzig macht ist das es ja mehrere Monate und Tausende von Dokumenten funktionierte.
Dein Programm scheint also zu funktionieren. (Ob der Fehler nach Runterfahren wieder auftritt hast du wohl eh als
eines der ersten Dinge überprüft.)Vielleicht liegt die Fehlermeldung nicht in deinem Programm begründet sondern an etwas anderem.
-
Dienstag, 15. Mai 2012 08:12Besitzer
Beim Debuggen wurde mir einmal bei "CreateObject("Word.Application")" folgende Information angezeigt:
"Reentrancy wurde erkannt. Message: Es wurde versucht, einen Aufruf in den verwalteten Code durchzuführen, ohne dass zunächst ein Übergang erfolgt ist. Versuchen Sie nicht, verwalteten Code innerhalb von systemeigenen Erweiterungspunkten auf niedriger Ebene auszuführen, z.B. im vektoriellen Ausnahmehandler, da dies Datenbeschädigung und -verlust zur Folge haben kann."
Hallo Christoph Michalski,
Dieselbe Fehlermeldung aber mit Excel wurde noch hier diskutiert:
Reentranct was detected, but only of first try.
“Reentrancy was detected: Attempting to call into managed code without transitioning out first. Do not attempt to run managed code inside low-level native extensibility points, such as the vectored exception handler, since doing so can cause corruption and data loss.”
Grüße,
Robert
Robert Breitenhofer, MICROSOFT

Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
Freitag, 3. August 2012 13:21Besitzer****************************************************************************************************************
Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
****************************************************************************************************************Robert Breitenhofer, MICROSOFT

Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

