Показать полную графическую версию : [решено] RegRead ( "keyname", REG_EXPAND_SZ "valuename" ) ?
When reading a REG_MULTI_SZ key the multiple entries are separated by @LF - use with StringSplit(..., @LF) to get each entry.
Совершенно не пойму, что делать? Куда тыкать StringSplit(..., @LF) ?
Мне надо счесть корректно параметр, который REG_MULTI_SZ, разделять строки это тоже хорошо, в InnoSetup используется {break},
но это всё относительно записи, нафига это всё надо для чтения, ведь откуда известно что я считаю регридом? Ведь было бы известно,
тогда бы и читать не нужно! :) ?
Одним словом как читать дворд, мултисз, экспанд итп...? Бывает, кстати неизвесно вообще заранее какой тип, хотя это отдельный вопрос.
т.е., при чтение данных из реестра, Вы желаите указать тип считываемых данных, так?
если так, - то зачем?
помойму в справке по RegRead этого не требуется:
RegRead ( "keyname", "valuename" )
Параметры
keyname Ключ реестра.
valuename название значения.
??
И поэтому я получаю:
Windows Registry Editor Version 5.00
[HKCU\Software\DashSignature\Knagalis]
"X"="VMKJGNDIDNWLDMKJGNDIDNWLD"
При том что в реестре на самом деле REG_EXPAND_SZ, в итоге у меня получается непригодный регфайл.
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"
$sZz = RegRead($sRegKey, "X")
$sFile_Content = _
"Windows Registry Editor Version 5.00" & @CRLF & @CRLF & _
"[" & $sRegKey & "]" & @CRLF & _
'"X"=' & '"' & $sZz & '"' & @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)
Мне нужно создать бэкап файл, простой рег. Таковы мои нехитрые действия.
К слову сказать утилита reg.exe, тоже не пригодна, так как экспортировать умеет весь "keyname", целиком.
А это неудобно, нужны только выборочно "valuename" !
т.е. получется:
"X"="VMKJGNDIDNWLDMKJGNDIDNWLD" »
а какой вид должен получиться?
[HKEY_CURRENT_USER\Software\DashSignature\Knagalis]
"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
Такой.
так уже похоже?
$sSerial = 'VMKJGNDIDNWLDMKJGNDIDNWLD'
MsgBox(0, '', Binary($sSerial))
далее преобразовывать?
Да пожалуйста! Только мне странно, что сам RegRead() не разбирает типов! Ну это нивкакие ворота! Что за экспорт всё в одну кучу в REG_SZ :(
MsgBox(0, '', Binary($sSerial))
Теперь видимо надо запятых добавить?
Только я боюсь, что такой ручной парсинг всёравно упрёться в ошибки, так как могут переносы строк встретиться.
Но а как узнать где и когда! Хотя вроде бы перенос осуществляется двумя байтами нулей? "00 00"
Там как бы юникод чтоль, по два байта на символ...?
Эх, как я однажды влез в PendingFileRenameOperation, так и не понял что к чему там, опять такая же история...
Мне просто нужен способ для разных программ, чтоб каждый раз не искать решение. :(
А всё же о чём говорилось в справке?
"use with StringSplit(..., @LF) to get each entry."
Только мне странно, что сам RegRead() не разбирает типов!
в полне согласен, тупизм....Но
1 либо что то не доконца мы понимаем
2 либо действительно тупизм ))
...сожалею, но точного ответа не знаю..
вариант без слешей:
Local $sSerial, $i, $sSerialResult
$sSerial = StringLower(StringTrimLeft(Binary('VMKJGNDIDNWLDMKJGNDIDNWLD'), 2))
For $i=1 To StringLen($sSerial) Step 3
$sSerialResult &= StringMid($sSerial, $i, 2)
If $i < StringLen($sSerial)-2 Then $sSerialResult &= ',00,'
Next
MsgBox(0, '', $sSerialResult)
а слеши там точно нужны?
если вставлять серийник в програму от которой он без слешей - все сработает?
можно судить так:
ставить слеш после первых 11 пар, далее ставить после каждых 13 пар...
Очень любопытно! :) +1
Таг, теперь бы реализовать полностью. Получиться?
Если там нули ко всем символам прибавляються, интересно это ASCII чтоль? Ну хотябы так хорошо будет!
Пробел не нужен > ',00,' в регсинтаксе это идёт подряд без пропусков....
Слеши добавишь?
ЗЫ я и не задумывался никогда, чтоли второй байт юникода всегда равен нулю? Хм зачем он тогда нужен :)
или это лишь в китайском используют этот байт? Похоже что в нормальном языке всегда нуль! Тогда это удобно будет!
Сейчас я слеши уберу из регфайла и проверю!
Да не нужны! Это видимо для читабельности регфайлов придумали! Проверил.
"valuename"=hex(2):юникод,через,запятые+(плюс два байта нулей= ) 00,00(так сказать закрывашка)
...я уже почти и слеши расставил, думал над красотами ))
но если не нужны - то так:
Local $sSerial, $i, $sSerialResult
$sSerial = StringLower(StringTrimLeft(Binary('VMKJGNDIDNWLDMKJGNDIDNWLD'), 2))
For $i=1 To StringLen($sSerial) Step 2
$sSerialResult &= StringMid($sSerial, $i, 2)
If $i < StringLen($sSerial)-2 Then $sSerialResult &= ',00,'
Next
$sSerialResult = 'hex(2):' & $sSerialResult & ',00,00,00'
MsgBox(0, '', $sSerialResult)
осталось проверить верность всех цыфирок )
вся разбивка совпадает, все ок ..
Я наверное убью себя! :) Попробовал вписать параметр как REG_SZ и он подошёл!
Интересно это во всех случаях так или просто совпадение!?
Хотя нет, я вот точно знаю что %SystemRoot% нельзя заменять на REG_SZ ибо он не будет работать!
А у нас здесь по любому же вопрос стоит опредилить сабж, а не мои конкретные проблеммы.
Так что это всё не зря!
:) Если можно добавь и слеши, чтоб неподкопаться было ;-
по идее это юникод....ща копну....
вот так уже правильней:
MsgBox(0, '', Hex(AscW('V')))
MsgBox(0, '', Hex(AscW('M')))
сейчас сделаю перебор...
Я выяснил, что первая строка отсекается неравномерно! Вернее учитывается длина "VolumeName"=
и получается, что зависит от длины имени, так что не знаю стоит ли слеш делать, всёравно не угадать.
Я о том, что если имя параметра одна буква, то юникодов строка будет длинной, иначе короткой.
Но далее уже по 25 символов до слеша - это похоже постоянно.
вриант:
Local $sSerial, $i, $sSerialResult
$sSerial = 'VMKJGNDIDNWLDMKJGNDIDNWLD'
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'
MsgBox(0, '', $sSerialResult)
;~ ClipPut($sSerialResult)
Я вот тут баловался :)
Странные параметры -
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\.test]
"9"=hex(9):53,00,65,00,6D,00,69,00,6F,00,6E,00,6F,00
"F"=hex(f):53,00,65,00,6D,00,69,00,6F,00,6E,00,6F,00
вриант: »
Хорошо, пойдёт! Отлично!
"9"=hex(9):53,00,65,00,6D,00,69,00,6F,00,6E,00,6F,00
"F"=hex(f):53,00,65,00,6D,00,69,00,6F,00,6E,00,6F,00
....гм....и даже весело ))))
а если попробовать так (http://www.autoitscript.com/forum/index.php?showtopic=96124&hl=UNICODE)?
REG_FULL_RESOURCE_DESCRIPTOR
"Последовательность вложенных массивов. Служит для хранения списка ресурсов, которые используются физическим устройством. Обнаруженные данные система сохраняет в разделе \HardwareDescription. В окне редактора реестра эти данные отображаются в виде двоичного параметра в шестнадцатеричном формате."
:)
я ещё забыл про такое "New"=hex(ffff):53,00,65,00,6D,00,69,00,6F,00,6E,00,6F,00 :) для новых систем будущего!
Кстати, вот вчерашнюю ошибку снова повторил, то что в скрипте HKCU надо переводить в HKEY_CURRENT_USER, ато regfile не поддерживает такие записи...
так как ссылка вверху - получилось?
или как? ))
proxy, ну на вид да! а так быстро я не соображу, чтоб это в регфайл сохранить.
Работает, я через ClipPut($sSerialResult) вставил, раскоментировал. :)
там просто функции, их необходимо скопировать (желательно в самый верх своего скрипта) в скрипт - все что там есть до текст:
;; EXAMPLE
а в место этих строчек:
#include-once
#include <Constants.au3>
скопировать только это:
#include <Constants.au3> - и скопировать его в самый верх своего скрипта
а далее использовать вместо RegRead => _RegRead
и проверять результат
Либо создать отдельный include файл и подключить его к своему скрипту.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.