AccVarsUtilities.au3 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include-once
  2. #include "AccessingVariables.au3"
  3. ; --- AccVars_ArrayToSafeArray ---
  4. ; The AutoIt array and the safearray are arrays of variants
  5. Func AccVars_ArrayToSafeArray( ByRef $aArray, ByRef $pSafeArray )
  6. AccessVariables01( AccVars_ArrayToSafeArrayConvert, $aArray )
  7. AccVars_ArrayToSafeArrayData( $pSafeArray )
  8. EndFunc
  9. Func AccVars_ArrayToSafeArrayConvert( $pArray )
  10. ; <<<< On function entry the native AutoIt array is converted to a safearray contained in a variant >>>>
  11. ; Get safearray pointer
  12. Local $pSafeArrayFromArray = DllStructGetData( DllStructCreate( "ptr", $pArray + 8 ), 1 )
  13. Local $pSafeArray
  14. SafeArrayCopy( $pSafeArrayFromArray, $pSafeArray )
  15. If @error Then Return SetError(1,0,0)
  16. AccVars_ArrayToSafeArrayData( $pSafeArray, 1 )
  17. EndFunc
  18. Func AccVars_ArrayToSafeArrayData( ByRef $pSafeArray, $bSet = 0 )
  19. Static $pStaticSafeArray
  20. If $bSet Then
  21. $pStaticSafeArray = $pSafeArray
  22. Else
  23. $pSafeArray = $pStaticSafeArray
  24. EndIf
  25. EndFunc
  26. ; --- AccVars_SafeArrayToArray ---
  27. ; The safearray and the AutoIt array are arrays of variants
  28. Func AccVars_SafeArrayToArray( ByRef $pSafeArray, ByRef $aArray )
  29. AccessVariables02( AccVars_SafeArrayToArrayConvert, $pSafeArray, $aArray )
  30. EndFunc
  31. Func AccVars_SafeArrayToArrayConvert( $pvSafeArray, $pArray )
  32. ; --- Get safearray information ---
  33. ; $pvSafeArray is a variant that contains a pointer
  34. Local $pSafeArray = DllStructGetData( DllStructCreate( "ptr", $pvSafeArray + 8 ), 1 )
  35. ; Array type
  36. Local $iVarType
  37. SafeArrayGetVartype( $pSafeArray, $iVarType )
  38. Switch $iVarType
  39. Case $VT_I2, $VT_I4 ; Signed integers
  40. Case $VT_R4, $VT_R8 ; 4/8 bytes floats
  41. Case $VT_BSTR ; Basic string
  42. Case $VT_BOOL ; Boolean type
  43. Case $VT_UI4, $VT_UI8 ; 4/8 bytes unsigned integers
  44. Case $VT_VARIANT ; Variant data type
  45. Case $VT_UNKNOWN ; IUnknown pointer
  46. ; $pSafeArray is not compatible with a native AutoIt array
  47. ; Convert $pSafeArray to a compatible safearray in $pSafeArray2
  48. Local $tSafeArray = DllStructCreate( $tagSAFEARRAY, $pSafeArray )
  49. Local $tSafeArrayBound = DllStructCreate( $tagSAFEARRAYBOUND )
  50. Local $iElements = DllStructGetData( $tSafeArray, "cElements" )
  51. DllStructSetData( $tSafeArrayBound, "cElements", $iElements )
  52. DllStructSetData( $tSafeArrayBound, "lLbound", DllStructGetData( $tSafeArray, "lLbound" ) )
  53. Local $pSafeArray2 = SafeArrayCreate( $VT_VARIANT, 1, $tSafeArrayBound ), $pArrayData, $pArrayData2
  54. SafeArrayAccessData( $pSafeArray2, $pArrayData2 )
  55. SafeArrayAccessData( $pSafeArray, $pArrayData )
  56. $iVarType = @AutoItX64 ? $VT_UI8 : $VT_UI4
  57. Local $iVarSize = @AutoItX64 ? 24 : 16
  58. Local $iPtrSize = @AutoItX64 ? 8 : 4
  59. For $i = 0 To $iElements - 1 ; Set variant type and data
  60. DllStructSetData( DllStructCreate( "word", $pArrayData2 + $i * $iVarSize ), 1, $iVarType )
  61. DllStructSetData( DllStructCreate( "uint_ptr", 8 + $pArrayData2 + $i * $iVarSize ), 1, DllStructGetData( DllStructCreate( "ptr", $pArrayData + $i * $iPtrSize ), 1 ) )
  62. Next
  63. SafeArrayUnaccessData( $pSafeArray )
  64. SafeArrayUnaccessData( $pSafeArray2 )
  65. SafeArrayCopy( $pSafeArray2, $pSafeArray )
  66. SafeArrayDestroy( $pSafeArray2 )
  67. Case Else
  68. Return SetError(1,0,0)
  69. EndSwitch
  70. ; --- Set $pArray to match an array ---
  71. ; Set vt element to $VT_ARRAY + $iVarType
  72. DllStructSetData( DllStructCreate( "word", $pArray ), 1, $VT_ARRAY + $iVarType )
  73. ; Set data element to safearray pointer
  74. DllStructSetData( DllStructCreate( "ptr", $pArray + 8 ), 1, $pSafeArray )
  75. ; <<<< On function exit the safearray contained in a variant is converted to a native AutoIt array >>>>
  76. EndFunc
  77. ; --- AccVars_ArrayToSafeArrayOfVartype ---
  78. ; The returned safearray is an array of the specified variant type
  79. Func AccVars_ArrayToSafeArrayOfVartype( ByRef $aArray, $iVartype )
  80. Local $tsaBound = DllStructCreate( $tagSAFEARRAYBOUND ), $pSafeArray, $pSafeArrayData, $iArray = UBound( $aArray ), $iPtrSize = @AutoItX64 ? 8 : 4
  81. DllStructSetData( $tsaBound, "cElements", $iArray )
  82. DllStructSetData( $tsaBound, "lLbound", 0 )
  83. $pSafeArray = SafeArrayCreate( $iVartype, 1, $tsaBound )
  84. SafeArrayAccessData( $pSafeArray, $pSafeArrayData )
  85. For $i = 0 To $iArray - 1
  86. DllStructSetData( DllStructCreate( "ptr", $pSafeArrayData + $iPtrSize * $i ), 1, SysAllocString( $aArray[$i] ) )
  87. Next
  88. SafeArrayUnaccessData( $pSafeArray )
  89. Return $pSafeArray
  90. EndFunc
  91. ; --- AccVars_SafeArrayToSafeArrayOfVariant ---
  92. ; Returns a safearray with one variant element
  93. ; The variant element contains the input safearray
  94. Func AccVars_SafeArrayToSafeArrayOfVariant( ByRef $pSafeArrayIn )
  95. Local $iVartype, $tsaBound = DllStructCreate( $tagSAFEARRAYBOUND ), $pSafeArrayOut, $pSafeArrayOutData
  96. SafeArrayGetVartype( $pSafeArrayIn, $iVartype )
  97. DllStructSetData( $tsaBound, "cElements", 1 )
  98. DllStructSetData( $tsaBound, "lLbound", 0 )
  99. $pSafeArrayOut = SafeArrayCreate( $VT_VARIANT, 1, $tsaBound )
  100. SafeArrayAccessData( $pSafeArrayOut, $pSafeArrayOutData )
  101. DllStructSetData( DllStructCreate( "word", $pSafeArrayOutData ), 1, $iVartype + $VT_ARRAY )
  102. DllStructSetData( DllStructCreate( "ptr", $pSafeArrayOutData + 8 ), 1, $pSafeArrayIn )
  103. SafeArrayUnaccessData( $pSafeArrayOut )
  104. Return $pSafeArrayOut
  105. EndFunc
  106. ; --- AccVars_VariantToVariable ---
  107. Func AccVars_VariantToVariable( ByRef $pVariant )
  108. Switch DllStructGetData( DllStructCreate( "word", $pVariant ), 1 )
  109. Case $VT_I4, $VT_I8 ; 4/8 bytes signed integer
  110. Return DllStructGetData( DllStructCreate( "int", $pVariant + 8 ), 1 )
  111. Case $VT_R8 ; 8 bytes double
  112. Return DllStructGetData( DllStructCreate( "double", $pVariant + 8 ), 1 )
  113. Case $VT_BSTR ; Basic string
  114. Return SysReadString( DllStructGetData( DllStructCreate( "ptr", $pVariant + 8 ), 1 ) )
  115. Case $VT_BOOL ; 2 bytes boolean
  116. Return DllStructGetData( DllStructCreate( "short", $pVariant + 8 ), 1 )
  117. Case $VT_UI4, $VT_UI8 ; 4/8 bytes unsigned integer
  118. Return DllStructGetData( DllStructCreate( "ptr", $pVariant + 8 ), 1 )
  119. Case Else
  120. Return SetError(1,0,0)
  121. EndSwitch
  122. EndFunc
  123. ; --- AccVars_VariableToVariant ---
  124. Func AccVars_VariableToVariant( $vVariable, ByRef $pVariant )
  125. Switch VarGetType( $vVariable )
  126. Case "Bool"
  127. DllStructSetData( DllStructCreate( "word", $pVariant ), 1, $VT_BOOL )
  128. DllStructSetData( DllStructCreate( "short", $pVariant + 8 ), 1, $vVariable )
  129. Case "Double"
  130. DllStructSetData( DllStructCreate( "word", $pVariant ), 1, $VT_R8 )
  131. DllStructSetData( DllStructCreate( "double", $pVariant + 8 ), 1, $vVariable )
  132. Case "Int32"
  133. DllStructSetData( DllStructCreate( "word", $pVariant ), 1, $VT_I4 )
  134. DllStructSetData( DllStructCreate( "int", $pVariant + 8 ), 1, $vVariable )
  135. Case "Ptr"
  136. DllStructSetData( DllStructCreate( "word", $pVariant ), 1, @AutoItX64 ? $VT_UI8 : $VT_UI4 )
  137. DllStructSetData( DllStructCreate( "ptr", $pVariant + 8 ), 1, $vVariable )
  138. Case "String"
  139. DllStructSetData( DllStructCreate( "word", $pVariant ), 1, $VT_BSTR )
  140. DllStructSetData( DllStructCreate( "ptr", $pVariant + 8 ), 1, SysAllocString( $vVariable ) )
  141. Case Else
  142. Return SetError(1,0,0)
  143. EndSwitch
  144. EndFunc