- Сообщения
- 5,379
- Репутация
- 2,724
#Include <Array.au3>
#Include <Constants.au3>
#Include <WinAPIEx.au3>
;~Global Const $REG_BINARY = 3
;~Global Const $REG_DWORD = 4
;~Global Const $REG_DWORD_BIG_ENDIAN = 5
;~Global Const $REG_DWORD_LITTLE_ENDIAN = 4
;~Global Const $REG_EXPAND_SZ = 2
;~Global Const $REG_LINK = 6
;~Global Const $REG_MULTI_SZ = 7
;~Global Const $REG_NONE = 0
Global Const $REG_QWORD = 11
;~Global Const $REG_QWORD_LITTLE_ENDIAN = 11
;~Global Const $REG_SZ = 1
Global $hKey, $Hive
$hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall')
_RegEnumValues($hKey, $Hive)
_WinAPI_RegCloseKey($hKey)
$Hive = StringSplit($Hive, ChrW(160))
_ArrayDisplay($Hive)
Func _RegEnumValues($hRoot, ByRef $sData, $iLevel = -1, $iLenght = 0, $iParam = 0, $sParam = 0)
If (($iLevel > -1) And ($iParam > $iLevel)) Or (($iLenght) And (StringLen($sData) > $iLenght)) Then
Return SetError(1, -1, 0)
EndIf
If Not $iParam Then
$sData = ''
EndIf
$iParam += 1
Local $hKey, $sKey, $aKey, $sVal, $aText, $sText, $Quotes, $Size, $Struct, $Type, $Sep = ChrW(160), $Error = 0
Local $tData = DllStructCreate('byte[1048576]')
Local $pData = DllStructGetPtr($tData)
If $sParam Then
$sData &= $sParam & '\' & $Sep
EndIf
$aKey = _WinAPI_RegQueryInfoKey($hRoot)
If @error Then
Return SetError(1, @extended, 0)
EndIf
For $i = 0 To $aKey[2] - 1
$sVal = _WinAPI_RegEnumValue($hRoot, $i)
If @error Then
Return SetError(1, @extended, 0)
EndIf
$Size = _WinAPI_RegQueryValue($hRoot, $sVal, $tData)
If @error Then
Return SetError(1, @extended, 0)
EndIf
$Type = @extended
If Not $sVal Then
$sVal = '@'
EndIf
If Not $Size Then
$sText = ''
Else
Switch $Type
Case $REG_MULTI_SZ
$sText = ''
$aText = _WinAPI_StructToArray($pData)
If @error Then
Return SetError(1, -1, 0)
EndIf
For $j = 1 To $aText[0] - 1
$sText &= $aText[$j] & @LF
Next
If $aText[0] Then
$sText &= $aText[$aText[0]]
EndIf
$Quotes = 1
Case Else
$Quotes = 0
Switch $Type
Case $REG_DWORD, $REG_DWORD_BIG_ENDIAN
$Struct = 'dword'
Case $REG_QWORD
$Struct = 'uint64'
Case $REG_SZ, $REG_EXPAND_SZ
$Struct = 'wchar[' & $Size & ']'
$Quotes = 1
Case Else
$Struct = 'byte[' & $Size & ']'
EndSwitch
$sText = DllStructGetData(DllStructCreate($Struct, $pData), 1)
If $Quotes Then
$sText = '"' & $sText & '"'
EndIf
EndSwitch
EndIf
If $sParam Then
$sData &= $sParam & '\\'
EndIf
$sData &= $sVal & '=(' & $Type & ')' & $sText & $Sep
Next
For $i = 0 To $aKey[0] - 1
$sKey = _WinAPI_RegEnumKey($hRoot, $i)
If @error Then
Return SetError(1, @extended, 0)
EndIf
$hKey = _WinAPI_RegOpenKey($hRoot, $sKey, $KEY_READ)
If @error Then
Return SetError(1, @extended, 0)
EndIf
If $sParam Then
_RegEnumValues($hKey, $sData, $iLevel, $iLenght, $iParam, $sParam & '\' & $sKey)
Else
_RegEnumValues($hKey, $sData, $iLevel, $iLenght, $iParam, $sKey)
EndIf
If @error Then
$Error = @extended
If Not $Error Then
$Error = -1
EndIf
EndIf
_WinAPI_RegCloseKey($hKey)
If $Error Then
ExitLoop
EndIf
Next
If $iParam = 1 Then
If Not $Error Then
$sData = StringRegExpReplace($sData, $Sep & '*\Z', '')
Else
$sData = ''
EndIf
EndIf
Return SetError($Error <> 0, $Error, $Error = 0)
EndFunc ;==>_RegEnumValues
>"C:\Program Files\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Новая папка (6)\test13.au3"
C:\????? ????? (6)\test13.au3 (22) : ==> Variable used without being declared.:
$hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall')
$hKey = _WinAPI_RegOpenKey(^ ERROR
>Exit code: 1 Time: 0.414
#include <APIRegConstants.au3>
#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIDiag.au3>
#include <WinAPIReg.au3>
Local $hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', $KEY_READ)
If @error Then
MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), @extended, _WinAPI_GetErrorMessage(@extended))
Exit
EndIf
Local $Count = _WinAPI_RegQueryInfoKey($hKey)
Local $aKey[$Count[0]]
For $i = 0 To UBound($aKey) - 1
$aKey[$i] = _WinAPI_RegEnumKey($hKey, $i)
Next
_WinAPI_RegCloseKey($hKey)
_ArrayDisplay($aKey, '_WinAPI_RegEnumKey')
Собственно этого хочется_RegEnumValues() - создает список всех разделов со своими переменными, их значениями и всеми подразделами любой вложенности для указанного раздела реестра. Другими словами, создает структуру раздела реестра.
#Include <Array.au3>
#Include <Constants.au3>
#Include <WinAPIEx.au3>
Global $hKey, $Hive
$hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion')
_RegEnumValues($hKey, $Hive, -1,0,1)
_WinAPI_RegCloseKey($hKey)
$Hive = StringSplit($Hive, ChrW(160))
_ArrayDisplay($Hive)
Func _RegEnumValues($hRoot, ByRef $sData, $iLevel = -1, $iLenght = 0, $iParam = 0, $sParam = 0)
If (($iLevel > -1) And ($iParam > $iLevel)) Or (($iLenght) And (StringLen($sData) > $iLenght)) Then
Return SetError(1, -1, 0)
EndIf
If Not $iParam Then
$sData = ''
EndIf
$iParam += 1
Local $hKey, $sKey, $aKey, $sVal, $aText, $sText, $Quotes, $Size, $Struct, $Type, $Sep = ChrW(160), $Error = 0
Local $tData = DllStructCreate('byte[1048576]')
Local $pData = DllStructGetPtr($tData)
If $sParam Then
$sData &= $sParam & '\' & $Sep
EndIf
$aKey = _WinAPI_RegQueryInfoKey($hRoot)
If @error Then
Return SetError(1, @extended, 0)
EndIf
For $i = 0 To $aKey[2] - 1
$sVal = _WinAPI_RegEnumValue($hRoot, $i)
If @error Then
Return SetError(1, @extended, 0)
EndIf
$Size = _WinAPI_RegQueryValue($hRoot, $sVal, $tData)
If @error Then
Return SetError(1, @extended, 0)
EndIf
$Type = @extended
If Not $sVal Then
$sVal = '@'
EndIf
If Not $Size Then
$sText = ''
Else
Switch $Type
Case $REG_MULTI_SZ
$sText = ''
$aText = _WinAPI_StructToArray($pData)
If @error Then
Return SetError(1, -1, 0)
EndIf
For $j = 1 To $aText[0] - 1
$sText &= $aText[$j] & @LF
Next
If $aText[0] Then
$sText &= $aText[$aText[0]]
EndIf
$Quotes = 1
Case Else
$Quotes = 0
Switch $Type
Case $REG_DWORD, $REG_DWORD_BIG_ENDIAN
$Struct = 'dword'
Case $REG_QWORD
$Struct = 'uint64'
Case $REG_SZ, $REG_EXPAND_SZ
$Struct = 'wchar[' & $Size & ']'
$Quotes = 1
Case Else
$Struct = 'byte[' & $Size & ']'
EndSwitch
$sText = DllStructGetData(DllStructCreate($Struct, $pData), 1)
If $Quotes Then
$sText = '"' & $sText & '"'
EndIf
EndSwitch
EndIf
If $sParam Then
$sData &= $sParam & '\\'
EndIf
$sData &= $sVal & '=(' & $Type & ')' & $sText & $Sep
Next
For $i = 0 To $aKey[0] - 1
$sKey = _WinAPI_RegEnumKey($hRoot, $i)
If @error Then
Return SetError(1, @extended, 0)
EndIf
$hKey = _WinAPI_RegOpenKey($hRoot, $sKey, $KEY_READ)
If @error Then
Return SetError(1, @extended, 0)
EndIf
If $sParam Then
_RegEnumValues($hKey, $sData, $iLevel, $iLenght, $iParam, $sParam & '\' & $sKey)
Else
_RegEnumValues($hKey, $sData, $iLevel, $iLenght, $iParam, $sKey)
EndIf
If @error Then
$Error = @extended
If Not $Error Then
$Error = -1
EndIf
EndIf
_WinAPI_RegCloseKey($hKey)
Next
If $iParam = 1 Then
If Not $Error Then
$sData = StringRegExpReplace($sData, $Sep & '*\Z', '')
Else
$sData = ''
EndIf
EndIf
Return SetError($Error <> 0, $Error, $Error = 0)
EndFunc ;==>_RegEnumValues
#Include <Array.au3>
#Include <Constants.au3>
#Include <WinAPIEx.au3>
Global $hKey, $Hive
$hKey = _WinAPI_RegOpenKey($HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall')
_RegEnumValues($hKey, $Hive)
_WinAPI_RegCloseKey($hKey)
$Hive = StringSplit($Hive, ChrW(160))
_ArrayDisplay($Hive)
Func _RegEnumValues($hRoot, ByRef $sData, $iLevel = -1, $iLenght = 0, $iParam = 0, $sParam = 0)
If (($iLevel > -1) And ($iParam > $iLevel)) Or (($iLenght) And (StringLen($sData) > $iLenght)) Then
Return SetError(1, -1, 0)
EndIf
If Not $iParam Then
$sData = ''
EndIf
$iParam += 1
Local $hKey, $sKey, $aKey, $sVal, $aText, $sText, $Quotes, $Size, $Struct, $Type, $Sep = ChrW(160), $Error = 0
Local $tData = DllStructCreate('byte[1048576]')
Local $pData = DllStructGetPtr($tData)
If $sParam Then
$sData &= $sParam & '\' & $Sep
EndIf
$aKey = _WinAPI_RegQueryInfoKey($hRoot)
If @error Then
Return SetError(1, @extended, 0)
EndIf
For $i = 0 To $aKey[2] - 1
$sVal = _WinAPI_RegEnumValue($hRoot, $i)
If @error Then
Return SetError(1, @extended, 0)
EndIf
$Size = _WinAPI_RegQueryValue($hRoot, $sVal, $tData)
If @error Then
Return SetError(1, @extended, 0)
EndIf
$Type = @extended
If Not $sVal Then
$sVal = '@'
EndIf
If Not $Size Then
$sText = ''
Else
Switch $Type
Case $REG_MULTI_SZ
$sText = ''
$aText = _WinAPI_StructToArray($pData)
If @error Then ContinueLoop
For $j = 1 To $aText[0] - 1
$sText &= $aText[$j] & @LF
Next
If $aText[0] Then
$sText &= $aText[$aText[0]]
EndIf
$Quotes = 1
Case Else
$Quotes = 0
Switch $Type
Case $REG_DWORD, $REG_DWORD_BIG_ENDIAN
$Struct = 'dword'
Case $REG_QWORD
$Struct = 'uint64'
Case $REG_SZ, $REG_EXPAND_SZ
$Struct = 'wchar[' & $Size & ']'
$Quotes = 1
Case Else
$Struct = 'byte[' & $Size & ']'
EndSwitch
$sText = DllStructGetData(DllStructCreate($Struct, $pData), 1)
If $Quotes Then
$sText = '"' & $sText & '"'
EndIf
EndSwitch
EndIf
If $sParam Then
$sData &= $sParam & '\\'
EndIf
$sData &= $sVal & '=(' & $Type & ')' & $sText & $Sep
Next
For $i = 0 To $aKey[0] - 1
$sKey = _WinAPI_RegEnumKey($hRoot, $i)
If @error Then
Return SetError(1, @extended, 0)
EndIf
$hKey = _WinAPI_RegOpenKey($hRoot, $sKey, $KEY_READ)
If @error Then
Return SetError(1, @extended, 0)
EndIf
If $sParam Then
_RegEnumValues($hKey, $sData, $iLevel, $iLenght, $iParam, $sParam & '\' & $sKey)
Else
_RegEnumValues($hKey, $sData, $iLevel, $iLenght, $iParam, $sKey)
EndIf
If @error Then
$Error = @extended
If Not $Error Then
$Error = -1
EndIf
EndIf
_WinAPI_RegCloseKey($hKey)
If $Error Then
MsgBox(0,"",$Error)
ExitLoop
EndIf
Next
If $iParam = 1 Then
If Not $Error Then
$sData = StringRegExpReplace($sData, $Sep & '*\Z', '')
Else
$sData = ''
EndIf
EndIf
Return SetError($Error <> 0, $Error, $Error = 0)
EndFunc ;==>_RegEnumValues