脚本运行没有报错就莫名其妙的退出,请教一下如何找到根源?
以下是运行信息:
>"D:\Program Files\autoit3\SciTe\ACNWrapper\ACNWrapper.exe" /run /ErrorStdOut /in "G:\Software\AU3\程序开发\交行回单截图\交行回单截图V1.9.au3" /autoit3dir "D:\Program Files\autoit3" /UserParams
+>14:51:00 开始执行 ACNWrapper v.1.0.3.1
+> ============================================
+>执行环境:
+> CPU构架: X64
+> 系统构架: X64
+> 系统语言: 0804
+> 键盘布局: 00000804
+> 内存总量: 8084MB
+> 内存剩余: 2004MB
+> 操作系统: WIN_81
+> AU3版本: 3.3.15.3
+> ============================================
>运行 AU3Check (3.3.15.3)开始目录:D:\Program Files\autoit3
+>14:51:01 AU3Check 完成:0
>运行:(3.3.15.3):D:\Program Files\autoit3\autoit3.exe "G:\Software\AU3\程序开发\交行回单截图\交行回单截图V1.9.au3"
!>14:52:39 AutoIt3.exe 完成::-1073741819
+>14:52:41 ACNWrapper 完成..
>退出代码: 3221225477 运行时间: 100.4 秒
代码量有点大,每行输出日志,这个不太现实,请教有没有什么办法,能快速的找到是在哪一行发生退出?谢谢!
可以在代码编辑界面运行排查 txen548 发表于 2023-12-19 09:26
可以在代码编辑界面运行排查
经过初步排查,应该是以下函数的问题,因为我单独使用一下函数,也会出现莫名其妙的退出。这个函数是对对象的处理,不知道怎么检查错误的原因了。
该函数来自于官方论坛上,别人发的用来获取元素属性的。
#RequireAdmin
#include "UIAWrappers.au3"
#include "ISimpleDOM.au3"
#include <Misc.au3>
Const $cUIA_MAXDEPTH = 50 ; The array used is 50 deep if more simplespy just will crash
Const $dQuote = """"
Const $AutoSpy = 0 ;2000 ; SPY about every 2000 milliseconds automatically, 0 is turn of use only ctrl+w
Global $oldUIElement ; To keep track of latest referenced element
Global $frmSimpleSpy, $edtCtrlInfo, $lblCapture, $lblEscape, $lblRecord, $edtCtrlRecord
Global $UIA_CodeArray ; Code array to generate code from
;~ Global $xMouse, $yMouse
Global $hUser32DLL = DllOpen("user32.dll")
HotKeySet("{ESC}", "Close") ; Set ESC as a hotkey to exit the script.
;~ HotKeySet("^w", "GetElementInfo") ; Set Hotkey Ctrl+W to get some basic information in the GUI
;~ $frmSimpleSpy = GUICreate("Simple UIA Spy", 801, 601, 181, 4)
;~ WinSetOnTop($frmSimpleSpy, "", 1)
;~ $edtCtrlInfo = GUICtrlCreateEdit("", 18, 18, 512, 580)
;~ GUICtrlSetData(-1, "")
;~ $lblCapture = GUICtrlCreateLabel("Ctrl+W to capture information", 544, 10, 528, 17)
;~ GUISetState(@SW_SHOW)
;退出脚本
GUIRegisterMsg(0x0112, "WM_SYSCOMMAND")
Local $jMouse = False
Local $hFileHandle = FileOpen("GetText.txt", 9)
While True
;~ $msg = GUIGetMsg()
Sleep(100)
;~ Local $GetElementInfo = GetElementInfo()
;~ If _IsPressed("01", $hUser32DLL) And @error > 1796 And @extended < 1876 Then
;~ FileWrite($hFileHandle, $GetElementInfo & @CRLF)
;~ EndIf
If _IsPressed("01", $hUser32DLL) And GetElementInfo() = "查 询" Then
MsgBox(0,0, "鼠标左键被按下了!")
EndIf
WEnd
Func GetElementInfo()
Local $i, $xMouse, $yMouse, $oUIElement, $oTW
Local $tStruct = DllStructCreate($tagPOINT) ; Create a structure that defines the point to be checked. 创建一个定义要检查的点的结构。
Local $oParentHandle[$cUIA_MAXDEPTH] ; Max number of (grand)parents
$xMouse = MouseGetPos(0)
$yMouse = MouseGetPos(1)
DllStructSetData($tStruct, "x", $xMouse);设置结构元素的数据。
DllStructSetData($tStruct, "y", $yMouse);设置结构元素的数据。
$UIA_oUIAutomation.ElementFromPoint($tStruct, $UIA_pUIElement);ElementFromPoint:返回给定坐标点下最上层的 element 元素。
$oUIElement = ObjCreateInterface($UIA_pUIElement, $sIID_IUIAutomationElement, $dtagIUIAutomationElement);ObjCreateInterface:从给定的类名/对象指针, 接口标识符和描述字符串创建一个对象的引用。
$UIA_oUIAutomation.RawViewWalker($UIA_pTW);RawViewWalker:寻找所有项目;ContentViewWalker:只寻找其 IsContentElement 屬性是 true的项目;ControlViewWalker:只寻找其 IsControlElement 屬性是 true的项目。
$oTW = ObjCreateInterface($UIA_pTW, $sIID_IUIAutomationTreeWalker, $dtagIUIAutomationTreeWalker);ObjCreateInterface:从给定的类名/对象指针, 接口标识符和描述字符串创建一个对象的引用。
Local $pChildHandle
Local $oTMPParentHandle
Local $pTMPParentHandle
$oTW.getparentelement($oUIElement, $pTMPParentHandle);获取父元素
$oTMPParentHandle = ObjCreateInterface($pTMPParentHandle, $sIID_IUIAutomationElement, $dtagIUIAutomationElement);ObjCreateInterface:从给定的类名/对象指针, 接口标识符和描述字符串创建一个对象的引用。
$oTW.GetFirstChildElement($oTMPParentHandle, $pChildHandle);获取第一个子元素
$i = 0
$oTW.getparentelement($oUIElement, $oParentHandle[$i]);获取父元素
$oParentHandle[$i] = ObjCreateInterface($oParentHandle[$i], $sIID_IUIAutomationElement, $dtagIUIAutomationElement);ObjCreateInterface:从给定的类名/对象指针, 接口标识符和描述字符串创建一个对象的引用。
If IsObj($oParentHandle[$i]) <> 0 Then
While ($i <= $cUIA_MAXDEPTH - 1) And (IsObj($oParentHandle[$i]) = True)
$i = $i + 1
$oTW.getparentelement($oParentHandle[$i - 1], $oParentHandle[$i]);获取父元素
$oParentHandle[$i] = ObjCreateInterface($oParentHandle[$i], $sIID_IUIAutomationElement, $dtagIUIAutomationElement);ObjCreateInterface:从给定的类名/对象指针, 接口标识符和描述字符串创建一个对象的引用。
WEnd
EndIf
Local $pObject, $tVarChild
If AccessibleObjectFromPoint($xMouse, $yMouse, $pObject, $tVarChild) = $S_OK Then;检索在屏幕上的指定点处显示的对象的 IAccessible 接口指针的地址。
Local $oIA_Object, $sName = ""
$oIA_Object = ObjCreateInterface($pObject, $sIID_IAccessible, $dtagIAccessible);ObjCreateInterface:从给定的类名/对象指针, 接口标识符和描述字符串创建一个对象的引用。$pObject:类标识符或对象的指针. 如果是类标识符, 可以用 ProgID 或 CLSID 字符串表示形式.
$oIA_Object.get_accName($CHILDID_SELF, $sName)
;~ GUICtrlSetData($edtCtrlInfo, $sName)
Return SetError($xMouse, $yMouse, $sName)
EndIf
EndFunc ;==>GetElementInfo
Func Close()
FileClose($hFileHandle)
DllClose($hUser32DLL)
Exit
EndFunc ;==>Close
;退出脚本
Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
Local $iID = BitAND($wParam, 0xFFFF)
If ($iID = 0xF060) Then
GUIDelete($frmSimpleSpy)
Exit
EndIf
EndFunc ;==>WM_SYSCOMMAND
本帖最后由 smooth 于 2023-12-20 08:44 编辑
但是此段代码,我也同样的用在了另外一个脚本,也没有发生异常退出,比较纳闷。
我现在把脚本中加载鼠标钩子的代码去掉了,现在还没有发生异常退出,也可能是加载鼠标钩子导致的。
学习一下
页:
[1]