|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Регфайл, синтаксис. |
|
|
Регфайл, синтаксис.
|
Ветеран Сообщения: 842 |
Профиль | Отправить PM | Цитировать
Думаю пора обсудить написание валидных регфайлов средствами AutoIt3.
Хочется объединить всё вместе, как некое знание и рассмотреть все встречающиеся особенности записи различных типов параметров. Сразу же хочеться отметить различие реестров x86 и x64, и в то же время рег синтакс исключающий записи вида HKLM/HKCU и т.п. Здесь могут быть полезными выключатели Switch @OSArch Case 'x86' $sRegKey = 'HKLM\Software\RegKey' Case 'x64' $sRegKey = 'HKLM\Software\Wow6432Node\RegKey' EndSwitch $sFileContent = _ 'Windows Registry Editor Version 5.00' & @CRLF & @CRLF & _ '[' & $sRegKey & ']' & @CRLF & _ '"ValueName"=' & $sSerialResult & & @CRLF & @CRLF Однако, большую сложность думаю представляет запись значений параметров в валидном виде для регфалов! Например, все типы кроме REG_SZ и REG_DWORD имеют запись вида = hex(2): Причём, понятно что REG_EXPAND_SZ содержит юникод, экспортирующийся в виде шеснадцетиричного кода разделённого запятыми в регфайл. Закрывается строка нуевым символом, то-есть двумя байтами нулей ',00,00' (впрочем это так же актуально и для multisz и для binary) Несмотря на то, что строки могут быть размещены без переносов, и это работает, однако майкрософт придумала способ записи разделяемой слеш, для переноса строки. Это красиво и хотелось бы тоже этому следовать. Длина строк в такой записи содержит 25 байт разделённых запятыми, строки начинается с двух пробелов и заканчивается слеш, если нужен перенос Однако первая строка имеет не постоянную длину относительно имени переменной. Минимальная строка содержит 22 байта разделённых запятыми, и начинает убавляться на один байт при увеличении длины имени переменной на 4 символа. "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,\ < строка стала короче "zzz"=dword:0001e240 И другие (zero-lenth-binary-value) "value1"=hex(0): У меня просьба, сделайте свои предложения по поводу кода autoit, и быть может это соберёться в некий включаемый файлик? Вопрос: можно ли получить юникод или бинарную не ascii строку в перменную и затем разделить все байты строки запятыми? Ну и особое желание - это установить слеши по схеме регфайла, тоесть с расчётом длинны, длин и т.п. Ещё проще вопрос, как записать запятую через каждые два символа, заранее неизвестной строки... aa,bb,ab,ac,.... |
|
------- Отправлено: 20:17, 22-06-2009 |
Ветеран Сообщения: 553
|
Профиль | Отправить PM | Цитировать Простите а зачем это нужно ???
|
Отправлено: 09:44, 23-06-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 460
|
Профиль | Отправить PM | Цитировать FlatX007, а дело в том, что вот такая ситуация:
Задача: необходимо создать файл типа .reg, который будет записывать (или обновлять) данные в реестре велечины типа REG_EXPAND_SZ. В реестре это будет выглядеть так: Цитата:
А вот в .reg файле это будет выглядеть так: Цитата:
Дело в том, что значения в .reg файле записываются следующим образом: Цитата:
Соответсвенно появился интерес накатать функции, для форматирования/перекодировки значений реестового типа REG_BINARY, REG_DWORD, REG_SZ и т.д. в формат .reg файла hex(3), hex(4), hex(1) и т.д. Для типа REG_EXPAND_SZ, ни чего умней не родилось, как это: $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 & ']' & ',00,00' & @CRLF & _ '"SN"=' & $sSerialResult & @CRLF & @CRLF Вот и все, в этом и вопрос....осталось немного покодить |
|||
------- Отправлено: 10:23, 23-06-2009 | #3 |
Ветеран Сообщения: 553
|
Профиль | Отправить PM | Цитировать А что утилита ConvRegToAu3 - неумеет этого делать ?
|
Отправлено: 13:37, 23-06-2009 | #4 |
Старожил Сообщения: 460
|
Профиль | Отправить PM | Цитировать Цитата FlatX007:
FlatX007, ээ-хеее-ххххххххх......стал бы я возиться если уже все есть? - нет конечно )) конечно может и есть уже, но пока не нашел )) Задача - с помощью AutoIt создать reg файл. А не из reg файла RegWrite функци... )) |
||
------- Отправлено: 13:51, 23-06-2009 | #5 |
Ветеран Сообщения: 553
|
Профиль | Отправить PM | Цитировать А всё допёрло ... я сначало невкурил.
|
Отправлено: 18:21, 23-06-2009 | #6 |
Ветеран Сообщения: 842
|
Профиль | Отправить PM | Цитировать FlatX007, ещё хочу напомнить то, что reg.exe expand /? имеет тоже ограничения.
Я бы хотел иметь замену reg.exe, так как утилита коммандной строки сама по себе хороша, потому что можно использовать батники, а так же вызывать из InnoSetup, но стандартная утилита не всё умеет, а жаль. |
------- Отправлено: 20:27, 23-06-2009 | #7 |
Старожил Сообщения: 215
|
Профиль | Отправить PM | Цитировать Дайте спецификацию .reg файлов. То есть как выглядит в нём каждый из указанных типов значений.
Для любого ли типа необходимо ковертить в hex? Какое условие переноса строки? |
------- Отправлено: 21:43, 23-06-2009 | #8 |
Старожил Сообщения: 460
|
Профиль | Отправить PM | Цитировать Sylver Dragon, а мне дайте 7 миллионов долларов ))))))))))))))))))))))))))
И то есть, почему ни кто не приносит кофе мне в постел? Где моя любимая кока-кола?? Какие условия возврата d-link барахла? )))))))))) Спецификацию файлов, типа которых разработан в Miscrosoft....что может быть проще? хотя и не совсем спецификация (( Цитата Sylver Dragon:
...ааагрррх, на самом деле форматирование выглядит вот так: для других типов необходимо поментья length на соответсвующий типу в Hex......освобожусь, допишу func |
|
------- Отправлено: 23:05, 23-06-2009 | #9 |
Ветеран Сообщения: 842
|
Профиль | Отправить PM | Цитировать Перенос строки я посчитал, смотрите выше:
Цитата semiono:
будут записываться одинакого, в том числе и переносы. Так как вроде бы нет причины их записывать иначе. И для переноса строк в MULTI_SZ в самом регфайле ничего не будет предусмотренно, так как это выполняется самим кодом, а это значит, что там в закрытии строк будут какие-то нули... два байта или четыре, не знаю... 00,00,00,00 типа того! То-есть само оформление будет обычным, но байт-контент надо уже контролировать... В InnoSetup переносы в multisz выполняет {break} Характерные примеры multisz (WinXP) HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager BootExecute = autocheck autochk /k:D /k:E /k:F /k:G /k:H /k:I /k:J /k:K /k:L /k:M /k:N /k:O /k:P /k:Q /k:R /k:S /k:T /k:U /k:V /k:W /k:X /k:Y /k:Z * pgdfgsvc C 1 Я как-то возился над PendingFileRenameOperating так и не понял ничего, запарился его тестить перезагрузками |
|
------- Отправлено: 02:40, 24-06-2009 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
VBS/WHS/JS - синтаксис On Error | Dr.Dark | Программирование и базы данных | 8 | 26-08-2008 11:42 | |
Delphi - Синтаксис масивов в Паскале | verdix | Программирование и базы данных | 3 | 13-05-2008 16:36 | |
Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI | DillerInc | Программирование и базы данных | 60 | 13-03-2006 21:36 | |
Синтаксис setup.iss | ags | Автоматическая установка приложений | 11 | 06-03-2006 07:58 | |
синтаксис php | Вебмастеру | 6 | 03-03-2005 22:42 |
|