![]() |
RegRead ( "keyname", REG_EXPAND_SZ "valuename" ) ?
Цитата:
Мне надо счесть корректно параметр, который REG_MULTI_SZ, разделять строки это тоже хорошо, в InnoSetup используется {break}, но это всё относительно записи, нафига это всё надо для чтения, ведь откуда известно что я считаю регридом? Ведь было бы известно, тогда бы и читать не нужно! :) ? Одним словом как читать дворд, мултисз, экспанд итп...? Бывает, кстати неизвесно вообще заранее какой тип, хотя это отдельный вопрос. |
т.е., при чтение данных из реестра, Вы желаите указать тип считываемых данных, так?
если так, - то зачем? помойму в справке по RegRead этого не требуется: Цитата:
|
И поэтому я получаю:
Код:
Windows Registry Editor Version 5.00 Код:
Switch @OSArch К слову сказать утилита reg.exe, тоже не пригодна, так как экспортировать умеет весь "keyname", целиком. А это неудобно, нужны только выборочно "valuename" ! |
т.е. получется:
Цитата:
|
Код:
[HKEY_CURRENT_USER\Software\DashSignature\Knagalis] |
так уже похоже?
Код:
$sSerial = 'VMKJGNDIDNWLDMKJGNDIDNWLD' |
Да пожалуйста! Только мне странно, что сам RegRead() не разбирает типов! Ну это нивкакие ворота! Что за экспорт всё в одну кучу в REG_SZ :(
Цитата:
Только я боюсь, что такой ручной парсинг всёравно упрёться в ошибки, так как могут переносы строк встретиться. Но а как узнать где и когда! Хотя вроде бы перенос осуществляется двумя байтами нулей? "00 00" Там как бы юникод чтоль, по два байта на символ...? Эх, как я однажды влез в PendingFileRenameOperation, так и не понял что к чему там, опять такая же история... Мне просто нужен способ для разных программ, чтоб каждый раз не искать решение. :( А всё же о чём говорилось в справке? "use with StringSplit(..., @LF) to get each entry." |
Цитата:
1 либо что то не доконца мы понимаем 2 либо действительно тупизм )) ...сожалею, но точного ответа не знаю.. вариант без слешей: Код:
Local $sSerial, $i, $sSerialResult а слеши там точно нужны? если вставлять серийник в програму от которой он без слешей - все сработает? можно судить так: ставить слеш после первых 11 пар, далее ставить после каждых 13 пар... |
Очень любопытно! :) +1
Таг, теперь бы реализовать полностью. Получиться? Если там нули ко всем символам прибавляються, интересно это ASCII чтоль? Ну хотябы так хорошо будет! Пробел не нужен > ',00,' в регсинтаксе это идёт подряд без пропусков.... Слеши добавишь? ЗЫ я и не задумывался никогда, чтоли второй байт юникода всегда равен нулю? Хм зачем он тогда нужен :) или это лишь в китайском используют этот байт? Похоже что в нормальном языке всегда нуль! Тогда это удобно будет! Сейчас я слеши уберу из регфайла и проверю! Да не нужны! Это видимо для читабельности регфайлов придумали! Проверил. "valuename"=hex(2):юникод,через,запятые+(плюс два байта нулей= ) 00,00(так сказать закрывашка) |
...я уже почти и слеши расставил, думал над красотами ))
но если не нужны - то так: Код:
Local $sSerial, $i, $sSerialResult осталось проверить верность всех цыфирок ) вся разбивка совпадает, все ок .. |
Я наверное убью себя! :) Попробовал вписать параметр как REG_SZ и он подошёл!
Интересно это во всех случаях так или просто совпадение!? Хотя нет, я вот точно знаю что %SystemRoot% нельзя заменять на REG_SZ ибо он не будет работать! А у нас здесь по любому же вопрос стоит опредилить сабж, а не мои конкретные проблеммы. Так что это всё не зря! :) Если можно добавь и слеши, чтоб неподкопаться было ;- |
по идее это юникод....ща копну....
вот так уже правильней: Код:
MsgBox(0, '', Hex(AscW('V'))) |
Я выяснил, что первая строка отсекается неравномерно! Вернее учитывается длина "VolumeName"=
и получается, что зависит от длины имени, так что не знаю стоит ли слеш делать, всёравно не угадать. Я о том, что если имя параметра одна буква, то юникодов строка будет длинной, иначе короткой. Но далее уже по 25 символов до слеша - это похоже постоянно. |
вриант:
Код:
Local $sSerial, $i, $sSerialResult |
Я вот тут баловался :)
Странные параметры - Код:
Windows Registry Editor Version 5.00 Цитата:
|
Цитата:
а если попробовать так? |
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 файл и подключить его к своему скрипту. |
Я уже проверил на своём скрипте, работает правильно! Благодарю!
|
эта штука рулит,
стоило нам подумать головой и сэкономили бы время ))) |
Хоть бы рассказал что там нашёл!? :)
Набрав 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, стоп, стоп.
я запутался. чуть выше опубликовал ссылку на офф форум, где есть разработка на альтернативные функции RegRead и RegWrite. чем они лучше / хуже не знаю, поэтому и запостил - что бы проверить. так вот, эти функции ты проверял / пробовал? какой результат? |
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> Но чтоб написать корректный регфайл, это только с твоей помощью можно с твоими парсингами строки. :) |
так.
Ключ реестра: 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 вопрос, почему у тебя результат чтения: VMKJGNDIDNWLDMKJGNDIDNWLD или я что то не то делаю/проверяю? |
proxy, у тебя не верно. Там REG_EXPAND_SZ, у тебя REG_MULTI_SZ.
Я сам пока мы это дискутировали, не раз запутывался :) Одна из моих ошибок была, создание регфайла с [HKCU\....], что неподдерживается в регфайлах. Я раза два по запарке так написал. :) Цитата:
Поясню... суть в том, чтобы зделать правильный регфайл в котором встречается 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, объясни понятней ))))))
разбить строку слешами? - это нужно? опять же, а так правильно? просто, даже с 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):" понимаешь? То есть у тебя всё так и записалось в реестр как в листинге. Твой: ![]() правильный: ![]() Цыфры живут только внутри регфайла, а автоит шурует напрямую в чём и загвоздка. Эти юникоды с запятыми нужны только для записи в 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,\ Саму длину строки посчитай чтоб я не ошибся? |
semiono, я до сих пор в не до понимании )
* для того, что бы созданный reg файл записывал в реестр значение: VMKJGNDIDNWLDMKJGNDIDNWLD с типом величины: REG_MULTI_SZ * надо, что бы в reg файле, это значение было в виде циферок (юникод). * а так как autoIt скрипт считывает значение в виде: VMKJGNDIDNWLDMKJGNDIDNWLD, надо это значение конвертировать в юникод, что бы сохранить в reg файле. правильно понимаю? Цитата:
в общем, напиши, что и как формировать - чем смогу - помогу )))))))))))))))))) |
Да! Но там не только юникод, там ещё и запятые и слеши с переменной длиной первой строки, ты же понимаешь? А так всё верно!
Вот код, хочу напомнить. Но там проблема какраз вышла из-за разных типов. То есть это недоделанный скрипт... Код:
Switch @OSArch Но так как на этом скрипте дело не стало, то хочется и другие ситуации предусмотреть, в часности REG_EXPAND.. На будущее! Вся фитча вот здесь происходит: Код:
$sFile_Content = _ |
значит сейчас необходимо:
1. доделать, что бы расставлялись слеши, по какомоту мистичискому принципу. 2. Цитата:
|
proxy, я тебе предлагаю так же помимо моей затеи разработать инклюд для корректного экспорта параметров реестра в валидный регфайл! Это имхо будет полезно всем :)
Цитата:
|
да с удовольствием, да только пока не все понял: что / куда/ зачем ))))))))))
Цитата:
Т.е. это набор функций, которые находятся во внешнем файле. Это для удобства. Так как эти функции, в большинстве случаев, используются в том виде, в каком они есть, т.е. без их редактирования. Цитата:
semiono, а на том форуме ты под ником AZJIO ? :spy: и не надо каждый мой пост отмечат благодарностью - лучше только те, которые дейтсвительно содержат решение вопроса )))) |
AZJIO хе-хе :) Не это не я! Я повозможности всегда семёно. Очень был зол когда на @gmail это имя моё кто-то занял )))
:spy: < +1 гыгы! я даже понимаю почему этого нет, потому что ShellExecute ( "reg.exe", "export ""HKCU\Software\aa"" C:\MyReg.reg") Но тут мы опять получаем reg.exe export /? такой, какой он есть, без всякого выбора конкретного параметра :\ |
а как вот такой вот reg файл, и не надо слешей:
Код:
Windows Registry Editor Version 5.00 Вот такой же вариант как понимаю устроит?? )) |
и вот такой вот получается скрипт:
Код:
Opt('MustDeclareVars', 1) |
Цитата:
Предлагаешь без слешей? Хорошо, я знаю что без них можно. Это майкрософт придумали для красоты переносы строк, поэтому фиг с ними. Там я писал уже, что на REG_SZ заменил. Но в других случаях это нельзя делать, ключи содержащие переменные пути, напр. %SystemDrive% не будут работать в системе через обычный REG_SZ. Поэтому сам тип лучше соблюдать где встречается. Спасибо, ты помимо всего ещё и организовал лучше мой скрипт, хотя я ещё не проверял, но красивше стало, я сам даже не втыкаюсь как пральна всякие Local юзать :) А что свитчеры опустил, так лучше? Я хочу чтоб x86_x64 на весь код влияло глобально, так как часто в программах это нужно по всему коду. Я вообще-то делаю как бы шаблон, чтобы его перекидывать на много приложений, чтоб меньше потом писать... Щас почитаю, подумаю над этим. Цитата:
и потом её как-то заполнить RegExp-ами, чтоб между символами запятые разделители вставить. Это реально? Тогда можно даже и не ascii контент считывать в регфайл, любой bin- контент :) |
proxy, поправочка моя
Код:
'"SN"=' & $sSerialResult & ",00,00" & @CRLF & @CRLF Но так всё очень превосходно! :) Пора тему закруглить, и завести новую, сугубо по параметрам, без всяких "программ" |
Цитата:
Цитата:
Цитата:
в принципе: Hex(Asc(StringMid - тут и получаем юникодовское кодирование.......... |
Время: 01:54. |
Время: 01:54.
© OSzone.net 2001-