Показать полную графическую версию : [решено] RegRead ( "keyname", REG_EXPAND_SZ "valuename" ) ?
Я уже проверил на своём скрипте, работает правильно! Благодарю!
эта штука рулит (http://www.autoitscript.com/forum/index.php?act=Search),
стоило нам подумать головой и сэкономили бы время )))
Хоть бы рассказал что там нашёл!? :)
Набрав RegRead выдало кучу релизов автоит. Полистав первый нашёл там строку
- Changed: RegRead() and RegWrite() no longer use hex strings for REG_BINARY types - native binary datatypes are enforced.
И что, не знаю хорошо это или плохо? :)
Или ты хочешь сказать что то что ты написал там подтвердилось? Я пока не уловил. Конечно хорошо что такой поиск есть гипотетически.
имею в виду, что именно через него нашел _RegRead()
как понял они помогли ?
просто, если залез бы туда в самом начале, то это был бы самый верный шаг )
_RegRead() - а я не нашёл... со знаком _ это ты про что?
и эта фраза мне тоже непонятна:
no longer use hex strings for REG_BINARY types - native binary datatypes are enforced.
что они там про типы говорят? как бы то нибыло у меня 3.3.0.0 итак версия...
" native binary datatypes are enforced. " что-то я это не заметил в RegRead() :) танцы с бубном это да!
Хотя нет, я не прав. Вот сейчас проверяю через MsgBox и RegRead читает всё вроде бы правильно,
другое дело не все типы имеют схожий синтакс с регфайлами, что и понятно. Значит для регфайлов
надо делать преобразования.
Вчера, меня одна идея осенила, но потом оказалось, что бред.
Я вдруг подумал, а что если считывать в переменную автоитом, а потом её именно подсунуть
в комманд строке утилите. Но а что толку если reg.exe не умеет ни счем работать кроме built-in своих ключей. Облом.
Хотя может сам CMD.exe если задействовать? :)
А сам regedit.exe /e вроде бы тоже целиком сейвит?
semiono, стоп, стоп.
я запутался.
чуть выше опубликовал ссылку (http://www.autoitscript.com/forum/index.php?showtopic=96124&hl=UNICODE) на офф форум, где есть разработка на альтернативные функции RegRead и RegWrite.
чем они лучше / хуже не знаю, поэтому и запостил - что бы проверить.
так вот, эти функции ты проверял / пробовал?
какой результат?
#include-once
#include <Constants.au3>
;; REG_* constants for value types are located in <Constants.au3>
;; except REG_QWORD which is defined below
Global Const $HKEY_CLASSES_ROOT = 0x80000000
Global Const $HKEY_CURRENT_USER = 0x80000001
Global Const $HKEY_LOCAL_MACHINE = 0x80000002
Global Const $HKEY_USERS = 0x80000003
Global Const $HKEY_PERFORMANCE_DATA = 0x80000004
Global Const $HKEY_PERFORMANCE_TEXT = 0x80000050
Global Const $HKEY_PERFORMANCE_NLSTEXT = 0x80000060
Global Const $HKEY_CURRENT_CONFIG = 0x80000005
Global Const $HKEY_DYN_DATA = 0x80000006
Global Const $KEY_QUERY_VALUE = 0x0001
Global Const $KEY_SET_VALUE = 0x0002
Global Const $KEY_WRITE = 0x20006
Global Const $REG_OPTION_NON_VOLATILE = 0x0000
Global Const $REG_OPTION_VOLATILE = 0x0001
Global Const $REG_QWORD = 11
Func _RegWrite($szKey, $szValue = "", $iType = -1, $bData = Default, $dwOptions = $REG_OPTION_NON_VOLATILE)
Local $hRoot = StringLeft($szKey, StringInStr($szKey, "\") - 1)
If $hRoot = "" Then $hRoot = $szKey ; passed a root key
Switch $hRoot
Case "HKEY_LOCAL_MACHINE", "HKLM"
$hRoot = $HKEY_LOCAL_MACHINE
Case "HKEY_USERS", "HKU"
$hRoot = $HKEY_USERS
Case "HKEY_CURRENT_USER", "HKCU"
$hRoot = $HKEY_CURRENT_USER
Case "HKEY_CLASSES_ROOT", "HKCR"
$hRoot = $HKEY_CLASSES_ROOT
Case "HKEY_CURRENT_CONFIG", "HKCC"
$hRoot = $HKEY_CURRENT_CONFIG
Case Else
Return SetError(1, 0, 0)
EndSwitch
Local $szSubkey = StringTrimLeft($szKey, StringInStr($szKey, "\"))
Local $ret = DllCall("advapi32.dll", "long", "RegCreateKeyExW", "ulong_ptr", $hRoot, "wstr", $szSubkey, "dword", 0, "ptr", 0, "dword", $dwOptions, _
"dword", $KEY_WRITE, "ptr", 0, "ulong_ptr*", 0, "ptr*", 0)
If $ret[0] <> 0 Then Return SetError(2, $ret[0], 0)
Local $hKey = $ret[8]
If $iType >= 0 And $bData <> Default Then
Switch $iType
Case $REG_SZ, $REG_EXPAND_SZ
$bData &= Chr(0) ; add terminating null
Local $lpData = DllStructCreate("wchar[" & StringLen($bData) & "]")
Case $REG_MULTI_SZ
$bData &= Chr(0) & Chr(0) ; add 2 terminating nulls
Local $lpData = DllStructCreate("wchar[" & StringLen($bData) & "]")
Case Else
Local $lpData = DllStructCreate("byte[" & BinaryLen($bData) & "]")
EndSwitch
DllStructSetData($lpData, 1, $bData)
$ret = DllCall("advapi32.dll", "long", "RegSetValueExW", "ulong_ptr", $hKey, "wstr", $szValue, "dword", 0, _
"dword", $iType, "ptr", DllStructGetPtr($lpData), "dword", DllStructGetSize($lpData))
EndIf
DllCall("advapi32.dll", "long", "RegCloseKey", "ulong_ptr", $hKey)
If $ret[0] <> 0 Then Return SetError(3, $ret[0], 0)
Return 1
EndFunc
Func _RegRead($szKey, $szValue)
Local $hRoot = StringLeft($szKey, StringInStr($szKey, "\") - 1)
If $hRoot = "" Then $hRoot = $szKey ; passed a root key
Switch $hRoot
Case "HKEY_LOCAL_MACHINE", "HKLM"
$hRoot = $HKEY_LOCAL_MACHINE
Case "HKEY_USERS", "HKU"
$hRoot = $HKEY_USERS
Case "HKEY_CURRENT_USER", "HKCU"
$hRoot = $HKEY_CURRENT_USER
Case "HKEY_CLASSES_ROOT", "HKCR"
$hRoot = $HKEY_CLASSES_ROOT
Case "HKEY_CURRENT_CONFIG", "HKCC"
$hRoot = $HKEY_CURRENT_CONFIG
Case Else
Return SetError(1, 0, 0)
EndSwitch
Local $szSubkey = StringTrimLeft($szKey, StringInStr($szKey, "\"))
Local $ret = DllCall("advapi32.dll", "long", "RegOpenKeyExW", "ulong_ptr", $hRoot, "wstr", $szSubkey, "dword", 0, "dword", $KEY_QUERY_VALUE, "ulong_ptr*", 0)
If $ret[0] <> 0 Then Return SetError(2, $ret[0], 0)
$hKey = $ret[5]
$ret = DllCall("advapi32.dll", "long", "RegQueryValueExW", "ulong_ptr", $hKey, "wstr", $szValue, "ptr", 0, _
"dword*", 0, "ptr", 0, "dword*", 0)
If $ret[0] <> 0 Then Return SetError(3, $ret[0], 0)
Local $iType = $ret[4], $iLen = $ret[6], $sType
Switch $iType ; set type of value
Case $REG_SZ, $REG_EXPAND_SZ, $REG_MULTI_SZ
$sType = "wchar"
; iLen is byte length, if unicode string divide by 2
; add 2 terminating nulls for possibly incorrectly stored strings
$iLen = ($iLen / 2) + 2
Case $REG_BINARY, $REG_NONE
$sType = "byte"
Case $REG_QWORD
$sType = "int64"
$iLen = $iLen / 8 ; int64 = 8 bytes
Case Else
$sType = "int"
$iLen = $iLen / 4 ; int = 4 bytes
EndSwitch
Local $lpData = DllStructCreate($sType & "[" & $iLen & "]")
$ret = DllCall("advapi32.dll", "long", "RegQueryValueExW", "ulong_ptr", $hKey, "wstr", $szValue, "ptr", 0, _
"dword*", 0, "ptr", DllStructGetPtr($lpData), "dword*", DllStructGetSize($lpData))
DllCall("advapi32.dll", "long", "RegCloseKey", "ulong_ptr", $hKey)
If $ret[0] <> 0 Then Return SetError(3, $ret[0], 0)
Return SetError(0, $iType, DllStructGetData($lpData, 1))
EndFunc
Func _TypeToString($iType)
Local $sType
Switch $iType
Case $REG_NONE
$sType = "REG_NONE"
Case $REG_SZ
$sType = "REG_SZ"
Case $REG_EXPAND_SZ
$sType = "REG_EXPAND_SZ"
Case $REG_BINARY
$sType = "REG_BINARY"
Case $REG_DWORD
$sType = "REG_DWORD"
Case $REG_DWORD_BIG_ENDIAN
$sType = "REG_DWORD_BIG_ENDIAN"
Case $REG_LINK
$sType = "REG_LINK"
Case $REG_MULTI_SZ
$sType = "REG_MULTI_SZ"
Case $REG_RESOURCE_LIST
$sType = "REG_RESOURCE_LIST"
Case $REG_FULL_RESOURCE_DESCRIPTOR
$sType = "REG_FULL_RESOURCE_DESCRIPTOR"
Case $REG_RESOURCE_REQUIREMENTS_LIST
$sType = "REG_RESOURCE_REQUIREMENTS_LIST"
Case $REG_QWORD
$sType = "REG_QWORD"
Case Else
$sType = ""
EndSwitch
Return $sType
EndFunc
1. сохранить код в файл RegEx.au3
2. скопировать файл RegEx.au3 в папку C:\Program Files\AutoIt3\Include\
3. в своем скрипте написать в самом верху #include <RegEx.au3>
4. при чтение данных из реестра использовать функцию: _RegRead(Ключ_реестра, название_значения), параметры те же
Я нашёл батник, может что полезное извлечь для автоит сгодиться?
http://forum.oszone.net/showthread.php?p=1147902
То как подключить инклюд мне знакомо, но надо проверить будет сами скрипты!
чуть выше опубликовал »
ух! это то что надо, там какраз про такие вещи пишут!
Не для нашей задачи это не пойдёт. Пишет так же по автоитовски,
между REG_SZ и REG_EXPAND_SZ различий не делает, что собсно и понятно,
ведь это только регфайлу нужно различие...
#include <RegEx.au3>
$var1 = _RegRead("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment","AutoIt3")
$var2 = _RegRead("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment","ComSpec")
$var3 = _RegRead("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Executive","AdditionalCriticalWorkerThreads")
$var4 = _RegRead("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Executive","PriorityQuantumMatrix")
$var5 = _RegRead("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\kernel","ObUnsecureGlobalNames")
MsgBox(4096, "REG_SZ", $var1 , 10)
MsgBox(4096, "REG_EXPAND_SZ", $var2 , 10)
MsgBox(4096, "REG_DWORD", $var3 , 10)
MsgBox(4096, "REG_BINARY", $var4 , 10)
MsgBox(4096, "REG_MULTISZ_SZ", $var5 , 10)
Наверное они там пропатчили некоторые особенности, типа empty-zero string всяких.
Но чтоб написать корректный регфайл, это только с твоей помощью можно с твоими парсингами строки.
:)
так.
Ключ реестра: HKEY_CURRENT_USER\Software\DashSignature\Knagalis
Тип ключа: REG_MULTISZ_SZ
Название величины: X
Значение величины: hex(2):56,00,4d,00,4b,00,4a,00,47,00,4e,00,44,00,49,00,44,00,4e,00,57,00,\
4c,00,44,00,4d,00,4b,00,4a,00,47,00,4e,00,44,00,49,00,44,00,4e,00,57,00,4c,\
00,44,00,00,00
все верно?
сейчас создал у себя этот ключ с этими параметрами.
и после чтения получил сразу: hex(2):56,00,4d,00,4b,00,4a,00,47,00,4e,00,44,00,49,00,44,00,4e,00,57,00,\4c,00,44,00,4d,00,4b,00,4a ,00,47,00,4e,00,44,00,49,00,44,00,4e,00,57,00,4c,\00,44,00,00,00
RegWrite('HKEY_CURRENT_USER\Software\DashSignature\Knagalis', 'x', 'REG_MULTI_SZ', 'hex(2):56,00,4d,00,4b,00,4a,00,47,00,4e,00,44,00,49,00,44,00,4e,00,57,00,\4c,00,44,00,4d,00,4b,00,4 a,00,47,00,4e,00,44,00,49,00,44,00,4e,00,57,00,4c,\00,44,00,00,00')
$var1 = RegRead('HKEY_CURRENT_USER\Software\DashSignature\Knagalis', 'x')
MsgBox(0, '', $var1)
вопрос, почему у тебя результат чтения: VMKJGNDIDNWLDMKJGNDIDNWLD
или я что то не то делаю/проверяю?
proxy, у тебя не верно. Там REG_EXPAND_SZ, у тебя REG_MULTI_SZ.
Я сам пока мы это дискутировали, не раз запутывался :)
Одна из моих ошибок была, создание регфайла с [HKCU\....], что неподдерживается в регфайлах.
Я раза два по запарке так написал. :)
вопрос, почему у тебя результат чтения: VMKJGNDIDNWLDMKJGNDIDNWLD »
Наверное, вопрос связан с ошибкой "REG_MULTI_SZ", или же ты что-то другое спрашиваешь?
Поясню... суть в том, чтобы зделать правильный регфайл в котором встречается REG_EXPAND_SZ.
Ну и REG_MULTI_SZ и REG_BINARY - это тоже всё интересно! А сам контент, как в этом частном случае,
это не важно. Главное синтакс! Мне сдаётся проблема неразрешимой, ибо длина первой строки до слэш
непостоянна, так как она походу выравнивается относительно длины "ValueName"="...
Если бы хотя бы прочитать, что за регламент у них там по этому поводу? Я доков не нахожу.
Постоянным являеться лишь то, что остальные строки вроде бы всегда по 25 символов '61,00,' типа
Если первую строку не зделать красиво, то будет жаль.
Я предполагаю что у них какнибудь грубо делиться, вроде 25/2 если надо ещё, то 25/4 и т.п.
Хотя, вот родил - я бы зделал так, чтобы ("ValueName" +1) == (stringW - 1) :)
А что идея! Только я в au3 такое невытяну! Зделай если можешь!? :)
Если даже ошибёмся в колличестве, зато решение универсальное для любых стринг которое легко потом подправить!
_RegRead board autoit team со своим инклюдом отыхают! :laugh:
semiono, да думаю легко сделать....но прошу, semiono, объясни понятней ))))))
разбить строку слешами? - это нужно?
опять же, а так правильно?
RegWrite('HKEY_CURRENT_USER\Software\DashSignature\Knagalis', 'x', 'REG_EXPAND_SZ', 'hex(2):56,00,4d,00,4b,00,4a,00,47,00,4e,00,44,00,49,00,44,00,4e,00,57,00,\4c,00,44,00,4d,00,4b,00,4 a,00,47,00,4e,00,44,00,49,00,44,00,4e,00,57,00,4c,\00,44,00,00,00')
$var1 = RegRead('HKEY_CURRENT_USER\Software\DashSignature\Knagalis', 'x')
MsgBox(0, '', $var1)
просто, даже с REG_EXPAND_SZ, значение читается правильно:
hex(2):56,00,4d,00,4b,00,4a,00,47,00,4e,00,44,00,49,00,44,00,4e,00,57,00,\4c,00,44,00,4d,00,4b,00,4a ,00,47,00,4e,00,44,00,49,00,44,00,4e,00,57,00,4c,\00,44,00,00,00
proxy, не забывай пожалуйста, мы делаем рег. И потом как этот рег пишет в реестр нам дела уже нет.
Но он должен быть правильный. Желательно :)
Ты сейчас в примере записал цыфры автоитом, причём со словом "hex(2):" понимаешь?
То есть у тебя всё так и записалось в реестр как в листинге.
Твой:
http://img32.imageshack.us/img32/2956/snap2d.png
правильный:
http://img32.imageshack.us/img32/7452/snap4n.png
Цыфры живут только внутри регфайла, а автоит шурует напрямую в чём и загвоздка.
Эти юникоды с запятыми нужны только для записи в file.reg
а он уже сам разберёться как их вбить в реестр.
Слеши надо зделать так - двадцать пять юникод пар > '61,62,' и слешь > '\'
в конце строки всего дампа два байта нулей '00,00' < это типа точки :)
НО первую строку надо зделать зависимой от "ValueNameДлины"="
Саму первую строку не знаю какую за основу взять, сам съэкспоритруй чтонибудь?
А потом надо если длина имени больше на букву, то отнять от строки один байт,
либо наоборот.
("ValueNameДлина" +1буква) == (stringWуникод - 1байт)
If $sValue + 1 then $sStringLenth - 1 :)
Вот что я выяснил...
"1"=hex(2):61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,\
"12"=hex(2):61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,\
"123"=hex(2):61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,\
"1234"=hex(2):61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,00,61,\ < опять короткая как и первая!
Короче "перелом" наступает когда имя становиться на три символа )) длинее, и так далее.
Саму длину строки посчитай чтоб я не ошибся?
semiono, я до сих пор в не до понимании )
* для того, что бы созданный reg файл записывал в реестр значение: VMKJGNDIDNWLDMKJGNDIDNWLD
с типом величины: REG_MULTI_SZ
* надо, что бы в reg файле, это значение было в виде циферок (юникод).
* а так как autoIt скрипт считывает значение в виде: VMKJGNDIDNWLDMKJGNDIDNWLD,
надо это значение конвертировать в юникод, что бы сохранить в reg файле.
правильно понимаю?
Короче "перелом" наступает когда имя становиться на три символа )) длинее, и так далее.
Саму длину строки посчитай чтоб я не ошибся?
))))))))))))))))))))))))))))))))
в общем, напиши, что и как формировать - чем смогу - помогу ))))))))))))))))))
Да! Но там не только юникод, там ещё и запятые и слеши с переменной длиной первой строки, ты же понимаешь? А так всё верно!
Вот код, хочу напомнить. Но там проблема какраз вышла из-за разных типов. То есть это недоделанный скрипт...
Switch @OSArch
Case "x86"
$sRegVSTs = "HKLM\Software\VST"
Case "x64"
$sRegVSTs = "HKLM\Software\Wow6432Node\VST"
EndSwitch
$sInsVSTs = RegRead($sRegVSTs, "VSTPluginsPath")
$sRegKey = "HKEY_CURRENT_USER\Software\DashSignature\Knagalis"
$sSerial = RegRead($sRegKey, "SN")
Local $sSerial, $i, $sSerialResult
For $i=1 To StringLen($sSerial)
$sSerialResult &= Hex(Asc(StringMid($sSerial, $i, 1)), 2)
If $i < StringLen($sSerial) Then $sSerialResult &= ',00,'
Next
$sSerialResult = 'hex(2):' & $sSerialResult & ',00,00,00'
$sFile_Content = _
"Windows Registry Editor Version 5.00" & @CRLF & @CRLF & _
"[" & $sRegKey & "]" & @CRLF & _
'"SN"=' & $sSerialResult & @CRLF & @CRLF
$sRegFile = $sInsVSTs & "\Knagalis\Knagalis.reg"
FileSetAttrib($sRegFile,"-RASHNOT",0)
$hFileOpen = FileOpen($sRegFile, 10)
FileWrite($hFileOpen, $sFile_Content)
FileClose($hFileOpen)
FileSetAttrib($sRegFile,"-RASHNOT",0)
FileSetTime($sRegFile, '20010101000000', 0, 1)
FileSetTime($sRegFile, '20010101000000', 1, 1)
FileSetTime($sRegFile, '20010101000000', 2, 1)
Суть в том чтобы просто зделать бэкап файлик Knagalis.reg и всё!
Но так как на этом скрипте дело не стало, то хочется и другие ситуации предусмотреть,
в часности REG_EXPAND.. На будущее!
Вся фитча вот здесь происходит:
$sFile_Content = _
"Windows Registry Editor Version 5.00" & @CRLF & @CRLF & _
"[" & $sRegKey & "]" & @CRLF & _
'"SN"=' & $sSerialResult & @CRLF & @CRLF
$sRegFile = $sInsVSTs & "\Knagalis\Knagalis.reg"
значит сейчас необходимо:
1. доделать, что бы расставлялись слеши, по какомоту мистичискому принципу.
2. в часности REG_EXPAND.. На будущее! т.е., а с ним что?
proxy, я тебе предлагаю так же помимо моей затеи разработать инклюд для корректного экспорта параметров реестра в валидный регфайл! Это имхо будет полезно всем :)
по какомоту мистичискому принципу. »
Да.
да с удовольствием, да только пока не все понял: что / куда/ зачем ))))))))))
инклюд
это называется UDF - User Defined Function - "пользовательские функции", даже можно сказать "утвержденные пользовательские функции".
Т.е. это набор функций, которые находятся во внешнем файле. Это для удобства. Так как эти функции, в большинстве случаев, используются в том виде, в каком они есть, т.е. без их редактирования.
разработать
осталось только разобраться по какому принципу расставляются слеши.
semiono, а на том форуме ты под ником AZJIO ? :spy:
и не надо каждый мой пост отмечат благодарностью - лучше только те, которые дейтсвительно содержат решение вопроса ))))
AZJIO хе-хе :) Не это не я! Я повозможности всегда семёно. Очень был зол когда на @gmail это имя моё кто-то занял )))
:spy: < +1 гыгы!
я даже понимаю почему этого нет, потому что
ShellExecute ( "reg.exe", "export ""HKCU\Software\aa"" C:\MyReg.reg")
Но тут мы опять получаем reg.exe export /? такой, какой он есть, без всякого выбора конкретного параметра :\
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.