PDA

Показать полную графическую версию : [решено] RegRead ( "keyname", REG_EXPAND_SZ "valuename" ) ?


Страниц : [1] 2 3

semiono
19-06-2009, 22:12
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},
но это всё относительно записи, нафига это всё надо для чтения, ведь откуда известно что я считаю регридом? Ведь было бы известно,
тогда бы и читать не нужно! :) ?
Одним словом как читать дворд, мултисз, экспанд итп...? Бывает, кстати неизвесно вообще заранее какой тип, хотя это отдельный вопрос.

proxy
20-06-2009, 00:12
т.е., при чтение данных из реестра, Вы желаите указать тип считываемых данных, так?

если так, - то зачем?
помойму в справке по RegRead этого не требуется:

RegRead ( "keyname", "valuename" )
Параметры
keyname Ключ реестра.
valuename название значения.

??

semiono
20-06-2009, 00:50
И поэтому я получаю:

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" !

proxy
20-06-2009, 01:09
т.е. получется:
"X"="VMKJGNDIDNWLDMKJGNDIDNWLD" »

а какой вид должен получиться?

semiono
20-06-2009, 01:25
[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

Такой.

proxy
20-06-2009, 01:28
так уже похоже?

$sSerial = 'VMKJGNDIDNWLDMKJGNDIDNWLD'
MsgBox(0, '', Binary($sSerial))

далее преобразовывать?

semiono
20-06-2009, 01:34
Да пожалуйста! Только мне странно, что сам RegRead() не разбирает типов! Ну это нивкакие ворота! Что за экспорт всё в одну кучу в REG_SZ :(

MsgBox(0, '', Binary($sSerial))
Теперь видимо надо запятых добавить?
Только я боюсь, что такой ручной парсинг всёравно упрёться в ошибки, так как могут переносы строк встретиться.
Но а как узнать где и когда! Хотя вроде бы перенос осуществляется двумя байтами нулей? "00 00"
Там как бы юникод чтоль, по два байта на символ...?
Эх, как я однажды влез в PendingFileRenameOperation, так и не понял что к чему там, опять такая же история...

Мне просто нужен способ для разных программ, чтоб каждый раз не искать решение. :(

А всё же о чём говорилось в справке?
"use with StringSplit(..., @LF) to get each entry."

proxy
20-06-2009, 01:49
Только мне странно, что сам 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 пар...

semiono
20-06-2009, 01:56
Очень любопытно! :) +1
Таг, теперь бы реализовать полностью. Получиться?
Если там нули ко всем символам прибавляються, интересно это ASCII чтоль? Ну хотябы так хорошо будет!
Пробел не нужен > ',00,' в регсинтаксе это идёт подряд без пропусков....
Слеши добавишь?

ЗЫ я и не задумывался никогда, чтоли второй байт юникода всегда равен нулю? Хм зачем он тогда нужен :)
или это лишь в китайском используют этот байт? Похоже что в нормальном языке всегда нуль! Тогда это удобно будет!

Сейчас я слеши уберу из регфайла и проверю!
Да не нужны! Это видимо для читабельности регфайлов придумали! Проверил.

"valuename"=hex(2):юникод,через,запятые+(плюс два байта нулей= ) 00,00(так сказать закрывашка)

proxy
20-06-2009, 02:14
...я уже почти и слеши расставил, думал над красотами ))

но если не нужны - то так:

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)


осталось проверить верность всех цыфирок )

вся разбивка совпадает, все ок ..

semiono
20-06-2009, 02:17
Я наверное убью себя! :) Попробовал вписать параметр как REG_SZ и он подошёл!
Интересно это во всех случаях так или просто совпадение!?
Хотя нет, я вот точно знаю что %SystemRoot% нельзя заменять на REG_SZ ибо он не будет работать!
А у нас здесь по любому же вопрос стоит опредилить сабж, а не мои конкретные проблеммы.
Так что это всё не зря!
:) Если можно добавь и слеши, чтоб неподкопаться было ;-

proxy
20-06-2009, 02:22
по идее это юникод....ща копну....

вот так уже правильней:
MsgBox(0, '', Hex(AscW('V')))
MsgBox(0, '', Hex(AscW('M')))

сейчас сделаю перебор...

semiono
20-06-2009, 02:31
Я выяснил, что первая строка отсекается неравномерно! Вернее учитывается длина "VolumeName"=
и получается, что зависит от длины имени, так что не знаю стоит ли слеш делать, всёравно не угадать.
Я о том, что если имя параметра одна буква, то юникодов строка будет длинной, иначе короткой.
Но далее уже по 25 символов до слеша - это похоже постоянно.

proxy
20-06-2009, 02:40
вриант:
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)

semiono
20-06-2009, 02:42
Я вот тут баловался :)
Странные параметры -
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

вриант: »
Хорошо, пойдёт! Отлично!

proxy
20-06-2009, 02:46
"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)?

semiono
20-06-2009, 02:59
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
20-06-2009, 03:08
так как ссылка вверху - получилось?
или как? ))

semiono
20-06-2009, 03:12
proxy, ну на вид да! а так быстро я не соображу, чтоб это в регфайл сохранить.
Работает, я через ClipPut($sSerialResult) вставил, раскоментировал. :)

proxy
20-06-2009, 03:18
там просто функции, их необходимо скопировать (желательно в самый верх своего скрипта) в скрипт - все что там есть до текст:
;; EXAMPLE

а в место этих строчек:
#include-once
#include <Constants.au3>

скопировать только это:
#include <Constants.au3> - и скопировать его в самый верх своего скрипта

а далее использовать вместо RegRead => _RegRead

и проверять результат


Либо создать отдельный include файл и подключить его к своему скрипту.




© OSzone.net 2001-2012