Reg2Array, Array2Reg u.a.

  • Für ein Projekt benötigte ich einige Registry-Funktionen.

    _Reg2Array()
    _Array2Reg()
    _RegRecursiveCount()
    _RegExists()
    _RegCopy()

    Verbesserungen (gerade die Geschwindigkeit bei einer großen Anzahl von Schlüsseln lässt noch zu wünschen) sind natürlich immer willkommen....

    Edit: _Reg2Array() V1.1 - Switch Idee von AspirinJunkie übernommen

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; Registrypfad kopieren
    ; If _RegCopy("HKCU\Printers", "HKCU\PrinterTemp") Then
    ; Msgbox(0,"Erfolg", "Kopieren des Registrypfades war erfolgreich !")
    ; Else
    ; Msgbox(48,"Fehler", "Kopieren des Registrypfades war fehlerhaft !")
    ; EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Schlüssel und Werte zählen
    ; $Reg = "HKCU\Printers"
    ; Msgbox(0,"","Die Registry enthält unter '" & $Reg & "' " & _RegRecursiveGetCount($Reg) & " Schlüssel und Werte !")

    [/autoit] [autoit][/autoit] [autoit]

    ; Schlüssel und Werte rekursiv in ein Array lesen und anzeigen
    ;$aResult = _Reg2Array("HKCU\Printers")
    ;_ArrayDisplay($aResult)

    [/autoit] [autoit][/autoit] [autoit]

    ; Schlüssel und Werte rekursiv in einen neuen Schlüssel schreiben und
    ; eine Rückmeldung ausgeben
    ; If _Array2Reg($aResult, "HKCU\Temp") Then
    ; Msgbox(0,"Erfolg", "Einfügen des Array's in die Registry war erfolgreich !")
    ; Else
    ; Msgbox(48,"Fehler", "Fehler beim Einfügen in die Registry !")
    ; EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Name _Reg2Array($sRegKey, $RegSubKey)
    ; Version V1.1
    ; Description Create an Array of all registry keys and sub-keys
    ; Parameter(s) $sRegKey - Startkey to enumerate including any sub-keys
    ; $sRegSubKey - SubKey for recursive recall
    ; Return Value(s) On Success - Returns an array with Startkeyname, Subkeyname,
    ; Valuename, Valuetype and Value
    ; On Failure -
    ; Author(s) [email='Micha_he@autoit.de'][/email]
    ; Help/ThanksTo [email='KaFu@autoitscript.com'][/email]
    ; [email='AspirinJunkie@autoit.de'][/email]
    ; Last modified 2010-07-13
    ;===============================================================================
    Func _Reg2Array($sRegKey, $sRegSubKey = "")
    Local Const $aTypes[12] = ["REG_NONE", "REG_SZ", "REG_EXPAND_SZ", "REG_BINARY", "REG_DWORD", "REG_DWORD_BIG_ENDIAN", "REG_LINK", "REG_MULTI_SZ", "REG_RESOURCE_LIST", "REG_FULL_RESOURCE_DESCRIPTOR", "REG_RESOURCE_REQUIREMENTS_LIST", "REG_QWORD"]
    Local $aResult[2][5], $aResult_Sub, $i, $y, $x, $iLast
    Local $sRegKey_Name, $sRegKey_Value, $iValCount
    If StringRight($sRegKey,1) = "\" Then StringTrimRight($sRegKey, 1)
    If StringRight($sRegSubKey,1) = "\" Then StringTrimRight($sRegSubKey, 1)
    $aResult[0][0] = 0
    $aResult[1][0] = $sRegKey
    $aResult[1][1] = $sRegSubKey
    $iLast = UBound($aResult) - 1
    $iValCount = 1
    While 1
    RegEnumVal($sRegKey & "\" & $sRegSubKey, $iValCount)
    If @Error Then Exitloop
    $iValCount += 1
    Wend
    $iValCount -= 1
    ReDim $aResult[$iLast + $iValCount + 1][5]
    $i = 1
    While 1
    $sRegKey_Name = RegEnumVal($sRegKey & "\" & $sRegSubKey, $i)
    If @error Then ExitLoop
    $iLast += 1
    $aResult[$iLast][0] = $sRegKey
    $aResult[$iLast][1] = $sRegSubKey
    $aResult[$iLast][2] = $sRegKey_Name
    $sRegKey_Value = RegRead($sRegKey & "\" & $sRegSubKey, $sRegKey_Name)
    $aResult[$iLast][3] = $aTypes[@extended]
    If IsInt($sRegKey_Value) Then
    $aResult[$iLast][4] = Int($sRegKey_Value)
    Else
    $aResult[$iLast][4] = $sRegKey_Value
    EndIf
    $i += 1
    Wend
    $i = 1
    While 1
    $sRegKey_Name = RegEnumKey($sRegKey & "\" & $sRegSubKey, $i)
    If @error Then ExitLoop
    $aResult_Sub = _Reg2Array($sRegKey, $sRegSubKey & "\" & $sRegKey_Name)
    if UBound($aResult_Sub) > 1 Then
    ReDim $aResult[UBound($aResult) + UBound($aResult_Sub) - 1][5]
    For $y = 1 To UBound($aResult_Sub) - 1
    For $x = 0 To 4
    $aResult[$iLast + $y][$x] = $aResult_Sub[$y][$x]
    Next
    Next
    $iLast = UBound($aResult) - 1
    EndIf
    $i += 1
    Wend
    $aResult[0][0] = $iLast
    Return $aResult
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Name _Array2Reg($aData, $sRegKey)
    ; Version V1.0
    ; Description Import a array from function '_Reg2Array()' in the registry
    ; Format see function '_Reg2Array()'
    ; Parameter(s) $aData - Array with Startkeyname, Subkeyname,
    ; Valuename, Valuetype and Value
    ; $sRegKey - Registrykey to import. (optional)
    ; If is empty, the function use the originalkey
    ; Return Value(s) On Success - 1 (@error = 0)
    ; On Failure - 0
    ; - @error 1 = No Array Inputdata
    ; - @error 2 = Not enough Array-Elements
    ; - @error 3 = Error at RegWrite-Command
    ; Author(s) [email='Micha_he@autoit.de'][/email]
    ; Help/ThanksTo
    ; Last modified 2010-07-13
    ;===============================================================================
    Func _Array2Reg($aData, $sRegKey = "")
    Local $i, $iRet
    If Not IsArray($aData) Then Return SetError(1,0,0)
    If Ubound($aData) <= 1 Then Return SetError(2,0,0)
    If $sRegKey <> "" And StringRight($sRegKey, 1) = "\" Then StringTrimRight($sRegKey ,1)
    For $i = 1 To $aData[0][0]
    If $sRegKey = "" Then $sRegKey = $aData[$i][0]
    If $aData[$i][1] = "" And $aData[$i][2] = "" And $aData[$i][3] = "" And $aData[$i][4] = "" Then
    $iRet = RegWrite($sRegKey) ; ggf. noch prüfen und wenn vorhanden nicht neu schreiben
    Else
    If $aData[$i][2] = "" And $aData[$i][3] = "" And $aData[$i][4] = "" Then
    $iRet = RegWrite($sRegKey & "\" & $aData[$i][1])
    Else
    $iRet = RegWrite($sRegKey & "\" & $aData[$i][1], $aData[$i][2], $aData[$i][3], $aData[$i][4])
    EndIf
    EndIf
    If $iRet <> 1 Then Return SetError(3,0,0)
    Next
    Return SetError(0,0,1)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Name _RegRecursiveGetCount($sRegKey)
    ; Version V1.0
    ; Description Count Keys and values recursiv in the Registry
    ; Parameter(s) $sRegKey - Registrykey to start
    ; Return Value(s) On Success - Count
    ; On Failure - 0
    ; - @error 1 = key not found
    ; Author(s) [email='Micha_he@autoit.de'][/email]
    ; Help/ThanksTo
    ; Last modified 2010-07-13
    ;===============================================================================
    Func _RegRecursiveGetCount($sRegKey)
    Local $iCount = 1
    Local $i = 1
    If Not _RegExists($sRegKey) Then Return SetError(1,0,0)
    While 1
    RegEnumVal($sRegKey, $i)
    If @error Then ExitLoop
    $i += 1
    Wend
    $iCount += ($i - 1)
    $i = 1
    While 1
    $sSubKey = RegEnumKey($sRegKey, $i)
    If @error Then ExitLoop
    $i += 1
    $iSubCount = _RegRecursiveGetCount($sRegKey & "\" & $sSubKey)
    $iCount += $iSubCount
    Wend
    Return $iCount
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Name _RegExists($sRegKey, $sValue)
    ; Version V1.0
    ; Description Check if Registrykey or -value exists
    ; Parameter(s) $sRegKey - Registrykey to check
    ; $sValue - Value to check (optional)
    ; Return Value(s) On Success - 1
    ; On Failure - 0
    ; Author(s) [email='Micha_he@autoit.de'][/email]
    ; Help/ThanksTo
    ; Last modified 2010-07-11
    ;===============================================================================
    Func _RegExists($sRegKey, $sValue = "")
    RegRead ($sRegKey, $sValue)
    If @error = -1 And $sValue = "" Then Return SetError(0,0,1)
    If @error = 0 And $sValue <> "" Then Return SetError(0,0,1)
    Return SetError(1,0,0)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Name _RegCopy($sSource, $sDest)
    ; Version V1.0
    ; Description Copy a Registrytree
    ; Parameter(s) $sSource - Source copy from
    ; $sDest - Destination copy to
    ; Return Value(s) On Success - 1
    ; On Failure - 0
    ; - @error 1 = Sourcekey not found
    ; - @error 2 = No Sourcedata
    ; - @error 3 = Copy to destination failed
    ; Author(s) [email='Micha_he@autoit.de'][/email]
    ; Help/ThanksTo
    ; Last modified 2010-07-13
    ;===============================================================================
    Func _RegCopy($sSource, $sDest)
    Local $aResult
    If Not _RegExists($sRegKey) Then Return SetError(1,0,0)
    $aResult = _Reg2Array($sSource)
    If IsArray($aResult) Then
    $iRet = _Array2Reg($aResult, $sDest)
    If $iRet = 1 Then
    Return SetError(0,0,1)
    Else
    Return SetError(3,0,0)
    EndIf
    Else
    Return SetError(2,0,0)
    EndIf
    EndFunc

    [/autoit]

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    2 Mal editiert, zuletzt von Micha_he (14. Juli 2010 um 18:24)

  • Zitat

    Verbesserungen (gerade die Geschwindigkeit bei einer großen Anzahl von Schlüsseln lässt noch zu wünschen) sind natürlich immer willkommen....


    Das Potential für Verbesserungen liegt vor allem in der Vermeidung von ReDim da dort das Array im schlimmsten Fall jedesmal komplett umkopiert werden muss.
    Zwar hast du schon probiert dieses Problem einzudämmen in dem du blockweise ReDims durchführst aber dennoch könnte man sich mal nach alternativen Datenstrukturen umsehen welche dieses Problem beim Hinzufügen von Werten nicht haben.
    Ich hab mal ein Beispiel gebaut welche für diesen Zweck als Beispiel eine Queue aus dem .Net-Framework verwendet:

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ; Name Reg2Array($sSK)
    ; Description Create an Array of all registry keys and sub-keys
    ; Parameter(s) $sSK - Startkey to enumerate including any sub-keys
    ; $sRegSubKey - SubKey for recursive recall
    ; Return Value(s) On Success - Returns an array with Startkeyname, Subkeyname,
    ; Valuename, Valuetype and Value
    ; On Failure - returns -1 and sets @error
    ; Author(s) AspirinJunkie
    ; Last modified 2010-07-14
    ;===============================================================================
    Func Reg2Array($sSK)
    Local Const $aTypes[12] = ["REG_NONE", "REG_SZ", "REG_EXPAND_SZ", "REG_BINARY", "REG_DWORD", "REG_DWORD_BIG_ENDIAN", "REG_LINK", "REG_MULTI_SZ", "REG_RESOURCE_LIST", "REG_FULL_RESOURCE_DESCRIPTOR", "REG_RESOURCE_REQUIREMENTS_LIST", "REG_QWORD"]
    Local $iC, $sTmp, $aTmp[4], $sVal
    If StringRight($sSK, 1) = '\' Then $sSK = StringTrimRight($sSK, 1)

    [/autoit] [autoit][/autoit] [autoit]

    Local $cSub = ObjCreate("Scripting.Dictionary") ;Wird die SubKeys beinhalten welche nacheinander abgearbeiten werden
    If @error Then Return SetError(1, 1, -1)
    Local $cRetQu = ObjCreate("System.Collections.Queue") ;Wird die Values temporär enthalten welche dann als Array ausgegeben werden
    If @error Then Return SetError(1, 2, -1)

    [/autoit] [autoit][/autoit] [autoit]

    $cSub.add($sSK, 0) ;Füge Startverzeichnis der Verzeichnisliste hinzu
    While $cSub.Count > 0
    For $sSubKey In $cSub.Keys()
    $cSub.Remove($sSubKey) ;Lösche nun verwendeten KeyName aus der Liste
    $aTmp[0] = $sSubKey
    $aTmp[1] = ""
    $aTmp[2] = ""
    $aTmp[3] = ""
    $cRetQu.Enqueue($aTmp)
    ;---- Subkeys finden und der Verzeichnisliste hinzufügen ----
    $iC = 1
    Do
    $sTmp = RegEnumKey($sSubKey, $iC)
    If @error Then ExitLoop
    $cSub.add($sSubKey & '\' & $sTmp, 0)
    $iC += 1
    Until 0
    ;---- Values des derzeitigen Keys auslesen und hinzufügen ----
    $iC = 1
    Do
    $sTmp = RegEnumVal($sSubKey, $iC)
    If @error Then ExitLoop
    $sVal = RegRead($sSubKey, $sTmp)
    If @error <> 0 And @error <> -2 Then ExitLoop
    If $sTmp = "" Then $sTmp = "@" ;Bei Default-Value als Valuenamen @ vergeben
    $aTmp[2] = $aTypes[@extended]
    $aTmp[0] = $sSubKey
    $aTmp[1] = $sTmp
    $aTmp[3] = $sVal
    $cRetQu.Enqueue($aTmp)
    $iC += 1
    Until 0
    Next
    WEnd
    ; ----- Umwandlung der Queue in ein Array -------
    If $cRetQu.Count > 0 Then
    Local $aRet[$cRetQu.Count + 1][4]
    $aRet[0][0] = $cRetQu.Count
    For $i = 1 To $cRetQu.Count
    $aTmp = $cRetQu.Dequeue()
    $aRet[$i][0] = $aTmp[0]
    $aRet[$i][1] = $aTmp[1]
    $aRet[$i][2] = $aTmp[2]
    $aRet[$i][3] = $aTmp[3]
    Next
    Return $aRet
    Else
    Local $Ret[1][4] = [[-1,-1,-1,-1]]
    Return $Ret
    EndIf
    EndFunc

    [/autoit]


    Auch wirst du ein Dictionary finden welches ich dafür missbrauche statt rekursiv die Subkeys iterativ zu durchlaufen.
    Dies hier mal lediglich als Beispiel dafür das es nicht immer Rekursion braucht welche vor allem bei großen Rekursionsstufen Nachteile offenbaren.
    Dann noch ein Beispiel wie du die 24-zeilige Switch-Anweisung auf 2 Zeilen schrumpfen kannst ohne Performance zu verlieren.
    Hoffe es bringt dir ein paar Anregungen.

    Edit: Das selbe Prinzip - nur diesmal mit einer Rekursion:

    Spoiler anzeigen
    [autoit]

    Func Reg2Array($sSK, Const $bS = True)
    Local Static $aTypes[12] = ["REG_NONE", "REG_SZ", "REG_EXPAND_SZ", "REG_BINARY", "REG_DWORD", "REG_DWORD_BIG_ENDIAN", "REG_LINK", "REG_MULTI_SZ", "REG_RESOURCE_LIST", "REG_FULL_RESOURCE_DESCRIPTOR", "REG_RESOURCE_REQUIREMENTS_LIST", "REG_QWORD"]
    Local $iC, $sTmp, $aTmp[4], $sVal

    [/autoit] [autoit][/autoit] [autoit]

    Local Static $cRetQu = ObjCreate("System.Collections.Queue") ;Wird die Values temporär enthalten welche dann als Array ausgegeben werden
    If @error Then Return SetError(1, 1, -1)
    If $bS Then
    $cRetQu.Clear()
    If StringRight($sSK, 1) = '\' Then $sSK = StringTrimRight($sSK, 1)
    EndIf
    $aTmp[0] = $sSK
    $aTmp[1] = ""
    $aTmp[2] = ""
    $aTmp[3] = ""
    $cRetQu.Enqueue($aTmp)
    ;---- Values des derzeitigen Keys auslesen und hinzufügen ----
    $iC = 1
    Do
    $sTmp = RegEnumVal($sSK, $iC)
    If @error Then ExitLoop
    $sVal = RegRead($sSK, $sTmp)
    If @error <> 0 And @error <> -2 Then ExitLoop
    If $sTmp = "" Then $sTmp = "@" ;Bei Default-Value als Valuenamen @ vergeben
    $aTmp[2] = $aTypes[@extended]
    $aTmp[0] = $sSK
    $aTmp[1] = $sTmp
    $aTmp[3] = $sVal
    $cRetQu.Enqueue($aTmp)
    $iC += 1
    Until 0
    ;---- Subkeys finden, der Liste hinzufügen und abarbeiten----
    $iC = 1
    Do
    $sTmp = RegEnumKey($sSK, $iC)
    If @error Then ExitLoop
    Reg2Array2($sSK & '\' & $sTmp, 0)
    $iC += 1
    Until 0
    ; ----- Umwandlung der Queue in ein Array -------
    If $bS Then
    If $cRetQu.Count > 0 Then
    Local $aRet[$cRetQu.Count + 1][4]
    $aRet[0][0] = $cRetQu.Count
    For $i = 1 To $cRetQu.Count
    $aTmp = $cRetQu.Dequeue()
    $aRet[$i][0] = $aTmp[0]
    $aRet[$i][1] = $aTmp[1]
    $aRet[$i][2] = $aTmp[2]
    $aRet[$i][3] = $aTmp[3]
    Next
    $cRetQu.Clear()
    Return $aRet
    Else
    Local $Ret[1][4] = [[-1, -1, -1, -1]]
    Return $Ret
    EndIf
    EndIf
    EndFunc

    [/autoit]

    Edit2: Das iterative Verhalten der 1. Funktion kann man statt mit dem Dictionary auch über einen String realisieren - wird dann allerdings unübersichtlicher:

    Spoiler anzeigen
    [autoit]

    Func Reg2Array($sSK)
    Local Const $aTypes[12] = ["REG_NONE", "REG_SZ", "REG_EXPAND_SZ", "REG_BINARY", "REG_DWORD", "REG_DWORD_BIG_ENDIAN", "REG_LINK", "REG_MULTI_SZ", "REG_RESOURCE_LIST", "REG_FULL_RESOURCE_DESCRIPTOR", "REG_RESOURCE_REQUIREMENTS_LIST", "REG_QWORD"]
    Local $iC, $sTmp, $aTmp[4], $sVal
    If StringRight($sSK, 1) = '\' Then $sSK = StringTrimRight($sSK, 1)
    Local $sSubK = '|' & $sSK ;Verzeichnisliste in Stringform welche dann nacheinander abgearbeitet wird
    Local $cRetQu = ObjCreate("System.Collections.Queue") ;Wird die Values temporär enthalten welche dann als Array ausgegeben werden
    If @error Then Return SetError(1, 1, -1)
    Do
    ;------ arbeite die Verzeichnisse welche in $sSubK gelistet sind ab ---
    $iC = StringInStr($sSubK, '|', 2, -1)
    If @error Or $iC = 0 Then ExitLoop
    $iC = StringLen($sSubK) - $iC
    $sSubKey = StringRight($sSubK, $iC)
    $sSubK = StringTrimRight($sSubK, $iC + 1)

    [/autoit] [autoit][/autoit] [autoit]

    $aTmp[0] = $sSubKey
    $aTmp[1] = ""
    $aTmp[2] = ""
    $aTmp[3] = ""
    $cRetQu.Enqueue($aTmp)
    ;---- Subkeys finden und der Verzeichnisliste hinzufügen ----
    $iC = 1
    Do
    $sTmp = RegEnumKey($sSubKey, $iC)
    If @error Then ExitLoop
    $sSubK &= '|' & $sSubKey & '\' & $sTmp
    $iC += 1
    Until 0
    ;---- Values des derzeitigen Keys auslesen und hinzufügen ----
    $iC = 1
    Do
    $sTmp = RegEnumVal($sSubKey, $iC)
    If @error Then ExitLoop
    $sVal = RegRead($sSubKey, $sTmp)
    If @error <> 0 And @error <> -2 Then ExitLoop
    If $sTmp = "" Then $sTmp = "@" ;Bei Default-Value als Valuenamen @ vergeben
    $aTmp[2] = $aTypes[@extended]
    $aTmp[0] = $sSubKey
    $aTmp[1] = $sTmp
    $aTmp[3] = $sVal
    $cRetQu.Enqueue($aTmp)
    $iC += 1
    Until 0
    Until 0
    ; ----- Umwandlung der Queue in ein Array -------
    If $cRetQu.Count > 0 Then
    Local $aRet[$cRetQu.Count + 1][4]
    $aRet[0][0] = $cRetQu.Count
    For $i = 1 To $cRetQu.Count
    $aTmp = $cRetQu.Dequeue()
    $aRet[$i][0] = $aTmp[0]
    $aRet[$i][1] = $aTmp[1]
    $aRet[$i][2] = $aTmp[2]
    $aRet[$i][3] = $aTmp[3]
    Next
    Return $aRet
    Else
    Local $Ret[1][4] = [[-1, -1, -1, -1]]
    Return $Ret
    EndIf
    EndFunc

    [/autoit]

    Edit3: Wenn du erste Methode um .Net-Objekte entschlacken willst und die Performance noch weiter erhöhen willst dann kann man z.B. für die SubKeys ebenfalls ein Dictionary verwenden:

    Spoiler anzeigen
    [autoit]

    Func Reg2Array($sSK)
    Local Const $aTypes[12] = ["REG_NONE", "REG_SZ", "REG_EXPAND_SZ", "REG_BINARY", "REG_DWORD", "REG_DWORD_BIG_ENDIAN", "REG_LINK", "REG_MULTI_SZ", "REG_RESOURCE_LIST", "REG_FULL_RESOURCE_DESCRIPTOR", "REG_RESOURCE_REQUIREMENTS_LIST", "REG_QWORD"]
    Local $iC, $sTmp, $aTmp[4], $sVal, $iZ = 0
    If StringRight($sSK, 1) = '\' Then $sSK = StringTrimRight($sSK, 1)

    [/autoit] [autoit][/autoit] [autoit]

    Local $cSub = ObjCreate("Scripting.Dictionary") ;Wird die SubKeys beinhalten welche nacheinander abgearbeiten werden
    If @error Then Return SetError(1, 1, -1)
    Local $cRet = ObjCreate("Scripting.Dictionary") ;Wird die Values temporär enthalten welche dann als Array ausgegeben werden
    If @error Then Return SetError(1, 2, -1)

    [/autoit] [autoit][/autoit] [autoit]

    $cSub.add($sSK, 0) ;Füge Startverzeichnis der Verzeichnisliste hinzu
    While $cSub.Count > 0
    For $sSubKey In $cSub.Keys()
    $cSub.Remove($sSubKey) ;Lösche nun verwendeten KeyName aus der Liste
    $aTmp[0] = $sSubKey
    $aTmp[1] = ""
    $aTmp[2] = ""
    $aTmp[3] = ""
    $cRet.add($iZ, $aTmp)
    $iZ += 1
    ;---- Subkeys finden und der Verzeichnisliste hinzufügen ----
    $iC = 1
    Do
    $sTmp = RegEnumKey($sSubKey, $iC)
    If @error Then ExitLoop
    $cSub.add($sSubKey & '\' & $sTmp, 0)
    $iC += 1
    Until 0
    ;---- Values des derzeitigen Keys auslesen und hinzufügen ----
    $iC = 1
    Do
    $sTmp = RegEnumVal($sSubKey, $iC)
    If @error Then ExitLoop
    $sVal = RegRead($sSubKey, $sTmp)
    If @error <> 0 And @error <> -2 Then ExitLoop
    If $sTmp = "" Then $sTmp = "@" ;Bei Default-Value als Valuenamen @ vergeben
    $aTmp[2] = $aTypes[@extended]
    $aTmp[0] = $sSubKey
    $aTmp[1] = $sTmp
    $aTmp[3] = $sVal
    $cRet.add($iZ, $aTmp)
    $iZ += 1
    $iC += 1
    Until 0
    Next
    WEnd
    ; ----- Umwandlung des Dictionarys in ein Array -------
    If $cRet.Count > 0 Then
    Local $aRet[$iZ+1][4] = [[$iZ]]
    $iC = 1
    For $i in $cRet.Items()
    $aRet[$iC][0] = $i[0]
    $aRet[$iC][1] = $i[1]
    $aRet[$iC][2] = $i[2]
    $aRet[$iC][3] = $i[3]
    $iC += 1
    Next
    Return $aRet
    Else
    Local $Ret[1][4] = [[-1,-1,-1,-1]]
    Return $Ret
    EndIf
    EndFunc

    [/autoit]

    3 Mal editiert, zuletzt von AspirinJunkie (14. Juli 2010 um 23:52)

  • AspirinJunkie: Die Idee statt dem "Switch" war gut. Den Rest muss ich mir einmal zu Gemüte führen, wenn es nicht so warm ist. Ich glaube das Denken geht bei 33°C auch nicht mehr so fix ;)

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"