#include-once
#include <WinAPI.au3>

; #CURRENT# =====================================================================================================================
;_ExchangeVariables_Startup
;_ExchangeVariables_Shutdown
;_ExchangeVariables_GetVariable
;_ExchangeVariables_SetVariable
; ===============================================================================================================================

; #VARIABLES# ===================================================================================================================
Global $_ExchangeVariables_Gui = 0
Global $_ExchangeVariables_ID = 0
Global $_ExchangeVariables_Msg = 0
Global $_ExchangeVariables_Variant_String = ''
Global $_ExchangeVariables_Variant_Type = -1
Global $_ExchangeVariables_MsgFunc = 0
; ===============================================================================================================================

; #INTERNAL_USE_ONLY# ===========================================================================================================
;__ExchangeVariables_GetHwnd
;__ExchangeVariables_Message_Func
;__ExchangeVariables_MemorySetData
;__ExchangeVariables_MemoryGetData
;__ExchangeVariables_MemoryOpen
;__ExchangeVariables_MemoryClose
;__ExchangeVariables_StringToVariant
;__ExchangeVariables_VariantToString
;__ExchangeVariables_ArrayToString
;__ExchangeVariables_StringToArray
; ===============================================================================================================================



; #FUNCTION# ======================================================================================
; Name ..........: _ExchangeVariables_Startup()
; Description ...: Prepare the script for exchanging variables
; Syntax ........: _ExchangeVariables_Startup($iID[, $sUnique = '_Exchange_Variables_'[, $sMsgFunc='']])
; Parameters ....: $iID      - Script identifier number
;                  $sUnique  - [optional]  (default:'_Exchange_Variables_') Unique string to register the windowmessage
;                  $sMsgFunc - [optional]  (default:'') Function that is called after a variable has been received
; Return values .: Success
;                  Failure
; Author ........: Eukalyptus
; Modified ......:
; Remarks .......:
; Related .......: _WinAPI_RegisterWindowMessage, GUIRegisterMsg
; Link ..........:
; Example .......:
; =================================================================================================

Func _ExchangeVariables_Startup($iID, $sUnique = '_Exchange_Variables_', $sMsgFunc='')
	If Not IsInt($iID) Then Return SetError(1, 0, False)
	If $_ExchangeVariables_Gui Then Return SetError(2, 0, False)
	$_ExchangeVariables_Gui = GUICreate("_Exchange_Variables_")
	GUISetState(@SW_HIDE, $_ExchangeVariables_Gui)
	$_ExchangeVariables_Msg = _WinAPI_RegisterWindowMessage($sUnique)
	$_ExchangeVariables_ID = $iID
	If $sMsgFunc Then
		$_ExchangeVariables_MsgFunc = _WinAPI_RegisterWindowMessage($sUnique & 'MSG')
		GUIRegisterMsg($_ExchangeVariables_MsgFunc, $sMsgFunc)
	EndIf
	GUIRegisterMsg($_ExchangeVariables_Msg, "__ExchangeVariables_Message_Func")
	Return SetError(0, 0, True)
EndFunc   ;==>_ExchangeVariables_Startup



; #FUNCTION# ======================================================================================
; Name ..........: _ExchangeVariables_Shutdown()
; Description ...: Disable exchanging variables
; Syntax ........: _ExchangeVariables_Shutdown()
; Parameters ....:
; Return values .: Success
;                  Failure
; Author ........: Eukalyptus
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......:
; =================================================================================================

Func _ExchangeVariables_Shutdown()
	GUIRegisterMsg($_ExchangeVariables_Msg, '')
	GUIRegisterMsg($_ExchangeVariables_MsgFunc, '')
	GUIDelete($_ExchangeVariables_Gui)
	$_ExchangeVariables_Gui = 0
	$_ExchangeVariables_ID = 0
	$_ExchangeVariables_Msg = 0
	$_ExchangeVariables_Variant_String = ''
	$_ExchangeVariables_Variant_Type = -1
	$_ExchangeVariables_MsgFunc = 0
	Return SetError(0, 0, True)
EndFunc   ;==>_ExchangeVariables_Shutdown



; #FUNCTION# ======================================================================================
; Name ..........: _ExchangeVariables_GetVariable()
; Description ...: Return the value of the variable from the other script
; Syntax ........: _ExchangeVariables_GetVariable($iID, $sVariable)
; Parameters ....: $iID       - Identifier number of the script to get the variable of
;                  $sVariable - Name of the variable
;                  $sExtended - Additional information:
;                                     - Variable is a DllStruct: A string representing the structure
; Return values .: Success - Value of the variable
;                  Failure -
; Author ........: Eukalyptus
; Modified ......:
; Remarks .......:
; Related .......: Eval, IsDeclared, Assign, DllStructCreate
; Link ..........:
; Example .......:
; =================================================================================================

Func _ExchangeVariables_GetVariable($iID, $sVariable, $sExtended='')
	Local Static $hWnd = __ExchangeVariables_GetHwnd($iID), $iID_Old = $iID
	If Not IsHWnd($hWnd) Or $iID <> $iID_Old Then $hWnd = __ExchangeVariables_GetHwnd($iID)
	If Not IsHWnd($hWnd) Then Return SetError(1, 0, 0)

	Local $tString = DllStructCreate('Char[' & StringLen($sVariable) & ']')
	DllStructSetData($tString, 1, $sVariable)
	Local $tStruct = DllStructCreate('DWord;DWord;DWord;Ptr;DWord;Ptr')
	DllStructSetData($tStruct, 1, 1)
	DllStructSetData($tStruct, 3, StringLen($sVariable))
	DllStructSetData($tStruct, 4, DllStructGetPtr($tString))

	Local $aReturn = DllCall('User32.dll', 'DWord', 'SendMessage', 'HWnd', $hWnd, 'Int', $_ExchangeVariables_Msg, 'DWord', _WinAPI_MakeLong(@AutoItPID, $iID), 'Ptr', DllStructGetPtr($tStruct))
	If @error Or Not IsArray($aReturn) Or Not $aReturn[0] Then Return SetError(2, 0, 0)

	$tString = 0
	$tString = DllStructCreate('Char[' & $aReturn[0] & ']')
	DllStructSetData($tStruct, 1, 2)
	DllStructSetData($tStruct, 3, $aReturn[0])
	DllStructSetData($tStruct, 4, DllStructGetPtr($tString))

	$aReturn = DllCall('User32.dll', 'DWord', 'SendMessage', 'HWnd', $hWnd, 'Int', $_ExchangeVariables_Msg, 'DWord', _WinAPI_MakeLong(@AutoItPID, $iID), 'Ptr', DllStructGetPtr($tStruct))
	If @error Or Not IsArray($aReturn) Or Not $aReturn[0] Then Return SetError(3, 0, 0)

	Switch DllStructGetData($tStruct, 2)
		Case 8 ;Dllstruct
			Local $Variant = __ExchangeVariables_StringToVariant(DllStructGetData($tString, 1) & $sExtended, 8)
		Case Else
			Local $Variant = __ExchangeVariables_StringToVariant(DllStructGetData($tString, 1) , DllStructGetData($tStruct, 2))
	EndSwitch

	Return $Variant
EndFunc   ;==>_ExchangeVariables_GetVariable



; #FUNCTION# ======================================================================================
; Name ..........: _ExchangeVariables_SetVariable()
; Description ...: Set the value of the variable in the other script
; Syntax ........: _ExchangeVariables_SetVariable($iID, $sVariable, $Variant)
; Parameters ....: $iID       - Identifier number of the script to set the variable
;                  $sVariable - Name of the variable of the other script
;                  $Variant   - Variable/Value to set
;                  $sExtended - Additional information:
;                                     - Variable is a DllStruct: A string representing the structure
; Return values .: Success - True
;                  Failure - False
; Author ........: Eukalyptus
; Modified ......:
; Remarks .......:
; Related .......: Eval, IsDeclared, Assign
; Link ..........:
; Example .......:
; =================================================================================================

Func _ExchangeVariables_SetVariable($iID, $sVariable, $Variant, $sExtended='')
	Local Static $hWnd = __ExchangeVariables_GetHwnd($iID), $iID_Old = $iID
	If Not IsHWnd($hWnd) Or $iID <> $iID_Old Then $hWnd = __ExchangeVariables_GetHwnd($iID)
	If Not IsHWnd($hWnd) Then Return SetError(1, 0, 0)

	Local $sVariant = __ExchangeVariables_VariantToString($Variant, $sExtended)
	Local $iType = @extended
	Local $tVariable = DllStructCreate('Char[' & StringLen($sVariable) & ']')
	DllStructSetData($tVariable, 1, $sVariable)
	Local $tVariant = DllStructCreate('Char[' & StringLen($sVariant) & ']')
	DllStructSetData($tVariant, 1, $sVariant)
	Local $tStruct = DllStructCreate('DWord;DWord;DWord;Ptr;DWord;Ptr')
	DllStructSetData($tStruct, 1, 3)
	DllStructSetData($tStruct, 2, $iType)
	DllStructSetData($tStruct, 3, StringLen($sVariable))
	DllStructSetData($tStruct, 4, DllStructGetPtr($tVariable))
	DllStructSetData($tStruct, 5, StringLen($sVariant))
	DllStructSetData($tStruct, 6, DllStructGetPtr($tVariant))

	Local $aReturn = DllCall('User32.dll', 'ptr', 'SendMessage', 'HWnd', $hWnd, 'Int', $_ExchangeVariables_Msg, 'DWord', _WinAPI_MakeLong(@AutoItPID, $iID), 'Ptr', DllStructGetPtr($tStruct))
	If @error Or Not IsArray($aReturn) Or Not $aReturn[0] Then Return SetError(2, 0, 0)
	Return SetError(0, 0, $aReturn[0])
EndFunc   ;==>_ExchangeVariables_SetVariable





; #INTERNAL_USE_ONLY# ===========================================================================================================
Func __ExchangeVariables_GetHwnd($iID)
	Local $aWinlist = WinList("_Exchange_Variables_")
	If Not IsArray($aWinlist) Then Return SetError(1, 0, 0)
	Local $hWnd
	For $i = 1 To $aWinlist[0][0]
		$hWnd = DllCall('User32.dll', 'hWnd', 'SendMessage', 'hWnd', $aWinlist[$i][1], 'Int', $_ExchangeVariables_Msg, 'wParam', 0, 'lParam', $iID)
		If $hWnd[0] And IsHWnd($hWnd[0]) Then Return $hWnd[0]
	Next
	Return SetError(1, 0, 0)
EndFunc   ;==>__ExchangeVariables_GetHwnd


Func __ExchangeVariables_Message_Func($hWnd, $iMsg, $wParam, $lparam)
	Switch $wParam
		Case 0
			If $lparam = $_ExchangeVariables_ID Then Return $_ExchangeVariables_Gui
			Return False
		Case Else
			Local $aData = __ExchangeVariables_MemoryGetData(_WinAPI_LoWord($wParam), $lparam)
			If @error Then Return False
			Switch $aData[0]
				Case 1 ; Get Len
					Switch IsDeclared($aData[2])
						Case True
							$_ExchangeVariables_Variant_String = __ExchangeVariables_VariantToString(Eval($aData[2]))
							$_ExchangeVariables_Variant_Type = @extended
							Return StringLen($_ExchangeVariables_Variant_String)
						Case Else
							Return False
					EndSwitch
				Case 2 ; Get Str
					$aData[1] = $_ExchangeVariables_Variant_Type
					$aData[2] = $_ExchangeVariables_Variant_String
					Return __ExchangeVariables_MemorySetData(_WinAPI_LoWord($wParam), $lparam, $aData)
				Case 3 ; Set Str
					Switch IsDeclared($aData[2])
						Case True
							Local $Variant = __ExchangeVariables_StringToVariant($aData[3], $aData[1])
							Assign($aData[2], $Variant)
							If @error Then Return False
							If $_ExchangeVariables_MsgFunc Then DllCall('User32.dll', 'ptr', 'SendMessage', 'HWnd', $_ExchangeVariables_Gui, 'Int', $_ExchangeVariables_MsgFunc, 'DWord', 0, 'Ptr', 0)
							Return True
						Case Else
							Return False
					EndSwitch
			EndSwitch
	EndSwitch
	Return False
EndFunc   ;==>__ExchangeVariables_Message_Func


Func __ExchangeVariables_MemorySetData($_PID, $_Pointer, $aData)
	Local $ah_Handle = __ExchangeVariables_MemoryOpen($_PID) ; Open the memory allocated by the PID from the calling application
	If Not IsArray($ah_Handle) Then Return SetError(1, 0, False)

	Local $tString, $tStruct = DllStructCreate('DWord;DWord;DWord;Ptr;DWord;Ptr')
	DllStructSetData($tStruct, 1, $aData[0])
	DllStructSetData($tStruct, 2, $aData[1])
	DllStructSetData($tStruct, 3, StringLen($aData[2]))
	DllStructSetData($tStruct, 4, $aData[4])
	DllStructSetData($tStruct, 5, StringLen($aData[3]))
	DllStructSetData($tStruct, 6, $aData[5])

	DllCall($ah_Handle[0], 'int', 'WriteProcessMemory', 'int', $ah_Handle[1], 'int', $_Pointer, 'ptr', DllStructGetPtr($tStruct), 'int', DllStructGetSize($tStruct), 'int', '')
	If @error Then Return SetError(2, 0, False)

	If $aData[2] Then
		$tString = DllStructCreate('Char[' & StringLen($aData[2]) & ']')
		DllStructSetData($tString, 1, $aData[2])
		DllCall($ah_Handle[0], 'int', 'WriteProcessMemory', 'int', $ah_Handle[1], 'int', $aData[4], 'ptr', DllStructGetPtr($tString), 'int', DllStructGetSize($tString), 'int', '')
		If @error Then Return SetError(3, 0, False)
	EndIf

	If $aData[3] Then
		$tString = DllStructCreate('Char[' & StringLen($aData[3]) & ']')
		DllStructSetData($tString, 1, $aData[3])
		DllCall($ah_Handle[0], 'int', 'WriteProcessMemory', 'int', $ah_Handle[1], 'int', $aData[5], 'ptr', DllStructGetPtr($tString), 'int', DllStructGetSize($tString), 'int', '')
		If @error Then Return SetError(4, 0, False)
	EndIf

	__ExchangeVariables_MemoryClose($ah_Handle) ; Close the Handle
	Return SetError(0, 0, True)
EndFunc   ;==>__ExchangeVariables_MemorySetData


Func __ExchangeVariables_MemoryGetData($_PID, $_Pointer)
	Local $aReturn[6] = [0, 0, '', '', 0, 0]
	Local $ah_Handle = __ExchangeVariables_MemoryOpen($_PID) ; Open the memory allocated by the PID from the calling application
	If Not IsArray($ah_Handle) Then Return SetError(1, 0, $aReturn)

	Local $tStruct = DllStructCreate('DWord;DWord;DWord;Ptr;DWord;Ptr')

	DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $_Pointer, 'ptr', DllStructGetPtr($tStruct), 'int', DllStructGetSize($tStruct), 'int', '')
	If @error Then Return SetError(2, 0, $aReturn)
	$aReturn[0] = DllStructGetData($tStruct, 1)
	$aReturn[1] = DllStructGetData($tStruct, 2)

	Local $iStrLen = DllStructGetData($tStruct, 3), $tString, $pString = DllStructGetData($tStruct, 4)
	If $pString And $iStrLen > 0 Then
		$aReturn[4] = $pString
		$tString = DllStructCreate("Char[" & $iStrLen & "]")
		DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $pString, 'ptr', DllStructGetPtr($tString), 'int', DllStructGetSize($tString), 'int', '')
		If @error Then Return SetError(3, 0, $aReturn)
		$aReturn[2] = DllStructGetData($tString, 1)
		$tString = 0
	EndIf
	$iStrLen = DllStructGetData($tStruct, 5)
	$pString = DllStructGetData($tStruct, 6)
	If $pString And $iStrLen > 0 Then
		$aReturn[5] = $pString
		$tString = DllStructCreate("Char[" & $iStrLen & "]")
		DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $pString, 'ptr', DllStructGetPtr($tString), 'int', DllStructGetSize($tString), 'int', '')
		If @error Then Return SetError(4, 0, $aReturn)
		$aReturn[3] = DllStructGetData($tString, 1)
		$tString = 0
	EndIf
	__ExchangeVariables_MemoryClose($ah_Handle) ; Close the Handle
	Return SetError(0, 0, $aReturn)
EndFunc   ;==>__ExchangeVariables_MemoryGetData


Func __ExchangeVariables_MemoryGetStruct($_PID, $_Pointer, $sType)
	Local $tReturn = DllStructCreate($sType)

	Local $ah_Handle = __ExchangeVariables_MemoryOpen($_PID) ; Open the memory allocated by the PID from the calling application
	If Not IsArray($ah_Handle) Then Return SetError(1, 0, $tReturn)

	DllCall($ah_Handle[0], 'int', 'ReadProcessMemory', 'int', $ah_Handle[1], 'int', $_Pointer, 'ptr', DllStructGetPtr($tReturn), 'int', DllStructGetSize($tReturn), 'int', '')
	If @error Then Return SetError(2, 0, $tReturn)

	__ExchangeVariables_MemoryClose($ah_Handle) ; Close the Handle
	Return SetError(0, 0, $tReturn)
EndFunc   ;==>__ExchangeVariables_MemoryGetData


Func __ExchangeVariables_MemoryOpen($iv_Pid, $iv_DesiredAccess = 0x1F0FFF, $if_InheritHandle = 1)
	;Original by Nomad
	If Not ProcessExists($iv_Pid) Then Return SetError(1, 0, 0)
	Local $ah_Handle[2] = [DllOpen('kernel32.dll')]
	If @error Then Return SetError(2, 0, 0)
	Local $av_OpenProcess = DllCall($ah_Handle[0], 'int', 'OpenProcess', 'int', $iv_DesiredAccess, 'int', $if_InheritHandle, 'int', $iv_Pid)
	If @error Then
		DllClose($ah_Handle[0])
		Return SetError(3, 0, 0)
	EndIf
	$ah_Handle[1] = $av_OpenProcess[0]
	Return $ah_Handle
EndFunc   ;==>__ExchangeVariables_MemoryOpen


Func __ExchangeVariables_MemoryClose($ah_Handle)
	;Original by Nomad
	If Not IsArray($ah_Handle) Then Return SetError(1, 0, 0)
	DllCall($ah_Handle[0], 'int', 'CloseHandle', 'int', $ah_Handle[1])
	If Not @error Then
		DllClose($ah_Handle[0])
		Return SetError(0, 0, True)
	Else
		DllClose($ah_Handle[0])
		Return SetError(2, 0, False)
	EndIf
EndFunc   ;==>__ExchangeVariables_MemoryClose


Func __ExchangeVariables_StringToVariant($sVariable, $iType)
	Switch $iType
		Case 1
			Return __ExchangeVariables_StringToArray($sVariable)
		Case 2 ;"Int32"
			Return Int($sVariable)
		Case 3 ;"Int64"
			Return Int($sVariable)
		Case 4 ;"Double"
			Return Number($sVariable)
		Case 5 ;"String"
			Return String($sVariable)
		Case 6 ;"Binary"
			Return Binary($sVariable)
		Case 7 ;"Ptr"
			Return Ptr($sVariable)
		Case 8 ;"DLLStruct"
			Local $aSplit=StringSplit($sVariable,"|")
			If @error Or UBound($aSplit) <> 4 Then Return SetError(1,0,0)
			Local $tReturn=__ExchangeVariables_MemoryGetStruct(Int($aSplit[1]), Ptr($aSplit[2]), $aSplit[3])
			Return $tReturn
		Case 9 ;"Object"
			Return $sVariable
		Case 10 ;"Bool"
			Return $sVariable = 'True'
		Case 11 ;"Keyword"
			Switch $sVariable
				Case "Default"
					Return Default
				Case Else
					Return String($sVariable)
			EndSwitch
		Case Else
			Return String($sVariable)
	EndSwitch
EndFunc   ;==>__ExchangeVariables_StringToVariant


Func __ExchangeVariables_VariantToString($Variant, $sExtended='')
	Switch VarGetType($Variant)
		Case "Array"
			Return SetError(0, 1, __ExchangeVariables_ArrayToString($Variant))
		Case "Int32"
			Return SetError(0, 2, String($Variant))
		Case "Int64"
			Return SetError(0, 3, String($Variant))
		Case "Double"
			Return SetError(0, 4, String($Variant))
		Case "String"
			Return SetError(0, 5, String($Variant))
		Case "Binary"
			Return SetError(0, 6, String($Variant))
		Case "Ptr"
			Return SetError(0, 7, String($Variant))
		Case "DLLStruct"
			Return SetError(0, 8, String(@AutoItPID & "|" & DllStructGetPtr($Variant) & "|" & $sExtended))
		Case "Object"
			Return SetError(0, 9, String(ObjName($Variant)))
		Case "Bool"
			Return SetError(0, 10, String($Variant))
		Case "Keyword"
			Return SetError(0, 11, String($Variant))
		Case Else
			Return SetError(0, 0, String($Variant))
	EndSwitch
EndFunc   ;==>__ExchangeVariables_VariantToString


Func __ExchangeVariables_ArrayToString($aArray)
	Local $sVariant, $sType
	Local $sDelim = Chr(1) & '|' & Chr(1)
	Local $sReturn = ""
	Local $aDim[9] = [UBound($aArray, 0), UBound($aArray, 1), UBound($aArray, 2), UBound($aArray, 3), UBound($aArray, 4), UBound($aArray, 5), UBound($aArray, 6), UBound($aArray, 7), UBound($aArray, 8)]
	For $i = 0 To 8
		$sReturn &= $aDim[$i] & $sDelim
	Next
	Switch $aDim[0]
		Case 0 ; Kein Array
			Return SetError(1, 0, $sReturn)
		Case 1 ; 1D
			For $1 = 0 To $aDim[1] - 1
				$sVariant = __ExchangeVariables_VariantToString($aArray[$1])
				$sType = StringFormat('%02s', @extended)
				$sReturn &= $sType & $sVariant & $sDelim
			Next
		Case 2
			For $1 = 0 To $aDim[1] - 1
				For $2 = 0 To $aDim[2] - 1
					$sVariant = __ExchangeVariables_VariantToString($aArray[$1][$2])
					$sType = StringFormat('%02s', @extended)
					$sReturn &= $sType & $sVariant & $sDelim
				Next
			Next
		Case 3
			For $1 = 0 To $aDim[1] - 1
				For $2 = 0 To $aDim[2] - 1
					For $3 = 0 To $aDim[3] - 1
						$sVariant = __ExchangeVariables_VariantToString($aArray[$1][$2][$3])
						$sType = StringFormat('%02s', @extended)
						$sReturn &= $sType & $sVariant & $sDelim
					Next
				Next
			Next
		Case 4
			For $1 = 0 To $aDim[1] - 1
				For $2 = 0 To $aDim[2] - 1
					For $3 = 0 To $aDim[3] - 1
						For $4 = 0 To $aDim[4] - 1
							$sVariant = __ExchangeVariables_VariantToString($aArray[$1][$2][$3][$4])
							$sType = StringFormat('%02s', @extended)
							$sReturn &= $sType & $sVariant & $sDelim
						Next
					Next
				Next
			Next
		Case 5
			For $1 = 0 To $aDim[1] - 1
				For $2 = 0 To $aDim[2] - 1
					For $3 = 0 To $aDim[3] - 1
						For $4 = 0 To $aDim[4] - 1
							For $5 = 0 To $aDim[5] - 1
								$sVariant = __ExchangeVariables_VariantToString($aArray[$1][$2][$3][$4][$5])
								$sType = StringFormat('%02s', @extended)
								$sReturn &= $sType & $sVariant & $sDelim
							Next
						Next
					Next
				Next
			Next
		Case 6
			For $1 = 0 To $aDim[1] - 1
				For $2 = 0 To $aDim[2] - 1
					For $3 = 0 To $aDim[3] - 1
						For $4 = 0 To $aDim[4] - 1
							For $5 = 0 To $aDim[5] - 1
								For $6 = 0 To $aDim[6] - 1
									$sVariant = __ExchangeVariables_VariantToString($aArray[$1][$2][$3][$4][$5][$6])
									$sType = StringFormat('%02s', @extended)
									$sReturn &= $sType & $sVariant & $sDelim
								Next
							Next
						Next
					Next
				Next
			Next
		Case 7
			For $1 = 0 To $aDim[1] - 1
				For $2 = 0 To $aDim[2] - 1
					For $3 = 0 To $aDim[3] - 1
						For $4 = 0 To $aDim[4] - 1
							For $5 = 0 To $aDim[5] - 1
								For $6 = 0 To $aDim[6] - 1
									For $7 = 0 To $aDim[7] - 1
										$sVariant = __ExchangeVariables_VariantToString($aArray[$1][$2][$3][$4][$5][$6][$7])
										$sType = StringFormat('%02s', @extended)
										$sReturn &= $sType & $sVariant & $sDelim
									Next
								Next
							Next
						Next
					Next
				Next
			Next
		Case 8
			For $1 = 0 To $aDim[1] - 1
				For $2 = 0 To $aDim[2] - 1
					For $3 = 0 To $aDim[3] - 1
						For $4 = 0 To $aDim[4] - 1
							For $5 = 0 To $aDim[5] - 1
								For $6 = 0 To $aDim[6] - 1
									For $7 = 0 To $aDim[7] - 1
										For $8 = 0 To $aDim[8] - 1
											$sVariant = __ExchangeVariables_VariantToString($aArray[$1][$2][$3][$4][$5][$6][$7][$8])
											$sType = StringFormat('%02s', @extended)
											$sReturn &= $sType & $sVariant & $sDelim
										Next
									Next
								Next
							Next
						Next
					Next
				Next
			Next
		Case Else
			Return SetError(2, 0, $sReturn)
	EndSwitch
	Return StringTrimRight($sReturn, 1)
EndFunc   ;==>__ExchangeVariables_ArrayToString


Func __ExchangeVariables_StringToArray($sString)
	Local $aSplit = StringSplit($sString, Chr(1) & '|' & Chr(1), 1)
	If @error Or Not IsArray($aSplit) Or Not $aSplit[0] Then Return SetError(1, 0, 0)
	Local $aDim[9], $iCnt = 10
	For $i = 0 To 8
		$aDim[$i] = Int($aSplit[$i + 1]) - 1
	Next
	Switch $aDim[0] + 1
		Case 1
			Local $aReturn[$aDim[1] + 1]
			For $1 = 0 To $aDim[1]
				$aReturn[$1] = __ExchangeVariables_StringToVariant(StringTrimLeft($aSplit[$1 + 10], 2), StringLeft($aSplit[$1 + 10], 2))
			Next
			Return $aReturn
		Case 2
			Local $aReturn[$aDim[1] + 1][$aDim[2] + 1]
			For $1 = 0 To $aDim[1]
				For $2 = 0 To $aDim[2]
					$aReturn[$1][$2] = __ExchangeVariables_StringToVariant(StringTrimLeft($aSplit[$iCnt], 2), StringLeft($aSplit[$iCnt], 2))
					$iCnt += 1
				Next
			Next
			Return $aReturn
		Case 3
			Local $aReturn[$aDim[1] + 1][$aDim[2] + 1][$aDim[3] + 1]
			For $1 = 0 To $aDim[1]
				For $2 = 0 To $aDim[2]
					For $3 = 0 To $aDim[3]
						$aReturn[$1][$2][$3] = __ExchangeVariables_StringToVariant(StringTrimLeft($aSplit[$iCnt], 2), StringLeft($aSplit[$iCnt], 2))
						$iCnt += 1
					Next
				Next
			Next
			Return $aReturn
		Case 4
			Local $aReturn[$aDim[1] + 1][$aDim[2] + 1][$aDim[3] + 1][$aDim[4] + 1]
			For $1 = 0 To $aDim[1]
				For $2 = 0 To $aDim[2]
					For $3 = 0 To $aDim[3]
						For $4 = 0 To $aDim[4]
							$aReturn[$1][$2][$3][$4] = __ExchangeVariables_StringToVariant(StringTrimLeft($aSplit[$iCnt], 2), StringLeft($aSplit[$iCnt], 2))
							$iCnt += 1
						Next
					Next
				Next
			Next
			Return $aReturn
		Case 5
			Local $aReturn[$aDim[1] + 1][$aDim[2] + 1][$aDim[3] + 1][$aDim[4] + 1][$aDim[5] + 1]
			For $1 = 0 To $aDim[1]
				For $2 = 0 To $aDim[2]
					For $3 = 0 To $aDim[3]
						For $4 = 0 To $aDim[4]
							For $5 = 0 To $aDim[5]
								$aReturn[$1][$2][$3][$4][$5] = __ExchangeVariables_StringToVariant(StringTrimLeft($aSplit[$iCnt], 2), StringLeft($aSplit[$iCnt], 2))
								$iCnt += 1
							Next
						Next
					Next
				Next
			Next
			Return $aReturn
		Case 6
			Local $aReturn[$aDim[1] + 1][$aDim[2] + 1][$aDim[3] + 1][$aDim[4] + 1][$aDim[5] + 1][$aDim[6] + 1]
			For $1 = 0 To $aDim[1]
				For $2 = 0 To $aDim[2]
					For $3 = 0 To $aDim[3]
						For $4 = 0 To $aDim[4]
							For $5 = 0 To $aDim[5]
								For $6 = 0 To $aDim[6]
									$aReturn[$1][$2][$3][$4][$5][$6] = __ExchangeVariables_StringToVariant(StringTrimLeft($aSplit[$iCnt], 2), StringLeft($aSplit[$iCnt], 2))
									$iCnt += 1
								Next
							Next
						Next
					Next
				Next
			Next
			Return $aReturn
		Case 7
			Local $aReturn[$aDim[1] + 1][$aDim[2] + 1][$aDim[3] + 1][$aDim[4] + 1][$aDim[5] + 1][$aDim[6] + 1][$aDim[7] + 1]
			For $1 = 0 To $aDim[1]
				For $2 = 0 To $aDim[2]
					For $3 = 0 To $aDim[3]
						For $4 = 0 To $aDim[4]
							For $5 = 0 To $aDim[5]
								For $6 = 0 To $aDim[6]
									For $7 = 0 To $aDim[7]
										$aReturn[$1][$2][$3][$4][$5][$6][$7] = __ExchangeVariables_StringToVariant(StringTrimLeft($aSplit[$iCnt], 2), StringLeft($aSplit[$iCnt], 2))
										$iCnt += 1
									Next
								Next
							Next
						Next
					Next
				Next
			Next
			Return $aReturn
		Case 8
			Local $aReturn[$aDim[1] + 1][$aDim[2] + 1][$aDim[3] + 1][$aDim[4] + 1][$aDim[5] + 1][$aDim[6] + 1][$aDim[7] + 1][$aDim[8] + 1]
			For $1 = 0 To $aDim[1]
				For $2 = 0 To $aDim[2]
					For $3 = 0 To $aDim[3]
						For $4 = 0 To $aDim[4]
							For $5 = 0 To $aDim[5]
								For $6 = 0 To $aDim[6]
									For $7 = 0 To $aDim[7]
										For $8 = 0 To $aDim[8]
											$aReturn[$1][$2][$3][$4][$5][$6][$7][$8] = __ExchangeVariables_StringToVariant(StringTrimLeft($aSplit[$iCnt], 2), StringLeft($aSplit[$iCnt], 2))
											$iCnt += 1
										Next
									Next
								Next
							Next
						Next
					Next
				Next
			Next
			Return $aReturn
		Case Else
			Return SetError(2, 0, 0)
	EndSwitch
EndFunc   ;==>__ExchangeVariables_StringToArray
; ===============================================================================================================================