Word UDF Error

  • Hallo zusammen,

    [autoit]

    #include <word.au3>
    _WordCreate("C:\Dokument.doc")

    [/autoit]


    stürzt ab, wenn die Datei von einem anderem Benutzer gesperrt wurde und im Word-Fenster zum Auswählen der Aktion (s. Screenshot) Abbrechen gedrückt wird. [Blockierte Grafik: http://img143.imageshack.us/img143/2320/capturedws.png
    http://img143.imageshack.us/img143/2320/capturedws.png

    In der SciTe-Console steht:

    Spoiler anzeigen

    C:\Programme\AutoIt\Include\word.au3 (458) : ==> The requested action with this object has failed.:
    $o_doc = $o_object.Documents.Open ($s_FilePath, $f_ConfirmConversions, $f_ReadOnly, $f_AddToRecentFiles, $s_PasswordDocument, "", $f_Revert, $s_WritePasswordDocument, "", $i_Format)
    $o_doc = $o_object.Documents.Open ($s_FilePath, $f_ConfirmConversions, $f_ReadOnly, $f_AddToRecentFiles, $s_PasswordDocument, "", $f_Revert, $s_WritePasswordDocument, "", $i_Format)^ ERROR
    ->14:53:14 AutoIT3.exe ended.rc:1

    Wer hat eine Idee?

    Gruß
    pk

  • Die Datei ist nicht in C:\, das war nur ein Beispiel.
    #RequireAdmin möchte ich nicht setzen, weil das Skript später auch von "normalbenutzern" benutzt werden soll.
    Das ist auch ein generelles Problem. normalerweise sind Dateien ja nicht immer gesperrt. Aber wenn sie es eben doch mal sind, soll das kein Grund sein, mein Skript abstürzen zu lassen.

  • Ich hab mal in das UDF selbst reingeschaut:
    Splitte Dein

    [autoit]

    $oWord = _WordCreate("C:\Dokument.doc")

    [/autoit]

    in

    [autoit]

    _WordCreate("")
    _WordDocOpen($oWord,"C:\test.doc",0,0,0,1)

    [/autoit]


    Falls das nicht hilft, würde ich die COM Referenz von M$ prüfen, ob man beim $oWord.Documents.Open nicht noch einen zusätzlichen Parameter angeben kann. Dann schreibst Du Dir die Open-Funktion einfach selbst.

  • Danke water, aber das hilft leider nicht, es kommt der selbe Absturz.

    Hast Du einen Link zur COM-Referenz?

    Eine andere Möglichkeit, die mir eingefallen ist: Word-Dokument öffnen und abwarten, ob ein "Dokument wird verwendet"-Fenster kommt.
    Problem: Wie kann man feststellen, ob der Abbrechen-Knopf gedrückt werde würde / schon wurde?

  • Da du ja scheinbar ein bestehendes Dokument öffnen willst, warum nimmst dann nicht

    [autoit]

    _WordDocOpen

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Die Object Model Reference für Word 2007 findest Du hier: http://msdn.microsoft.com/en-us/library/bb244515(v=office.12).aspx

  • chip: Soviel ich weiss, bleibt sich das gleich. Aber der Fehler kommt auch mit einem WordDocOpen(...)

    water: Danke, das werd ich mal durchforsten

    • Offizieller Beitrag

    Bau dir doch zusätzlich einen Object-Error-Handler ein.
    Aus der Hilfe:

    Spoiler anzeigen
    [autoit]

    $oMyError = ObjEvent("AutoIt.Error","MyErrFunc") ; Initialize a COM error handler

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

    ; This is my custom defined error handler
    Func MyErrFunc()
    Msgbox(0,"AutoItCOM Test","We intercepted a COM Error !" & @CRLF & @CRLF & _
    "err.description is: " & @TAB & $oMyError.description & @CRLF & _
    "err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _
    "err.number is: " & @TAB & hex($oMyError.number,8) & @CRLF & _
    "err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
    "err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _
    "err.source is: " & @TAB & $oMyError.source & @CRLF & _
    "err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
    "err.helpcontext is: " & @TAB & $oMyError.helpcontext _
    )
    Local $err = $oMyError.number
    If $err = 0 Then $err = -1

    $g_eventerror = $err ; to check for after this function returns
    Endfunc

    [/autoit]
  • Danke, BugFix, das ist sehr schön :)
    Das Problem des abstürzenden Skripts ist damit nur teilweise behoben, reicht aber völlig aus: Das Skript hätte eh keine Aufgabe mehr gehabt nach einem Abbruch. Und jetzt merkt der User glücklicherweise nicht, dass da am Ende noch ein Problem im Skript war.