aiter Posted September 19, 2016 Posted September 19, 2016 (edited) I am testing intercepting com errors in Word and I have found a possible bug in the UDF, it might not be a bug it just means a workaround. I have found the com error bug in _Word_Create Func _Word_Create($bVisible = Default, $bForceNew = Default) Local $oAppl, $bApplCloseOnQuit = False If $bVisible = Default Then $bVisible = True If $bForceNew = Default Then $bForceNew = False If Not $bForceNew Then $oAppl = ObjGet("", "Word.Application") <------- here is the line which causees com error This happens in the following example #include <Word.au3> main() func main() local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc") $oWord = _Word_Create() $oDoc = _Word_DocOpen($oWord, @ScriptDir & "\Dear.docx", False, Default, True) $myrange = $oDoc.Range $myrange.Select sleep(3000) _Word_DocClose($oDoc) _Word_Quit($oWord) endfunc ; User's COM error function. Will be called if COM error occurs Func _ErrFunc($oError) ; Do anything here. ConsoleWrite(@ScriptName & " (" & $oError.scriptline & ") : ==> COM Error intercepted !" & @CRLF & _ @TAB & "err.number is: " & @TAB & @TAB & "0x" & Hex($oError.number) & @CRLF & _ @TAB & "err.windescription:" & @TAB & $oError.windescription & @CRLF & _ @TAB & "err.description is: " & @TAB & $oError.description & @CRLF & _ @TAB & "err.source is: " & @TAB & @TAB & $oError.source & @CRLF & _ @TAB & "err.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _ @TAB & "err.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF & _ @TAB & "err.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _ @TAB & "err.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _ @TAB & "err.retcode is: " & @TAB & "0x" & Hex($oError.retcode) & @CRLF & @CRLF) EndFunc ;==>_ErrFunc This script causes a com error to occur and it has the following error test.au3 (53) : ==> COM Error intercepted ! err.number is: 0x80020006 err.windescription: Unknown name. err.description is: err.source is: err.helpfile is: err.helpcontext is: err.lastdllerror is: 0 err.scriptline is: 53 err.retcode is: 0x00000000 Line 53 is If Not $bForceNew Then $oAppl = ObjGet("", "Word.Application") as I mentioned above. When I force a new instance of Word, no error occurs eg #include <Word.au3> main() func main() local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc") $oWord = _Word_Create(True,True) $oDoc = _Word_DocOpen($oWord, @ScriptDir & "\Dear.docx", False, Default, True) $myrange = $oDoc.Range $myrange.Select sleep(3000) _Word_DocClose($oDoc) _Word_Quit($oWord) endfunc So it seems that if I want to open up existing Word instance (use _Word_Create() ) I will have to create my own _Word_Open to bypass this problem. (If Word is already open the problem will not occur) Comment? Edited September 19, 2016 by aiter Correction
water Posted September 20, 2016 Posted September 20, 2016 Which version of AutoIt do you run? My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
water Posted September 24, 2016 Posted September 24, 2016 "Unknown name" is no error. It's an information that is handled by the UDF. Means: The UDF checks if there is a running Word instance. If true it connects to this instance. If false, it creates a new one. As - starting with AutoIt > 3.3.12.0 - all COM errors are now handled (means: ignored) in the _Word* functions you can't grab COM errors without a lot of modifications in this functions. My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
aiter Posted September 24, 2016 Author Posted September 24, 2016 (edited) Running 3.3.14.2 Are you saying my com error handling is redundant? When I put in my own com error handling as posted above, I encounter the com error (i.e it hits my com error function). If I don't have the the com error handling and run it from dos within a framework, the program just hangs for doomsday, so I need the error handling. The reason it hangs is because any input that is required (whether console input or windows input) hangs it within the framework. Anyway, I only need a new instance of word so no issue for me, but anyone else will encounter it if they have the same sort of script. Edited September 24, 2016 by aiter
water Posted September 24, 2016 Posted September 24, 2016 When Jon changed the way COM errors are handled he needed to insert a COM error handler into the Excel and Word UDF. It was implemented by inserting a local COM error handler into (nearly) each function. _Word_Create misses this error handler so you can grab the COM error with your global COM error handler. But this does not work for those functions with a local error handler. But there should b no need to implement a global COM error handler. Check @error after each function call - that's all it needs to grab errors. My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
aiter Posted September 24, 2016 Author Posted September 24, 2016 (edited) Unfortunately without my global com error handler the program hangs within the framework I run it in as I tried to explain the post above. I see that the normal com error handler works nicely with a dialog if I run it from dos. When I run it within my framework (database system) it hangs because an error dialog is an input (okay, not this particular problem, but another one, say $oRange.lotofjunk. By using my own com error handler I can intercept this and output the message to console) . I will post the link to another problem I had just now. Edited September 24, 2016 by aiter
water Posted September 24, 2016 Posted September 24, 2016 The Word UDF should never create a GUI to output error information. If it does then it's a bug. Ignore the "unknown name" message by _Word_Create. I would be interested in all other messages originating by the Word UDF. My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
aiter Posted September 24, 2016 Author Posted September 24, 2016 It does #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Change2CUI=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <Word.au3> main() func main() ;local $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc") $oWord = _Word_Create() $oDoc = _Word_DocOpen($oWord, @ScriptDir & "\Dear.docx", False, Default, True) $myrange = $oDoc.Rangeer ;<--- deliberate error $myrange.Select sleep(3000) _Word_DocClose($oDoc) _Word_Quit($oWord) endfunc Run from cmd prompt, I get
aiter Posted September 24, 2016 Author Posted September 24, 2016 (edited) It comes down to wanting apps compiled for CUI (console) to have pure console error output messages. No inputs (dialog or otherwise) required. Edited September 24, 2016 by aiter
water Posted September 24, 2016 Posted September 24, 2016 8 minutes ago, aiter said: It comes down to wanting apps compiled for CUI (console) to have pure console error output messages. I think it comes down to write error free code or to handle errors correctly. How do you expect the second line to work when line 1 is not able to create the object? 17 minutes ago, aiter said: $myrange = $oDoc.Rangeer ;<--- deliberate error$myrange.Select I suggest $oRange = $oDoc.Rangeer ;<--- deliberate error If @error Then ; Write error to log ... Exit EndIf $oRange.Select My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
water Posted September 24, 2016 Posted September 24, 2016 If you still need to suppress error messages in a GUI you could use trancexx' solution I asked for many years ago: My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
aiter Posted September 24, 2016 Author Posted September 24, 2016 (edited) Water, you biscuit I thought I was alone in this problem. I agree with you about error free code. The example was just a quick and nasty (when compiled though, it generates the error dialog before it hits the @error clause anyway) The actual app I am writing I do error check everything, but I wanted what you posted above just in case the unexpected happened. Definitely "I stand on the shoulders of giants" Edited September 24, 2016 by aiter
water Posted September 24, 2016 Posted September 24, 2016 (edited) If you like the solution then there is a button to tell me Edited September 24, 2016 by water aiter 1 My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now