Crash mit Word.au3

  • Der Teil des Codes ist eigentlich eine Altlast.
    Um bei deinem Beispiel zu bleiben:
    Der Benutzer hatte 2 Word-Dokumente offen und drückt meinen Hotkey.
    Nun öffnete sich das Word-Dokument, AutoIt bekam aber keine Zuordnung der Instanz hin - es war keine Bearbeitung über Word.au3 möglich.
    Im Task Manager ist bei dem Fehler aufgefallen, dass es zwar 3 Word-Dokumente aber bspw 5 Prozesse Winword.exe gab.
    Daher dann das beenden der Prozesse.

    Soweit ich weiß, war der Teil aber schon lang nicht mehr notwendig.
    Aber meine Überlegung: Könnte der Absturz entstanden sein, weil

    [autoit]

    $hand = _WordCreate(@MyDocumentsDir & "\sdb_zahlung.doc")

    [/autoit]

    kein Word-Dokument erstellen konnte, oder nicht schnell genug?, und meine "Altlast" dann versucht hat, die nicht vorhandenen Winword-Prozesse mit einer leeren Variable $hand als Refenz zu beenden?

  • Mit 3.3.10.2 wurde die Word UDF ersetzt und erweitert. Sie kann nun problemlos mit mehreren Instanzen umgehen.

  • Ach ich seh gerade, du bist doch der Autor des aktuellen Word.au3 :D
    Dann kannst du mir sicher verraten, was ich als Ersatz für die alte Funktion

    [autoit]

    _WordDocPropertyGet

    [/autoit]

    nehmen soll?
    Hab damit die Anzahl der Seiten des Dokuments gezählt, um in bestimmten Fällen noch die Kopfzeile des Dokuments zu bearbeiten.

    Einmal editiert, zuletzt von SmilingStar (12. Februar 2014 um 19:21)

  • [autoit]

    $oDoc.BuiltInDocumentProperties($wdPropertyWords).Value

    [/autoit]

    $wdPropertyWords etc. findest Du hier .

  • P.S. Im Wiki gibt es eine Seite, die die Unterschiede zwischen alter und neuer Word UDF im Detail beschreibt.

  • Ich grab das hier mal wieder aus, da ich jetzt wieder etwas mehr Zeit dafür hatte.

    Nach dem dezenten Hinweis, dass mein AutoIt in ein Museum gehört :whistling:, hab ich mich doch mal für einen Wechsel auf die aktuelle 3.3.10.2 entschieden.
    Es hat mich nun nicht wirklich überrascht, dass das Script nicht sofort funktioniert.

    [autoit]

    Func _bestp()
    Local $sdbvar, $hand, $name, $datearray[1], $var2 = 1, $araten, $oDoc
    If WinExists("SDB") Then
    $sdbksvar = 1
    $WordDoc = _Word_Create()
    $hand = _WordCreate(@MyDocumentsDir & "\sdb_zahlung.doc")
    $name = "sdb_zahlung"
    Else
    $WordDoc = _Word_Create()
    $hand = _WordCreate(@MyDocumentsDir & "\Zahlung.doc")
    $name = "zahlung"
    EndIf
    WinWait($name)

    [/autoit][autoit][/autoit][autoit]

    If Not @error Then
    $oDoc = _Word_DocGet($hand, 0)
    Sleep(300)
    _Word_DocFindReplace($oDoc, "xx Euro zum TT. Monat JJJJ", $araten & " Euro zum " & $datearray[1])
    Sleep(100)
    ;[....] Script gekürzt

    [/autoit]

    Ich hab nun das Problem, dass die Funktion _Word_DocFindReplace nicht mehr funktioniert - keine der gewünschten Ersetzungen vornimmt.
    Soweit ich der Dokumentation hier folgen kann, hat sich aber nur die Schreibweise geändert - genauso wie für das frühere _WordDocGetCollection.
    Was hab ich übersehen? :huh:

  • Du kannst die alte UDF (_WordCreate) und die neue (_Word_Create) nicht mischen. Entweder oder.
    Mit AutoIt 3.3.10.2 solltest Du nur die neue UDF verwenden (denn nur die wird mit AutoIt ausgeliefert).

  • Ein mischen hatte ich auch nicht beabsichtigt, nur den falschen Code kopiert.

    [autoit]

    Func _bestp()
    Local $sdbvar, $hand, $name, $datearray[1], $var2 = 1, $araten, $oDoc
    If WinExists("SDB") Then
    $sdbksvar = 1
    $WordDoc = _Word_Create()
    $hand = _Word_DocOpen(@MyDocumentsDir & "\sdb_zahlung.doc")
    $name = "sdb_zahlung"
    Else
    $WordDoc = _Word_Create()
    $hand = _Word_DocOpen(@MyDocumentsDir & "\Zahlung.doc")
    $name = "zahlung"
    EndIf
    WinWait($name)

    [/autoit][autoit][/autoit][autoit]

    If Not @error Then
    $oDoc = _Word_DocGet($hand, 0)
    Sleep(300)
    _Word_DocFindReplace($oDoc, "xx Euro zum TT. Monat JJJJ", $araten & " Euro zum " & $datearray[1])
    Sleep(100)
    ;[....] Script gekürzt

    [/autoit]

    Bleibt bei dem von mir genannten Problem.
    Ich hab nun das Problem, dass die Funktion _Word_DocFindReplace nicht mehr funktioniert - keine der gewünschten Ersetzungen vornimmt.
    Soweit ich der Dokumentation hier folgen kann, hat sich aber nur die Schreibweise geändert.
    Was hab ich übersehen? :huh:

  • Schau Dir bitte die Hilfe für _Word_DocOpen genau an. Der 1. Parameter muss das Applikations-Objekt sein.

  • Und ein bischen "error checking" ist auch kein Fehler. Jede Funktion der Word UDF setzt @error <> 0 wenn etwas nicht funktioniert hat. Eine genau Beschreibung gibt es in der Hilfe.

  • Ich merk schon, Sonntag war eindeutig nicht mein Tag. In dem Quelltext steckten ja jede Menge Fehler. 8|
    Unter 3.3.10.2 bin ich jetzt wieder bei der folgenden Situation:

    - bei den Rechnern, an denen das Script auch schon zuvor funktioniert hat, funktioniert es auch jetzt wieder.

    - bei dem Rechner, an dem es anfänglich sogar abgestürzt ist - durch schlechte Programmierung -, funktioniert es wieder nicht korrekt.

    @Error wird durch _Word_DocGet auf 3 (Specified document could not be found or error occurred. @extended is set to the COM error code) gesetzt und der abgefangene Fehler, zweimal vorhanden, sieht wie folgt aus:

    An den funktionierenden Rechnern wird nur der Fehler Unbekannter Name. abgefangen.

    Der Quelltext, der zu beiden Ergebnissen führt:

    [autoit]

    Func _bestrp()
    Local $sdbvar, $hand, $name, $datearray[1], $var2 = 1, $araten, $oDoc, $WordDoc, $oError = ObjEvent("AutoIt.Error", "_ErrFunc")
    $sdbksvar = 0
    $WordDoc = _Word_Create()
    $hand = _Word_DocOpen($WordDoc, @MyDocumentsDir & "\zahlung.doc", Default, Default, True)
    $name = "zahlung"
    WinWait($name)
    WinActivate($name)
    $oDoc = _Word_DocGet($WordDoc, 1)
    If @error <> 0 Then MsgBox(0, "", "@Error wurde auf "& @error & " gesetzt!")
    ;[....] Script gekürzt

    [/autoit]

    Bin ehrlich gesagt einmal mehr ratlos, was ich nun tun soll. ?(
    Alle Rechner haben meines Wissens eine identische, technische Ausstattung und Software.

  • Probier mal folgenden Code. Die Window-Befehle habe ich entfernt, da Du ja nicht die Word GUI automatisieren willst, sondern über COM auf Word zugreifst.
    _Word_DocGet kannst Du weglassen, da das Document Objekt bereits durch _Word_DocOpen zurückgegeben wird.

    [autoit]

    Func _bestrp()
    Local $sdbvar, $hand, $name, $datearray[1], $var2 = 1, $araten, $oDoc, $oWordDoc, $oError = ObjEvent("AutoIt.Error", "_ErrFunc")
    $sdbksvar = 0
    $oWord = _Word_Create()
    If @error <> 0 Then MsgBox(0, "_Word_Create", "@Error wurde auf "& @error & " gesetzt!")
    $oDoc = _Word_DocOpen($oWord, @MyDocumentsDir & "\zahlung.doc", Default, Default, True)
    If @error <> 0 Then MsgBox(0, "_Word_DocOpen", "@Error wurde auf "& @error & " gesetzt!")
    $name = "zahlung"
    ;[....] Script gekürzt

    [/autoit]
  • Hab ich, @Error wird nun nach _Word_DocOpen auf 3 gesetzt.
    Dazu folgende, abgefangene Fehler:

  • Lt. Google deutet das auf einen Bug in Office hin. Bist Du da auf dem letzten Stand? Welches Service Pack ist installiert?

  • Vielleicht hilft ja auch das hier.
    Dokument in Word öffnen - als RTF speichern - die RTF-Datei öffnen und als Word speichern.

  • NB: Ihr solltet natürlich dringend auf ein aktuelles Betriebssystem und eine aktuelle Office Version umstellen! Eh klar, oder?

  • Das mit dem hin und her über das RTF-Format hab ich noch nicht ausprobiert, dürfte meiner Meinung nach aber nichts bringen, weil:
    Bei jedem Anmelden am PC und damit dem ersten Start des Tools wird das entsprechende Word-Dokument von einer Netzwerkquelle kopiert.
    Es haben also alle PCs das gleiche Dokument und nur an einem tritt dieser Fehler auf.
    Dass Dokument selber ist Schreibgeschützt, beim kopieren werden daher vor dem Kopieren am Ziel die Flags -RA gesetzt und nach dem Kopieren von der Quelle wieder +RA gesetzt.


    Und was das OS angeht, ist alles am laufen aber manche Mühlen mahlen langsam. :whistling:

  • Dann sind mir leider die Ideen ausgegangen :(