Discussion 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


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:12
    Besitzer
     
     

    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  Twitter Facebook
    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:21
    Besitzer
     
     
    ****************************************************************************************************************
    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  Twitter Facebook
    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.