argumentum Posted May 25, 2020 Posted May 25, 2020 (edited) This is a UDF to handle the AutoIt Error msgbox when our awesome code goes I've been using trancexx's code for the longest time and since I iron some wrinkles in my ( personal use ) UDF, decided to organize it in a dignifying way and post it. The ZIP with the code is in the downloads area. I'm posting this because most other handlers use /ErrorStdOut to catch errors and they are not that common, for us great coders So makes little sense to me to run 2 EXEs for something unlikely to happen. No one made a UDF of this, so, I did. oh, ..there are things where this will be of no use, say, infinite recursion or what not, so, if the the AutoIt Error msgbox was to popup then this UDF should do it. ...let me know if you liked it, or post your views to better it. Cheers There is also an EventViewer_GetMyEntries() down this post that may come in handy. Edited June 26, 2020 by argumentum tarretarretarre, Marc and Danyfirex 2 1 Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting.
argumentum Posted May 25, 2020 Author Posted May 25, 2020 What's New in Version 1.2020.5.26 added: logfile self maintenance - _DebugMsgBox_PriorLogSize() added: error return - _DebugMsgBox_AddHookApiError() fixed: Au3Stripper error on DllCallbackRegister() and related when /RM is used. added: TimerDiff() and @UserName to the report. added: _DebugMsgBox_EventLogId() - ( no real use for us here, added for completeness ) added: _DebugMsgBox_EventLogCategory() - ( no real use for us here, added for completeness ) added: _DebugMsgBox_EventLogBinaryData() - ( no real use for us here, added for completeness ) What's New in Version 1.2020.5.25 added: _DebugMsgBox_GetUDFversion() ; Get UDF version added: _DebugMsgBox_EXEversion([$sVersion]) ; Set / Get executable file version for report fixed: needless folder creations What's New in Version 1.2020.5.24 initial release The ZIP with the code is in the downloads area. Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting.
argumentum Posted May 26, 2020 Author Posted May 26, 2020 (edited) The default value for _DebugMsgBox_EventLogId() is 1000, and so is for AutoIt most of the time. If you want to read your entries from the Events log, you may use these: expandcollapse popup#include <EventLog.au3> #include <Array.au3> Example1() ; DLL way Func Example1() Local $t = TimerInit(), $aArray = EventLog_FindMyErrorInLast(5) If @error Then MsgBox(0, @ScriptName, "there was an error doing this", 10) _ArrayDisplay($aArray, "EventLog_FindMyErrorInLast() - w/ DLL - " & TimerDiff($t)) EndFunc ;==>Example Func EventLog_FindMyErrorInLast($iMaxReturn = 10, $iMaxSampleCount = 1000, $iEventIdentifier = 1000) ; $iMaxReturn = max. records to return ; $iMaxSampleCount = max. sample reads searching for events ; $iEventIdentifier = _DebugMsgBox_EventLogId() Local $hEventLog, $aEvent Local $i = 0, $aArray[$iMaxReturn + 1][14] $aArray[0][0] = 0 $aArray[0][1] = "Record number" $aArray[0][2] = "Submitted Date Time" $aArray[0][4] = "Generated Date Time" $aArray[0][6] = "Event ID" $aArray[0][7] = "Type #" $aArray[0][8] = "Type Str." $aArray[0][9] = "Category" $aArray[0][10] = "Source" $aArray[0][11] = "Computer" $aArray[0][12] = "Username" $aArray[0][13] = "Description" ; Read most current event records $hEventLog = _EventLog__Open("", "Application") If $hEventLog = 0 Then ReDim $aArray[$i + 1][14] $aArray[0][0] = $i Return SetError(1, 0, $aArray) EndIf For $n = 1 To $iMaxSampleCount $aEvent = _EventLog__Read($hEventLog, True, False) If $aEvent[0] = False Then ExitLoop If $aEvent[6] <> $iEventIdentifier Or $aEvent[8] <> 'Error' Or $aEvent[9] <> 0 Then ContinueLoop $i += 1 For $m = 1 To 13 Switch $m Case 2, 4 $aArray[$i][$m] = $aEvent[$m] & " " & $aEvent[$m + 1] Case 3, 5 ContinueLoop Case Else $aArray[$i][$m] = $aEvent[$m] EndSwitch Next If $i = $iMaxReturn Then ExitLoop Next _EventLog__Close($hEventLog) ReDim $aArray[$i + 1][14] $aArray[0][0] = $i Return $aArray EndFunc ;==>EventLog_FindMyErrorInLast ;============================================================================= Example2() ; WMI way Func Example2() ; https://www.autoitscript.com/forum/topic/202832-ondebugmsgbox-for-the-dreaded-autoit-error-msgbox/?do=findComment&comment=1456279 Local $t = TimerInit(), $aArray = EventViewer_GetMyEntries(5) If @error Then MsgBox(0, @ScriptName, "there was an error doing this", 10) _ArrayDisplay($aArray, "EventViewer_GetMyEntries() - w/ WMI - " & TimerDiff($t)) EndFunc ;==>Example Func EventViewer_GetMyEntries($iMaxReturn = 10, $iEventIdentifier = 1000) ; $iMaxReturn = 0 means no limit ; ; based out of https://www.autoitscript.com/forum/topic/141626-collecting-event-logs-question/ Local $v, $r, $s, $iCount = 0, $wbemFlagReturnImmediately = 0x10, $wbemFlagForwardOnly = 0x20 Local $aOutput[100][7] $aOutput[0][1] = "Category" $aOutput[0][2] = "RecordNumber" $aOutput[0][3] = "Type" $aOutput[0][4] = "User" $aOutput[0][5] = "TimeGenerated" $aOutput[0][6] = "InsertionString(s)" Local $objItem, $objWMIService = ObjGet("winmgmts:\\.\") Local $sSQL = "SELECT Category,RecordNumber,Type,User,TimeGenerated,InsertionStrings" $sSQL &= " FROM Win32_NTLogEvent WHERE " ;~ $sSQL &= "Category = 0 AND " ; others tend to have Category = 100 $sSQL &= "Type = 'Error' AND " ; and Type = 'Information' $sSQL &= "EventIdentifier = " & $iEventIdentifier Local $colItems = $objWMIService.ExecQuery($sSQL, "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly) If IsObj($colItems) Then For $objItem In $colItems $iCount += 1 If $iCount = UBound($aOutput) Then ReDim $aOutput[UBound($aOutput) + 100][7] $aOutput[$iCount][1] = $objItem.Category $aOutput[$iCount][2] = $objItem.RecordNumber $aOutput[$iCount][3] = $objItem.Type $aOutput[$iCount][4] = $objItem.User $aOutput[$iCount][5] = WMIDateStringToDate($objItem.TimeGenerated) $s = "" $v = $objItem.InsertionStrings For $r In $v $s &= $r & @CRLF Next $aOutput[$iCount][6] = $s If $iCount = $iMaxReturn Then ExitLoop Next Else ReDim $aOutput[$iCount + 1][7] $aOutput[0][0] = $iCount Return SetError(1, $iCount, $aOutput) EndIf ReDim $aOutput[$iCount + 1][7] $aOutput[0][0] = $iCount Return SetError(0, $iCount, $aOutput) EndFunc ;==>EventViewer_GetMyEntries Func WMIDateStringToDate($dtmDate) Return (StringMid($dtmDate, 5, 2) & "/" & _ StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _ & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate, 13, 2)) EndFunc ;==>WMIDateStringToDate Edited May 26, 2020 by argumentum better code Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting.
water Posted June 23, 2020 Posted June 23, 2020 Has been added to the wiki argumentum 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
tarretarretarre Posted June 24, 2020 Posted June 24, 2020 Good job! argumentum 1 Socket-IO - An event-driven TCP UDF (Realtime chat example) AutoIt-API-WS - An expressive HTTP server you can use to build your own API with (Screenshots)
argumentum Posted June 26, 2020 Author Posted June 26, 2020 What's New in Version 2.2020.6.25 added: _DebugMsgBox_WinVerStr() to set or get the version string for the Windows. added: Set/Get show of AutoIt version on title when not compiled. Default is True/Show. (this is because I've found myself running beta inadvertently and scratching my head) changed: _DebugMsgBox_LogFile(). now an empty string will overwrite a log in @TempDir, to turn it OFF, set to FALSE. ( read remarks ) Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting.
argumentum Posted January 6, 2024 Author Posted January 6, 2024 What's New in Version 2.2024.1.6 fixed: It'd show FALSE in the title due to an oversight. Follow the link to my code contribution ( and other things too ). FAQ - Please Read Before Posting.
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