Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] RegRead ( "keyname", REG_EXPAND_SZ "valuename" ) ? (http://forum.oszone.net/showthread.php?t=143073)

semiono 19-06-2009 22:12 1147184

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

proxy 20-06-2009 00:12 1147251

т.е., при чтение данных из реестра, Вы желаите указать тип считываемых данных, так?

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

Цитата:

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

semiono 20-06-2009 00:50 1147264

И поэтому я получаю:

Код:

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 1147271

т.е. получется:
Цитата:

Цитата semiono
"X"="VMKJGNDIDNWLDMKJGNDIDNWLD" »

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

semiono 20-06-2009 01:25 1147276

Код:

[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 1147278

так уже похоже?

Код:

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

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

semiono 20-06-2009 01:34 1147279

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

Цитата:

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

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

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

proxy 20-06-2009 01:49 1147284

Цитата:

Только мне странно, что сам 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 1147285

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

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

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

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

proxy 20-06-2009 02:14 1147294

...я уже почти и слеши расставил, думал над красотами ))

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

Код:

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 1147296

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

proxy 20-06-2009 02:22 1147298

по идее это юникод....ща копну....

вот так уже правильней:
Код:

MsgBox(0, '', Hex(AscW('V')))
MsgBox(0, '', Hex(AscW('M')))

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

semiono 20-06-2009 02:31 1147303

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

proxy 20-06-2009 02:40 1147310

вриант:
Код:

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 1147312

Я вот тут баловался :)
Странные параметры -
Код:

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
вриант: »

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

proxy 20-06-2009 02:46 1147314

Цитата:

"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
....гм....и даже весело ))))

а если попробовать так?

semiono 20-06-2009 02:59 1147320

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 1147322

так как ссылка вверху - получилось?
или как? ))

semiono 20-06-2009 03:12 1147324

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

proxy 20-06-2009 03:18 1147325

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

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

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

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

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


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

semiono 20-06-2009 03:30 1147328

Я уже проверил на своём скрипте, работает правильно! Благодарю!

proxy 20-06-2009 03:38 1147329

эта штука рулит,
стоило нам подумать головой и сэкономили бы время )))

semiono 20-06-2009 16:08 1147564

Хоть бы рассказал что там нашёл!? :)
Набрав RegRead выдало кучу релизов автоит. Полистав первый нашёл там строку
- Changed: RegRead() and RegWrite() no longer use hex strings for REG_BINARY types - native binary datatypes are enforced.
И что, не знаю хорошо это или плохо? :)
Или ты хочешь сказать что то что ты написал там подтвердилось? Я пока не уловил. Конечно хорошо что такой поиск есть гипотетически.

proxy 20-06-2009 16:21 1147574

имею в виду, что именно через него нашел _RegRead()
как понял они помогли ?

просто, если залез бы туда в самом начале, то это был бы самый верный шаг )

semiono 20-06-2009 16:52 1147596

_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 вроде бы тоже целиком сейвит?

proxy 20-06-2009 17:20 1147617

semiono, стоп, стоп.

я запутался.

чуть выше опубликовал ссылку на офф форум, где есть разработка на альтернативные функции RegRead и RegWrite.
чем они лучше / хуже не знаю, поэтому и запостил - что бы проверить.

так вот, эти функции ты проверял / пробовал?
какой результат?

proxy 20-06-2009 17:22 1147620

читать дальше »

Код:

#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(Ключ_реестра, название_значения), параметры те же

semiono 21-06-2009 01:29 1147910

Я нашёл батник, может что полезное извлечь для автоит сгодиться?
http://forum.oszone.net/showthread.php?p=1147902
То как подключить инклюд мне знакомо, но надо проверить будет сами скрипты!

Цитата:

Цитата proxy
чуть выше опубликовал »

ух! это то что надо, там какраз про такие вещи пишут!

semiono 21-06-2009 01:57 1147922

Не для нашей задачи это не пойдёт. Пишет так же по автоитовски,
между 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 всяких.
Но чтоб написать корректный регфайл, это только с твоей помощью можно с твоими парсингами строки.
:)

proxy 21-06-2009 11:14 1148033

так.

Ключ реестра: 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,4a,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

или я что то не то делаю/проверяю?

semiono 21-06-2009 16:04 1148189

proxy, у тебя не верно. Там REG_EXPAND_SZ, у тебя REG_MULTI_SZ.
Я сам пока мы это дискутировали, не раз запутывался :)
Одна из моих ошибок была, создание регфайла с [HKCU\....], что неподдерживается в регфайлах.
Я раза два по запарке так написал. :)
Цитата:

Цитата proxy
вопрос, почему у тебя результат чтения: 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:

proxy 21-06-2009 18:20 1148257

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,4a,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

semiono 21-06-2009 22:46 1148458

proxy, не забывай пожалуйста, мы делаем рег. И потом как этот рег пишет в реестр нам дела уже нет.
Но он должен быть правильный. Желательно :)
Ты сейчас в примере записал цыфры автоитом, причём со словом "hex(2):" понимаешь?
То есть у тебя всё так и записалось в реестр как в листинге.
Твой:

правильный:

Цыфры живут только внутри регфайла, а автоит шурует напрямую в чём и загвоздка.

Эти юникоды с запятыми нужны только для записи в file.reg
а он уже сам разберёться как их вбить в реестр.

Слеши надо зделать так - двадцать пять юникод пар > '61,62,' и слешь > '\'
в конце строки всего дампа два байта нулей '00,00' < это типа точки :)

НО первую строку надо зделать зависимой от "ValueNameДлины"="
Саму первую строку не знаю какую за основу взять, сам съэкспоритруй чтонибудь?
А потом надо если длина имени больше на букву, то отнять от строки один байт,
либо наоборот.
("ValueNameДлина" +1буква) == (stringWуникод - 1байт)

If $sValue + 1 then $sStringLenth - 1 :)

semiono 21-06-2009 23:05 1148487

Вот что я выяснил...
Код:

"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,\ < опять короткая как и первая!

Короче "перелом" наступает когда имя становиться на три символа )) длинее, и так далее.
Саму длину строки посчитай чтоб я не ошибся?

proxy 21-06-2009 23:16 1148495

semiono, я до сих пор в не до понимании )

* для того, что бы созданный reg файл записывал в реестр значение: VMKJGNDIDNWLDMKJGNDIDNWLD
с типом величины: REG_MULTI_SZ

* надо, что бы в reg файле, это значение было в виде циферок (юникод).

* а так как autoIt скрипт считывает значение в виде: VMKJGNDIDNWLDMKJGNDIDNWLD,
надо это значение конвертировать в юникод, что бы сохранить в reg файле.

правильно понимаю?

Цитата:

Короче "перелом" наступает когда имя становиться на три символа )) длинее, и так далее.
Саму длину строки посчитай чтоб я не ошибся?
))))))))))))))))))))))))))))))))

в общем, напиши, что и как формировать - чем смогу - помогу ))))))))))))))))))

semiono 21-06-2009 23:19 1148500

Да! Но там не только юникод, там ещё и запятые и слеши с переменной длиной первой строки, ты же понимаешь? А так всё верно!

Вот код, хочу напомнить. Но там проблема какраз вышла из-за разных типов. То есть это недоделанный скрипт...
Код:

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"


proxy 21-06-2009 23:29 1148508

значит сейчас необходимо:

1. доделать, что бы расставлялись слеши, по какомоту мистичискому принципу.

2.
Цитата:

в часности REG_EXPAND.. На будущее!
т.е., а с ним что?

semiono 21-06-2009 23:30 1148509

proxy, я тебе предлагаю так же помимо моей затеи разработать инклюд для корректного экспорта параметров реестра в валидный регфайл! Это имхо будет полезно всем :)

Цитата:

Цитата proxy
по какомоту мистичискому принципу. »

Да.

proxy 21-06-2009 23:35 1148513

да с удовольствием, да только пока не все понял: что / куда/ зачем ))))))))))

Цитата:

инклюд
это называется UDF - User Defined Function - "пользовательские функции", даже можно сказать "утвержденные пользовательские функции".
Т.е. это набор функций, которые находятся во внешнем файле. Это для удобства. Так как эти функции, в большинстве случаев, используются в том виде, в каком они есть, т.е. без их редактирования.

Цитата:

разработать
осталось только разобраться по какому принципу расставляются слеши.

semiono, а на том форуме ты под ником AZJIO ? :spy:

и не надо каждый мой пост отмечат благодарностью - лучше только те, которые дейтсвительно содержат решение вопроса ))))

semiono 21-06-2009 23:44 1148519

AZJIO хе-хе :) Не это не я! Я повозможности всегда семёно. Очень был зол когда на @gmail это имя моё кто-то занял )))

:spy: < +1 гыгы!

я даже понимаю почему этого нет, потому что
ShellExecute ( "reg.exe", "export ""HKCU\Software\aa"" C:\MyReg.reg")
Но тут мы опять получаем reg.exe export /? такой, какой он есть, без всякого выбора конкретного параметра :\

proxy 21-06-2009 23:59 1148524

а как вот такой вот reg файл, и не надо слешей:

Код:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\DashSignature\Knagalis]
"X2"=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

после выполнения данного reg файла, в реестр, записалось значение: VMKJGNDIDNWLDMKJGNDIDNWLD, тип величины: REG_MULTI_SZ

Вот такой же вариант как понимаю устроит?? ))

proxy 22-06-2009 00:24 1148545

и вот такой вот получается скрипт:

Код:

Opt('MustDeclareVars',      1)

Local $sRegKey, $sSerial, $i, $sSerialResult
Local $sFileContent, $sRegVSTs, $sRegFile, $hFileOpen

$sRegKey
= 'HKEY_CURRENT_USER\Software\DashSignature\Knagalis'
$sSerial = RegRead($sRegKey, 'SN')

For $i=1 To StringLen($sSerial)
    $sSerialResult &= Hex(Asc(StringMid($sSerial, $i, 1)), 2) & ',00,'
Next
$sSerialResult = 'hex(2):' & $sSerialResult
If StringRight($sSerialResult, 1) == ',' Then $sSerialResult = StringTrimRight($sSerialResult, 1)

$sFileContent = _
    'Windows Registry Editor Version 5.00' & @CRLF & @CRLF & _
    '[' & $sRegKey & ']' & @CRLF & _
    '"SN"=' & $sSerialResult & @CRLF & @CRLF

Switch @OSArch
    Case 'x86'
        $sRegVSTs = 'HKLM\Software\VST'
    Case 'x64'
        $sRegVSTs = 'HKLM\Software\Wow6432Node\VST'
EndSwitch
$sRegFile = RegRead($sRegVSTs, 'VSTPluginsPath') & '\Knagalis\Knagalis.reg'

$hFileOpen = FileOpen($sRegFile, 8+2)
FileWrite($hFileOpen, $sFileContent)
FileClose($hFileOpen)

FileSetAttrib($sRegFile, '-RASHNOT', 0)
FileSetTime($sRegFile, '20010101000000', 0)
FileSetTime($sRegFile, '20010101000000', 1)
FileSetTime($sRegFile, '20010101000000', 2)


semiono 22-06-2009 19:03 1149178

Цитата:

Цитата proxy
тип величины: REG_MULTI_SZ »

Ты оговорился, REG_EXPAND_SZ .
Предлагаешь без слешей? Хорошо, я знаю что без них можно.
Это майкрософт придумали для красоты переносы строк, поэтому фиг с ними.
Там я писал уже, что на REG_SZ заменил. Но в других случаях это нельзя делать,
ключи содержащие переменные пути, напр. %SystemDrive% не будут работать
в системе через обычный REG_SZ. Поэтому сам тип лучше соблюдать где встречается.

Спасибо, ты помимо всего ещё и организовал лучше мой скрипт, хотя я ещё не проверял,
но красивше стало, я сам даже не втыкаюсь как пральна всякие Local юзать :)
А что свитчеры опустил, так лучше? Я хочу чтоб x86_x64 на весь код влияло глобально,
так как часто в программах это нужно по всему коду. Я вообще-то делаю как бы шаблон,
чтобы его перекидывать на много приложений, чтоб меньше потом писать...
Щас почитаю, подумаю над этим.
Цитата:

Цитата proxy
Hex(Asc(StringMid »

А у меня мысль была знаешь какая, а что если получить строку UNICODE в автиоите
и потом её как-то заполнить RegExp-ами, чтоб между символами запятые разделители вставить.
Это реально? Тогда можно даже и не ascii контент считывать в регфайл, любой bin- контент
:)

semiono 22-06-2009 19:24 1149192

proxy, поправочка моя
Код:

        '"SN"=' & $sSerialResult & ",00,00" & @CRLF & @CRLF
Ноль терминейтед стринг, это как правило во всяких бинарных записях реестра. ;-
Но так всё очень превосходно! :)
Пора тему закруглить, и завести новую, сугубо по параметрам, без всяких "программ"

proxy 22-06-2009 20:51 1149261

Цитата:

а что если получить строку UNICODE в автиоите
вопрос в том - как ? )))

Цитата:

организовал лучше мой скрипт
просто разложил по порядку выполнения, но можно как угодно конечно - и само собой как удобней тебе - в первую очередь, ну и главное, что бы все работало правильно ))

Цитата:

Цитата semiono
Ноль терминейтед стринг, это как правило во всяких бинарных записях реестра »

ну надо-так надо ))

в принципе: Hex(Asc(StringMid - тут и получаем юникодовское кодирование..........


Время: 01:54.

Время: 01:54.
© OSzone.net 2001-