AccessingVariables.au3 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include-once
  2. #include "Variant.au3"
  3. #include "SafeArray.au3"
  4. #include "COMUtils.au3"
  5. Global $oAccVars_Object = AccVars_Init(), $hAccVars_MethodFunc
  6. ; --- The first part of the UDF creates $oAccVars_Object and implements method functions ---
  7. Func AccVars_Init()
  8. ; Three locals copied from "IUIAutomation MS framework automate chrome, FF, IE, ...." by junkew
  9. ; https://www.autoitscript.com/forum/index.php?showtopic=153520
  10. Local $sCLSID_CUIAutomation = "{FF48DBA4-60EF-4201-AA87-54103EEF594E}"
  11. Local $sIID_IUIAutomation = "{30CBE57D-D9D0-452A-AB13-7AC5AC4825EE}"
  12. Local $stag_IUIAutomation = _
  13. "AccVars_VariableToVariant01 hresult(variant*);" & _
  14. "AccVars_VariableToVariant02 hresult(variant*;variant*);"
  15. ; Create AccVars object (Automation object)
  16. Local $oAccVars_Object = ObjCreateInterface( $sCLSID_CUIAutomation, $sIID_IUIAutomation, $stag_IUIAutomation )
  17. If Not IsObj( $oAccVars_Object ) Then Return SetError(1,0,1)
  18. ; Replace original methods with AccVars_VariableToVariantXY methods
  19. Local $pVariableToVariant, $pAccessVariable = Ptr( $oAccVars_Object() ), $sFuncName, $sFuncParams = "ptr", $iOffset, $iPtrSize = @AutoItX64 ? 8 : 4
  20. For $i = 1 To 2
  21. $sFuncName = "AccVars_VariableToVariant" & StringFormat( "%02i", $i )
  22. $sFuncParams &= ";ptr*"
  23. $iOffset = ( 3 + $i - 1 ) * $iPtrSize
  24. $pVariableToVariant = DllCallbackGetPtr( DllCallbackRegister( $sFuncName, "long", $sFuncParams ) )
  25. ReplaceVTableFuncPtr( $pAccessVariable, $iOffset, $pVariableToVariant )
  26. Next
  27. Return $oAccVars_Object
  28. EndFunc
  29. Func AccVars_VariableToVariant01( $pSelf, $pVariant01 )
  30. $hAccVars_MethodFunc( $pVariant01 )
  31. Return 0 ; $S_OK (COM constant)
  32. #forceref $pSelf
  33. EndFunc
  34. Func AccVars_VariableToVariant02( $pSelf, $pVariant01, $pVariant02 )
  35. $hAccVars_MethodFunc( $pVariant01, $pVariant02 )
  36. Return 0 ; $S_OK (COM constant)
  37. #forceref $pSelf
  38. EndFunc
  39. ; --- The last part of the UDF creates a set of easy to use functions to call the object methods ---
  40. Func AccessVariables01( $hAccVars_Method, ByRef $vVariable01 )
  41. $hAccVars_MethodFunc = $hAccVars_Method
  42. $oAccVars_Object.AccVars_VariableToVariant01( $vVariable01 )
  43. EndFunc
  44. Func AccessVariables02( $hAccVars_Method, ByRef $vVariable01, ByRef $vVariable02 )
  45. $hAccVars_MethodFunc = $hAccVars_Method
  46. $oAccVars_Object.AccVars_VariableToVariant02( $vVariable01, $vVariable02 )
  47. EndFunc