Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 08/19/2025 in all areas

  1. I hope someone can give me help with understanding this. I am testing manipulating AutoIt arrays via COM objects. I can make AutoIt pass me the underlying variant ptr this way, and as i understand it, AutoIt uses varaints internally for values. When calling the method with a array the call takes longer. Since i can modify the variable directly, i expect it does not clone the value, yet arrays take longer, so it's doing something. Also. The size of the array does seem to affect time taken. Does anyone have any ideas what is causing this behavior? #include <WinAPICom.au3> Func F1($pObject, $pVariant) return 0 EndFunc $tObject = DllStructCreate("ptr VTableAddress;ptr VTableMethods[4];") DllStructSetData($tObject, "VTableAddress", DllStructGetPtr($tObject, "VTableMethods")) Local $hF1 = DllCallbackRegister(F1, "LONG", "PTR;PTR") Local $pF1 = DllCallbackGetPtr($hF1) DllStructSetData($tObject, "VTableMethods", $pF1, 1) Local $pObject = DllStructGetPtr($tObject) $oObject = ObjCreateInterface($pObject, _WinAPI_CreateGUID(), "f1 HRESULT(variant*);", False) ;------------------------------------------------------------------------------------------- $s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pharetra tristique felis at dapibus. Vivamus odio lorem, feugiat ut porttitor ac, vehicula sed diam. Donec facilisis quam vitae quam sollicitudin tempus. Quisque ligula sapien, convallis in enim quis, porttitor bibendum lacus. Aenean sollicitudin sit amet augue hendrerit tristique. Nam non est sollicitudin lorem semper tempus ac id tellus. Ut id urna sed justo maximus condimentum ut sed nibh. Integer sit amet consectetur leo. Ut consectetur, nisl eget placerat dignissim, quam dolor rutrum lectus, nec sollicitudin nunc ipsum quis turpis. Maecenas venenatis vel neque vitae aliquam. Etiam id elit quis arcu blandit luctus id ac mauris. Etiam cursus bibendum ultricies. Morbi vitae pellentesque eros, at ullamcorper neque. Duis luctus semper euismod. Etiam vel dui sit amet ante faucibus lacinia non et ante. Quisque id mauris ultrices, congue dui vitae, semper justo. Quisque a placerat metus, vitae ultrices massa. Nunc iaculis faucibus quam quis tincidunt. Integer suscipit ullamcorper felis, eu porttitor nibh sodales ut. Aenean quis fermentum nisl. Maecenas vestibulum hendrerit dolor ac ornare. Mauris vulputate nulla ut nunc ultricies faucibus. Vestibulum ligula enim, vestibulum vitae mauris in, vehicula aliquet nibh. Nunc viverra erat massa, nec scelerisque lacus posuere quis. Maecenas nec neque facilisis, malesuada urna a, iaculis sem. Donec volutpat eget enim nec tempus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque vitae est elementum, feugiat ligula sit amet, porttitor turpis. Aliquam erat volutpat. Quisque id luctus leo. Vestibulum egestas, nibh id euismod semper, sem tellus dictum metus, nec ullamcorper tellus nisi a sapien. Nunc rutrum, mauris eu lacinia tincidunt, velit augue interdum massa, eu porta odio massa ac ipsum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Curabitur semper sed dolor ut vulputate. Cras cursus odio eu felis tristique, non fermentum tellus bibendum. Mauris laoreet mattis blandit. Morbi eget viverra diam. Nulla a venenatis enim, vitae ullamcorper nisi. Cras feugiat felis id orci sagittis rhoncus. Proin congue tempor urna id viverra. Aliquam scelerisque leo sit amet justo laoreet pulvinar. Integer risus enim, viverra at tortor nec, egestas rutrum massa. Cras id velit imperdiet, elementum ante sit amet, tincidunt nunc. In facilisis mi a suscipit mollis. Donec ornare ante quis sodales vestibulum. Phasellus eget tellus erat. Sed pellentesque eleifend mauris vel malesuada. Quisque orci felis, fringilla vel tellus et, vestibulum efficitur lacus. Nullam dictum ligula non faucibus fermentum. Pellentesque dignissim, velit in scelerisque luctus, lacus arcu fermentum nulla, vel sodales nibh tortor in elit. Curabitur ut orci varius, scelerisque lectus volutpat, posuere turpis. Integer efficitur arcu nec ornare lobortis. Fusce lobortis, odio ut sodales pulvinar, neque nisl eleifend tortor, in dignissim ipsum purus nec nunc. Vivamus auctor lectus volutpat nunc congue sollicitudin nec eu nisl. Cras elementum auctor ligula, et egestas augue pharetra eu. Nam fermentum condimentum finibus. Aliquam a suscipit sem. Cras pretium neque nec ullamcorper aliquet. Sed vitae condimentum est. Curabitur mattis posuere rhoncus. Sed accumsan, quam nec mollis faucibus, velit odio ornare velit, sit amet fermentum enim." $s = $s & $s & $s $aArray = StringSplit($s, "", 2) $iNumber = 0xabc ConsoleWrite("Array:"&@CRLF) $hTime = TimerInit() $oObject.f1($aArray) ConsoleWrite(" variant*: " & TimerDiff($hTime)&@CRLF) ConsoleWrite("Number:"&@CRLF) $hTime = TimerInit() $oObject.f1($iNumber) ConsoleWrite(" variant*: " & TimerDiff($hTime)&@CRLF)
    1 point
  2. @jugador, guess it is you that made the bug report #4045 ... right? What's up with that last comment in that report, or did we miss any promised SLA in our mutual signed contract?
    1 point
  3. Brief: native WinMove() has a "speed" parameter for a more fluent movement. unfortunately, that applies to the change in position, but not the change in size. the position changes in the specified "speed", but size changes abruptly. _WinPose() is similar to WinMove(), except that move and resize are simultaneous, both conform to the speed parameter. UDF: (save as "WinPose.au3") #include-once #include <WinAPISysWin.au3> ; #FUNCTION# ==================================================================================================================== ; Name ..........: _WinPose ; Description ...: same as native WinMove(), except that move and resize are simultaneous, both conform to the speed parameter. ; Syntax ........: _WinPose($hWnd, $sText, $x, $y, $w, $h[, $speed = 0]) ; Parameters ....: $hWnd - the title/hWnd/class of the window to pose. ; $sText - the text of the window to pose. ; $x - X coordinate to move to. ; $y - Y coordinate to move to. ; $w - [optional] new width of the window. ; $h - [optional] new height of the window. ; $speed - [optional] the speed to pose the window (smaller value = faster speed, 0 = instantaneous). ; Return values .: Success - a handle to the window. ; Failure - 0 if the window is not found (also sets @error to non-zero). ; Author ........: orbs ; Modified ......: ; Remarks .......: parameters and return values are practically identical to those of the native WinMove() function. ; Related .......: ; Link ..........: ; Example .......: Yes ; =============================================================================================================================== Func _WinPose($hWnd, $sText, $x, $y, $w = Default, $h = Default, $speed = 0) ; find the window to move If Not IsHWnd($hWnd) Then $hWnd = WinGetHandle($hWnd, $sText) If @error Then Return SetError(1, 0, False) EndIf Local $aPos = WinGetPos($hWnd) If @error Then Return SetError(2, 0, False) ; initialize variables Local Enum $pos_x, $pos_y, $pos_w, $pos_h Local Enum $aiCurrent, $aiTarget, $aiDelta, $aiRatio Local $aPosTarget[4][4] = [[$aPos[$pos_x], $x, 0, 0], [$aPos[$pos_y], $y, 0, 0], [$aPos[$pos_w], $w, 0, 0], [$aPos[$pos_h], $h, 0, 0]] ; accomodate for Default keyword For $iElement = 0 To 3 If $aPosTarget[$iElement][$aiTarget] = Default Then $aPosTarget[$iElement][$aiTarget] = $aPos[$iElement] Next ; calculate delta For $iElement = 0 To 3 $aPosTarget[$iElement][$aiDelta] = $aPosTarget[$iElement][$aiTarget] - $aPosTarget[$iElement][$aiCurrent] Next ; find the maximum delta Local $iMaxElement = 0, $iMaxDelta = 0 For $iElement = 0 To 3 If Abs($aPosTarget[$iElement][$aiDelta]) > $iMaxDelta Then $iMaxElement = $iElement $iMaxDelta = $aPosTarget[$iElement][$aiDelta] EndIf Next ; accomodate for negative delta If ($aPosTarget[$iMaxElement][$aiTarget] - $aPos[$iMaxElement]) < 0 Then $iMaxDelta = -$iMaxDelta ; calculate ratio for all elements For $iElement = 0 To 3 $aPosTarget[$iElement][$aiRatio] = $aPosTarget[$iElement][$aiDelta] / $iMaxDelta Next ; move & resize the window gradually For $iStep = 0 To $iMaxDelta For $iElement = 0 To 3 $aPosTarget[$iElement][$aiCurrent] += $aPosTarget[$iElement][$aiRatio] Next For $i = 1 To $speed _WinAPI_MoveWindow($hWnd, _ $aPosTarget[$pos_x][$aiCurrent], _ $aPosTarget[$pos_y][$aiCurrent], _ $aPosTarget[$pos_w][$aiCurrent], _ $aPosTarget[$pos_h][$aiCurrent], False) Next Next ; validate final outcome is as expected Return WinMove($hWnd, '', $x, $y, $w, $h) EndFunc ;==>_WinPose Example: #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 #include <AutoItConstants.au3> #include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #include 'WinPose.au3' Global Const $iMinW = 250, $iMinH = 100 Global $x, $y, $w, $h, $speed Global $hGUI = GUICreate('_WinPose() Example', $iMinW, $iMinH) Global $gButton = GUICtrlCreateButton('Click Me!', 25, 25, 200, 50) GUICtrlSetResizing(-1, $GUI_DOCKBORDERS) GUISetState(@SW_SHOW) Global $msg While True $msg = GUIGetMsg() Switch $msg Case $GUI_EVENT_CLOSE ExitLoop Case $gButton $w = Random($iMinW, @DesktopWidth / 3, 1) $h = Random($iMinH, @DesktopHeight / 3, 1) $x = Random(0, @DesktopWidth - $w, 1) $y = Random(0, @DesktopHeight - $h, 1) $speed = Random(10, 100, 1) _WinPose($hGUI, '', $x, $y, $w, $h, $speed) EndSwitch WEnd click the button to pose the window in a new random position and size, in a random speed. enjoy 🙂
    1 point
  4. Working example: #include <MsgBoxConstants.au3> #include "wd_helper.au3" _Example() Func _Example() Run('"C:\Program Files\Mozilla Firefox\firefox.exe" --marionette -profile C:\FirefoxTEMP') _WD_Option('Driver', 'geckodriver.exe') _WD_Option('DriverParams', '--log trace --connect-existing --marionette-port 2828') _WD_Option('Port', 4444) _WD_Startup() Local $sSession = _WD_CreateSession() _WD_Navigate($sSession, "https://www.autoitscript.com/forum") MsgBox($MB_OK + $MB_TOPMOST + $MB_ICONINFORMATION, @ScriptName, "After attaching") _WD_Shutdown() EndFunc ;==>_Example
    1 point
  5. time taken to convert Array to Safearray UBound: 10308 Array_Split: 3.59900051094329 to_Safearray: 10.3791479145815 Now if you delete the code within __Array_to_SafeArray then the time taken just to pass the data through COM objects.... UBound: 10308 Array_Split: 3.74493431229134 to_Safearray: 9.39925668250824 <<============ So it's an AutoIt internal thing; you have to ask Jon. Example code: #include "SafeArray.au3" #include "ArrayPointer UDF.au3" __Example_0A() Func __Example_0A() $s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris pharetra tristique felis at dapibus. Vivamus odio lorem, feugiat ut porttitor ac, vehicula sed diam. Donec facilisis quam vitae quam sollicitudin tempus. Quisque ligula sapien, convallis in enim quis, porttitor bibendum lacus. Aenean sollicitudin sit amet augue hendrerit tristique. Nam non est sollicitudin lorem semper tempus ac id tellus. Ut id urna sed justo maximus condimentum ut sed nibh. Integer sit amet consectetur leo. Ut consectetur, nisl eget placerat dignissim, quam dolor rutrum lectus, nec sollicitudin nunc ipsum quis turpis. Maecenas venenatis vel neque vitae aliquam. Etiam id elit quis arcu blandit luctus id ac mauris. Etiam cursus bibendum ultricies. Morbi vitae pellentesque eros, at ullamcorper neque. Duis luctus semper euismod. Etiam vel dui sit amet ante faucibus lacinia non et ante. Quisque id mauris ultrices, congue dui vitae, semper justo. Quisque a placerat metus, vitae ultrices massa. Nunc iaculis faucibus quam quis tincidunt. Integer suscipit ullamcorper felis, eu porttitor nibh sodales ut. Aenean quis fermentum nisl. Maecenas vestibulum hendrerit dolor ac ornare. Mauris vulputate nulla ut nunc ultricies faucibus. Vestibulum ligula enim, vestibulum vitae mauris in, vehicula aliquet nibh. Nunc viverra erat massa, nec scelerisque lacus posuere quis. Maecenas nec neque facilisis, malesuada urna a, iaculis sem. Donec volutpat eget enim nec tempus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Pellentesque vitae est elementum, feugiat ligula sit amet, porttitor turpis. Aliquam erat volutpat. Quisque id luctus leo. Vestibulum egestas, nibh id euismod semper, sem tellus dictum metus, nec ullamcorper tellus nisi a sapien. Nunc rutrum, mauris eu lacinia tincidunt, velit augue interdum massa, eu porta odio massa ac ipsum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Curabitur semper sed dolor ut vulputate. Cras cursus odio eu felis tristique, non fermentum tellus bibendum. Mauris laoreet mattis blandit. Morbi eget viverra diam. Nulla a venenatis enim, vitae ullamcorper nisi. Cras feugiat felis id orci sagittis rhoncus. Proin congue tempor urna id viverra. Aliquam scelerisque leo sit amet justo laoreet pulvinar. Integer risus enim, viverra at tortor nec, egestas rutrum massa. Cras id velit imperdiet, elementum ante sit amet, tincidunt nunc. In facilisis mi a suscipit mollis. Donec ornare ante quis sodales vestibulum. Phasellus eget tellus erat. Sed pellentesque eleifend mauris vel malesuada. Quisque orci felis, fringilla vel tellus et, vestibulum efficitur lacus. Nullam dictum ligula non faucibus fermentum. Pellentesque dignissim, velit in scelerisque luctus, lacus arcu fermentum nulla, vel sodales nibh tortor in elit. Curabitur ut orci varius, scelerisque lectus volutpat, posuere turpis. Integer efficitur arcu nec ornare lobortis. Fusce lobortis, odio ut sodales pulvinar, neque nisl eleifend tortor, in dignissim ipsum purus nec nunc. Vivamus auctor lectus volutpat nunc congue sollicitudin nec eu nisl. Cras elementum auctor ligula, et egestas augue pharetra eu. Nam fermentum condimentum finibus. Aliquam a suscipit sem. Cras pretium neque nec ullamcorper aliquet. Sed vitae condimentum est. Curabitur mattis posuere rhoncus. Sed accumsan, quam nec mollis faucibus, velit odio ornare velit, sit amet fermentum enim." $s = $s & $s & $s $hTime_A = TimerInit() $aArray = StringSplit($s, "", 2) ConsoleWrite(" UBound: " & UBound($aArray)&@CRLF) ConsoleWrite(" Array_Split: " & TimerDiff($hTime_A)&@CRLF) Local $t_SAobj Local $o_SAobj = __SafeArray_Dummy_Obj($t_SAobj) $hTime_B = TimerInit() Local $psa $o_SAobj.Array_to_SafeArray($aArray, $psa) SafeArrayUnaccessData( $psa ) ConsoleWrite(" to_Safearray: " & TimerDiff($hTime_B)&@CRLF) SafeArrayDestroy($psa) $o_SAobj = 0 __Delete_SafeArray_ObjectFromTag( $t_SAobj ) EndFunc for ArrayPointer UDF => https://www.autoitscript.com/forum/topic/213008-array-pointer/
    1 point
×
×
  • Create New...