Letraindusoir Posted August 30, 2021 Share Posted August 30, 2021 (edited) expandcollapse popup#include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <IE.au3> Global $oMyError,$oErr TestAu3Code() Func TestAu3Code() GUICreate("CodeTest") Local $idEdtCode = GUICtrlCreateEdit("", 10, 10, 380, 180, $ES_AUTOVSCROLL + $WS_VSCROLL) Local $idCommand = GUICtrlCreateButton("RunCode", 310, 200, 80, 25) Local $idEdtEror = GUICtrlCreateEdit("", 10, 235, 380, 160, $ES_AUTOVSCROLL + $WS_VSCROLL) GUISetState(@SW_SHOW) GUICtrlSetData($idEdtCode, 'MsgBox(4096, "", "_IEPropertyGet($oIE, "locationurl")') While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $idCommand $oMyError = ObjEvent("AutoIt.Error", "ErrFunc") Local $oIE = _IECreate("www.baidu.com") ;ShellExecute(@AutoItExe, GUICtrlRead($idCommand)) Execute(GUICtrlRead($idCommand)) If @error Then GUICtrlSetData($idEdtEror,"ShellExecute @error = " & @error & @CRLF, 1) Local $sError=ErrFunc($oErr) If $sError Then GUICtrlSetData($idEdtEror, @CRLF & "AutoIt.Error : " & @CRLF & $sError & @CRLF, 1) EndSwitch WEnd GUIDelete() EndFunc ;==>TestAu3Code Func ErrFunc($oError) Return "Catch a COM Error !" & @CRLF & _ "ErrCode: 0x" & Hex($oError.number, 8) & @CRLF & _ "ErrDesc: " & $oError.windescription & _ "ErrLine: " & $oError.scriptline EndFunc ;==>ErrFunc The code is as above. It Can run but always pop up msgbox miserror. How can make it work more smoothly? Thanks ahead! Edited September 2, 2021 by Letraindusoir Link to comment Share on other sites More sharing options...
Nine Posted August 30, 2021 Share Posted August 30, 2021 (edited) Well there is quite a number of problems with your code. The biggest issue is the fact that when you reshell autoit (shellexecute or run), it becomes a new process thus a completely new script. There is no link between the caller and the callee (unless you add command line parameters or use some other means like IPC). To get a good example of how you can reshell autoit on a single line of code, see help file / Using AutoIt / Command Line Parameters. Edited August 30, 2021 by Nine Letraindusoir 1 “They did not know it was impossible, so they did it” ― Mark Twain Spoiler Block all input without UAC Save/Retrieve Images to/from Text Monitor Management (VCP commands) Tool to search in text (au3) files Date Range Picker Virtual Desktop Manager Sudoku Game 2020 Overlapped Named Pipe IPC HotString 2.0 - Hot keys with string x64 Bitwise Operations Multi-keyboards HotKeySet Recursive Array Display Fast and simple WCD IPC Multiple Folders Selector Printer Manager GIF Animation (cached) Screen Scraping Multi-Threading Made Easy Link to comment Share on other sites More sharing options...
Letraindusoir Posted September 2, 2021 Author Share Posted September 2, 2021 On 8/31/2021 at 1:59 AM, Nine said: Well there is quite a number of problems with your code. The biggest issue is the fact that when you reshell autoit (shellexecute or run), it becomes a new process thus a completely new script. There is no link between the caller and the callee (unless you add command line parameters or use some other means like IPC). To get a good example of how you can reshell autoit on a single line of code, see help file / Using AutoIt / Command Line Parameters. thanks,Nine The effect I want to achieve is to update the Au3 code in the editbox and then run the changed code without having to re-open the master program. It doesn't seem to work with Cmdline and maybe I don't know how to use cmdline yet Link to comment Share on other sites More sharing options...
Nine Posted September 2, 2021 Share Posted September 2, 2021 Maybe this ? expandcollapse popup#include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <IE.au3> Global $oMyError, $idEdtError, $Test TestAu3Code() Func TestAu3Code() GUICreate("CodeTest") Local $idEdtCode = GUICtrlCreateEdit("", 10, 10, 380, 180, $ES_AUTOVSCROLL + $WS_VSCROLL) Local $idCommand = GUICtrlCreateButton("RunCode", 310, 200, 80, 25) $idEdtError = GUICtrlCreateEdit("", 10, 235, 380, 160, $ES_AUTOVSCROLL + $WS_VSCROLL) GUISetState(@SW_SHOW) GUICtrlSetData($idEdtCode, 'Assign("Test", MsgBox(4096, "", _IEPropertyGet($oIE, "locationurl")))') While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $idCommand $oMyError = ObjEvent("AutoIt.Error", "ErrFunc") Local $oIE = _IECreate("www.baidu.com") Execute(GUICtrlRead($idEdtCode)) If @error Then GUICtrlSetData($idEdtError, "Execute @error = " & @error & @CRLF, 1) ConsoleWrite("Resulting = " & $Test & @CRLF) EndSwitch WEnd EndFunc ;==>TestAu3Code Func ErrFunc($oError) GUICtrlSetData($idEdtError, "Catch a COM Error !" & @CRLF & _ "ErrCode: 0x" & Hex($oError.number, 8) & @CRLF & _ "ErrDesc: " & $oError.windescription & @CRLF & _ "ErrLine: " & $oError.scriptline & @CRLF, 1) EndFunc ;==>ErrFunc Letraindusoir 1 “They did not know it was impossible, so they did it” ― Mark Twain Spoiler Block all input without UAC Save/Retrieve Images to/from Text Monitor Management (VCP commands) Tool to search in text (au3) files Date Range Picker Virtual Desktop Manager Sudoku Game 2020 Overlapped Named Pipe IPC HotString 2.0 - Hot keys with string x64 Bitwise Operations Multi-keyboards HotKeySet Recursive Array Display Fast and simple WCD IPC Multiple Folders Selector Printer Manager GIF Animation (cached) Screen Scraping Multi-Threading Made Easy Link to comment Share on other sites More sharing options...
Letraindusoir Posted September 3, 2021 Author Share Posted September 3, 2021 (edited) 22 hours ago, Nine said: Maybe this ? I'm sorry Because I am not good at English, maybe my expression is not easy to understand. I would like to do a IE test form. After declaring a global variable "$oIE", Input the code in the code-editbox and then click the "RunCode" button to see the running results. In this way, by constantly updating the code in the code-editbox, we can easily continuously view the code running results. I rewrote the code to help to understand: expandcollapse popup#include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <IE.au3> #include <Array.au3> Global $oIE,$oMyError, $idEdtEror,$Result $oIE = _IECreate() TestAu3Code() Func TestAu3Code() GUICreate("CodeTest") Local $idEdtCode = GUICtrlCreateEdit("", 10, 10, 380, 160, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_WANTRETURN, $WS_VSCROLL)) Local $idCommand = GUICtrlCreateButton("RunCode", 310, 180, 80, 25) $idEdtRetn = GUICtrlCreateEdit("", 10, 215, 380, 120, $ES_AUTOVSCROLL + $WS_VSCROLL) $idEdtEror = GUICtrlCreateEdit("", 10, 345, 380, 50, $ES_AUTOVSCROLL + $WS_VSCROLL) GUISetState(@SW_SHOW) Local $code = "" $code &= '_IENavigate($oIE,"https://www.autoitscript.com/forum/")' & @CRLF $code &= '_IEPropertyGet($oIE, "locationurl") ' & @CRLF $code &= 'Local $oKeyword=_IEGetObjById($oIE,"elSearchField")' & @CRLF $code &= '$oKeyword.value="excute"' GUICtrlSetData($idEdtCode, $code) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $idCommand $oMyError = ObjEvent("AutoIt.Error", "ErrFunc") Local $aCode = StringSplit(GUICtrlRead($idEdtCode), @CRLF, 1) _ArrayDisplay($aCode) For $i = 1 To $aCode[0] If StringLen(StringStripWS($aCode[$i], 8)) Then $Result = Execute($aCode[$i]) If @error Then GUICtrlSetData($idEdtRetn, "Execute @error = " & @error & @CRLF, 1) GUICtrlSetData($idEdtRetn, "Result = " & $Result & @CRLF, 1) EndIf Next EndSwitch WEnd EndFunc ;==>TestAu3Code Func ErrFunc($oError) GUICtrlSetData($idEdtEror, "Catch a COM Error !" & @CRLF & _ "ErrCode: 0x" & Hex($oError.number, 8) & @CRLF & _ "ErrDesc: " & $oError.windescription & @CRLF & _ "ErrLine: " & $oError.scriptline & @CRLF, 1) EndFunc ;==>ErrFunc Edited September 3, 2021 by Letraindusoir Link to comment Share on other sites More sharing options...
junkew Posted September 5, 2021 Share Posted September 5, 2021 Seems like you are writing a helpertool but i do not yet see the benefit over just using scite and run button. FAQ 31 How to click some elements, FAQ 40 Test automation with AutoIt, Multithreading CLR .NET Powershell CMDLets Link to comment Share on other sites More sharing options...
Letraindusoir Posted September 5, 2021 Author Share Posted September 5, 2021 5 hours ago, junkew said: Seems like you are writing a helpertool but i do not yet see the benefit over just using scite and run button. I just want to be easier when testing operating web-page by way of Au3 so want to run au3 code directly with Au3 as with scite. @AutoItExe,execute all used and didn't work well I didn't know too much about it, and I was stumped Link to comment Share on other sites More sharing options...
junkew Posted September 5, 2021 Share Posted September 5, 2021 Did you read the note in the help fileNote that either Call() or the called function can set the @error flag. If Call() sets the @error flag, the value will be 0xDEAD and @extended will also be set to 0xBEEF. See the example for a demonstration of testing for a function that was not found. I only see 3 solutions to do what you want but probably its not easy and leads to writing your own lexer/parser 1. Mix the call, assign, execute and eval functions call("_IENavigate",$oIE,"https://www.autoitscript.com/forum/") consolewrite("Execute @error = " & @error & @CRLF) I think the assign, execute and eval where not made to also call functions although I am not sure. As you can see this does not work (and as such your coding neither) execute('_IENavigate($oIE,"https://www.autoitscript.com/forum/"') consolewrite("Execute @error = " & @error & @CRLF) see example at bottom based on your code extended with consolewrite, msgbox as a base starting point 2. Make use of a function variable but will lead to similar things as in point 1 $f=_IENavigate $f($oIE,"https://www.autoitscript.com/forum/") 3. write out the textbox content to a modified .au3 file and execute that for point 2 this temp output could look like below (but probably will be more complicated) ''## put default includes here for $i=0 to 3 runline($i) if @error then .... next function runLine($lineNo) switch $lineNo case 0 _IENavigate($oIE,"https://www.autoitscript.com/forum/") case 1 _IEPropertyGet($oIE, "locationurl") case 2 Local $oKeyword=_IEGetObjById($oIE,"elSearchField") case 3 $oKeyword.value="excute" endswitch end function Example expandcollapse popup#include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <IE.au3> #include <Array.au3> Global $oIE,$oMyError, $idEdtEror,$Result $oIE = _IECreate() sleep(2000) ;call("_IENavigate",$oIE,"https://www.autoitscript.com/forum/") ;consolewrite("Execute @error = " & @error & @CRLF) ;consolewrite(isdeclared("$oIE")) ;consolewrite(isdeclared("oIE")) ;execute('_IENavigate($oIE,"https://www.autoitscript.com/forum/"') ;consolewrite("Execute @error = " & @error & @CRLF) ;call('consolewrite','"https://www.autoitscript.com/forum/"') ;consolewrite("Execute @error = " & @error & @CRLF) ;call('MsgBox', 0, "", "hello world") ;If @error = 0xDEAD And @extended = 0xBEEF Then consolewrite("Wrong function or parameters " & @CRLF) ;local $aArgs[4] =["CallArgArray", 0,"","hello world"] ;call('MsgBox',$aArgs) ;If @error = 0xDEAD And @extended = 0xBEEF Then consolewrite("Wrong function or parameters " & @CRLF) TestAu3Code() Func TestAu3Code() GUICreate("CodeTest") Local $idEdtCode = GUICtrlCreateEdit("", 10, 10, 380, 160, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_WANTRETURN, $WS_VSCROLL)) Local $idCommand = GUICtrlCreateButton("RunCode", 310, 180, 80, 25) $idEdtRetn = GUICtrlCreateEdit("", 10, 215, 380, 120, $ES_AUTOVSCROLL + $WS_VSCROLL) $idEdtEror = GUICtrlCreateEdit("", 10, 345, 380, 50, $ES_AUTOVSCROLL + $WS_VSCROLL) GUISetState(@SW_SHOW) Local $code = 'consolewrite("Hello world")' & @CRLF $code &= 'msgbox(0,"","hello world")' & @CRLF $code &= '_IENavigate($oIE,"https://www.autoitscript.com/forum/")' & @CRLF $code &= '_IEPropertyGet($oIE, "locationurl") ' & @CRLF ;$code &= 'Local $oKeyword=_IEGetObjById($oIE,"elSearchField")' & @CRLF ;$code &= '$oKeyword.value="excute"' GUICtrlSetData($idEdtCode, $code) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $idCommand $oMyError = ObjEvent("AutoIt.Error", "ErrFunc") Local $aCode = StringSplit(GUICtrlRead($idEdtCode), @CRLF, 1) local $myParams[1] ;_ArrayDisplay($aCode) For $i = 1 To $aCode[0] If StringLen(StringStripWS($aCode[$i], 8)) Then ;'$Result = Execute($aCode[$i]) $splitParts=StringSplit($aCode[$i],"(,)") $fName=$splitParts[1] if (stringinstr($aCode[$i],"=")>0) Then consolewrite("its an assignment, you have to do a little more " & @CRLF ) Else consolewrite($splitParts[0] & @CRLF ) _ArrayDisplay($splitParts) $parCount=$splitParts[0] - 2 redim $myParams[$parCount+1] $myParams[0] = "CallArgArray" ;Evaluate the parameter before we throw it into the call for $j=2 to $parCount+1 ;If not a string if stringleft(StringStripWS($splitParts[$j],$STR_STRIPLEADING + $STR_STRIPTRAILING),1)<>'"' Then if isnumber($splitParts[$j]) then consolewrite("Evaluating number " & $splitParts[$j] &@CRLF ) $myParams[$j-1]=int($splitParts[$j]) Else local $parName=stringreplace($splitParts[$j],"$","") consolewrite("Evaluating param " & $parName & isdeclared($parName) & @CRLF ) $myParams[$j-1]=eval($parName) endif Else consolewrite("Copying " & $splitParts[$j] & @CRLF ) $myParams[$j-1]=$splitParts[$j] EndIf next _ArrayDisplay($myParams) consolewrite("Calling " & $parCount & $fName & $myParams[0] & $myParams[1] & @CRLF ) call($fName, $myParams) If @error = 0xDEAD And @extended = 0xBEEF Then consolewrite("Wrong function or parameters " & @CRLF) EndIf If @error Then GUICtrlSetData($idEdtRetn, "Execute @error = " & @error & @CRLF, 1) GUICtrlSetData($idEdtRetn, "Result = " & $Result & @CRLF, 1) EndIf Next EndSwitch WEnd EndFunc ;==>TestAu3Code Func ErrFunc($oError) GUICtrlSetData($idEdtEror, "Catch a COM Error !" & @CRLF & _ "ErrCode: 0x" & Hex($oError.number, 8) & @CRLF & _ "ErrDesc: " & $oError.windescription & @CRLF & _ "ErrLine: " & $oError.scriptline & @CRLF, 1) EndFunc ;==>ErrFunc Letraindusoir 1 FAQ 31 How to click some elements, FAQ 40 Test automation with AutoIt, Multithreading CLR .NET Powershell CMDLets Link to comment Share on other sites More sharing options...
Letraindusoir Posted September 6, 2021 Author Share Posted September 6, 2021 (edited) 16 hours ago, junkew said: Did you read the note in the help fileNote that either Call() or the called function can set the @error flag. If Call() sets the @error flag, the value will be 0xDEAD and @extended will also be set to 0xBEEF. See the example for a demonstration of testing for a function that was not found. I only see 3 solutions to do what you want but probably its not easy and leads to writing your own lexer/parser junkew,Sorry to trouble you and great thanks for your hard work! I know nothing about au3 compiler. I originally thought au3 code could be run with @AutoItExe,execute,eval and so on. It seems that I thought it was too simple. so ,Leave this problem to be solved later. I would honestly test the code with scite...... thanks again! Edited September 6, 2021 by Letraindusoir Link to comment Share on other sites More sharing options...
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