Registry in nsis

include "RegistryFunc.nsh"

  • Видалення всіх підрозділів реєстру по заданій масці
Як відомо, при асоціації додатки до певних типів файлів, постає проблема видалення однотипних розділів реєстру,
типу 7-zip.001, 7-zip.zip, 7-zip.rar, 7-zip.7z і т.д. Доводиться робити рутинну роботу, адже в скрипті потрібно прописувати десятки,
а часом і сотні записів на видалення підрозділів реєстру, під кожне розширення - це вельми забирає нерви і час.
$ "Ключ реєстру" "задана маска" У цьому прикладі втечуть всі розділи в HKLM. HKCU. HKCR в гілці Software / Classes починаються з імені 7-zip,
тобто по масці: 7-zip .001, 7-zip .zip, 7-zip .rar, 7-zip -7z і т.д $ "$ \ Software \ Classes" "7-zip"
$ "$ \ Software \ Classes" "7-zip"
$ "$" "7-zip"
БУДЬТЕ уважні В ВИБОРІ МАСКИ ВИДАЛЕННЯ.

  • Видалення параметрів ключів реєстру по заданій масці значень цих ключів Пошук ведеться тільки на строкові параметри: REG_SZ і REG_EXPAND_SZ
    У вікні деталей показуються віддалені ключі, якщо у вікні деталей нічого немає - значить йде пошук!
    Вказуйте гілку реєстру, наскільки можливо точніше, це потрібно
    для скорочення часу пошуку, яке може тривати досить тривалий час!
    $ "Ключ реєстру" "задана маска"
    У цьому прикладі втечуть всі значення параметрів ключів (також включаючи в вкладених ключах),
    починаються з імені 7-zip. тобто по масці: 7-zip * будь-які символи *
    $ "$ \ Software \ 7-zip" "7-zip" БУДЬТЕ уважні В ВИБОРІ МАСКИ ВИДАЛЕННЯ.

  • Видалення параметрів ключів реєстру по заданій масці імені параметра Пошук ведеться тільки на строкові параметри: REG_SZ і REG_EXPAND_SZ
    У вікні деталей показуються віддалені ключі, якщо у вікні деталей нічого немає - значить йде пошук!
    Вказуйте гілку реєстру, наскільки можливо точніше, це потрібно
    для скорочення часу пошуку, яке може тривати досить тривалий час!
    $ "Ключ реєстру" "задана маска" У цьому прикладі втечуть всі параметри ключів (також включаючи в вкладених ключах), не плутайте із значенням параметра!
    починаються з імені 7-zip. тобто по масці: 7-zip * будь-які символи *
    $ "$ \ Software \ 7-zip" "7-zip" БУДЬТЕ уважні В ВИБОРІ МАСКИ ВИДАЛЕННЯ.

    Макрос переміщує вказаний ключ реєстру, включаючи вкладені ключі і параметри ключів, в зазначений шлях в реєстрі.
    Якщо потрібно перемістити в інший ключ, який не існує - ключ буде створено.
    $ "Вказаний ключ" "куди перемістити вказаний ключ" У цьому прикладі ключ Software \ 7-zip в кореневій гілці HKCU буде преремещен (включаючи вкладені ключі) в кореневу гілку HKLM.
    $ "$ \ Software \ 7-zip" "$ \ Software \ 7-zip" Якщо ключ реєстру, який потрібно перемістити, не існує, то встановлюється прапор помилки

    Макрос переміщує параметр ключа, не плутайте із значенням параметра. в вказане місце.
    Якщо потрібно перемістити в інший ключ, який не існує - ключ буде створено.
    $ "Вказаний ключ" "ім'я параметра" "куди скопіювати вказаний ключ" "ім'я параметра" В даному прикладі ім'я параметра Path.bak ключа $ \ Software переміститься
    в параметр з ім'ям Path ключа $ \ Software \ 7-zip. $ "$ \ Software" "Path.bak" "$ \ Software \ 7-zip" "Path" Якщо параметр, який потрібно перемістити, не існує, то встановлюється прапор помилки

  • Логічна конструкція визначення ключа реєстру
  • $ $ "$ \ Software \ 7-zip"
    # Тут виконуються команди, якщо ключ існує
    DetailPrint "Ключ є!"
    $
    # Тут виконуються команди, якщо ключа не існує
    DetailPrint "Ключа не існує!"
    $

  • Конвертація рядки в HEX-код
  • $ "Рядок" $ var Максимальне число символів рядка. не повинно перевищувати або рівним - 512 символів. Для розширеної версії NSIS - 4096 символів
    Це обумовлено тим, що при перекладі строкового типу значення в HEX-код (в шістнадцятковий вид), один символ займає два байти.
    Якщо розмір рядка перевищує 512 байт (для розширеної версії NSIS - 4096 байта)
    в змінну $ var повертається значення -
    Наприклад, всім відома "Hello, World!" після обробки макросом виглядає як "48656C6C6F2C20576F726C6421"
    $ "Hello, Word!" $ 0
    Detailprint $ 0
  • Запис бінарного значення
  • $ "Ключ реєстру" "ім'я параметра" значення Так як стандартна команда WriteRegBin не дозволяє записувати бінарне значення, як значення змінної.
    $ "Hello, Word!" $ 0
    $ "$ \ Software \ My Company \ My Software" "Binary" $ 0
    Записуються дані повинні бути представлені в шістнадцятковому вигляді.
    Якщо параметра не існує, то він буде створений.
    Якщо розмір даних більше 1024 символів (для розширеної версії NSIS - 8192 символу) встановлюється прапор помилки
    Так як один символ в шеснадцітірічном вигляді займає два байти,
    довжина записуваного значення має бути парним числом - інакше встановлюється прапор помилки
    $ "$ \ Software \ My Company" "Binary" DEADBEEF012232111510
    IfErrors 0 +2
    MessageBox MB_ICONSTOP | MB_OK "error" IDOK
    Довжина значення DEADBEEF012232111510 дорівнює 20 символів, якщо видалити один символ, то встановиться прапор помилки

  • Читання бінарного значення
  • У NSIS немає стандартних команд читання мультістрокових значень з реєстру
    Читає значення параметра типу REG_MULTI_SZ в змінну $ var
    $ $ Var "ключ реєстру" "ім'я параметра" Якщо параметр не відповідає типу REG_MULTI_SZ в змінну $ var повертається значення -
    Якщо розмір значення перевищує 1024 символів (для розширеної версії NSIS 8192 символів) то,
    в змінну $ var повертається значення -
    Якщо ключа або параметра не існує в змінну $ var повертається значення -
    $ $ 0 "$ \ Software \ Microsoft \ Windows Portable Devices \ FormatMap \ .jpeg" "Format"
    MessageBox MB_OK "$ 0" IDOK

  • Перерахування всіх ключів, параметрів і значень параметрів
  • $ "Key" "Options" Function "[key]" ключ реєстру, з якого почнеться пошук

    "[Options]" / K = 0 | 1
    / K = 0 - за замовчуванням
    / K = 1 - перерахувати тільки розділи реєстру, ігнорує ключі. / V і / T

    / G = 0 | 1
    / G = 0 - не перераховувати вкладені розділи
    / G = 1 - перераховувати вкладені розділи (за замовчуванням)

    / V = ​​0 | 1
    / V = ​​0 - не перераховувати значення параметрів
    / V = ​​1 - перераховувати значення параметрів (за замовчуванням)

    / T = [REG_SZ | REG_EXPAND_SZ | REG_MULTI_SZ | REG_DWORD | REG_BINARY]
    / T = REG_SZ - перерахування тільки параметрів типу REG_SZ
    / T = REG_EXPAND_SZ - перерахування тільки параметрів типу REG_EXPAND_SZ
    / T = REG_MULTI_SZ - перерахування тільки параметрів типу REG_MULTI_SZ
    / T = REG_DWORD - перерахування тільки параметрів типу REG_DWORD
    / T = REG_BINARY - перерахування тільки параметрів типу REG_BINARY

    "Function" призначена для користувача функція зворотного виклику.

    Function "Function"
    $ 1 - розділ реєстру
    $ 2 - ім'я параметра
    $ 3 - значення параметра
    $ 4 - тип параметра
    $ R8 - коренева гілка реєстру, для інформативності в вікні деталей
    Функція використовує змінні $ R0 - $ R9, $ 0 - $ 4
    тобто у функції вільні для використання змінні $ 5 - $ 9
    якщо в змінну $ 0 помістити значення StopRegFind - перерахування буде перервано: StrCpy $ 0 StopRegFind
    в функції не можна використовувати стек
    FunctionEnd Максимальний розмір значення параметра - 1023 символу. незалежно від розширеної версії NSIS
    Значення змінних $ R0 - $ R9 і $ 0 - $ 4 до використання макросу будуть збережені і відновлені після роботи макросу
    Перерахувати в кореневій гілці HKCR тільки розділи, вкладені майданчиках не будуть перераховуватися. Section
    $ "$" "/ K = 1 / G = 0" EnumReg
    SectionEnd

    Function EnumReg
    DetailPrint "$ R8 \ $ 1"
    FunctionEnd
    Перерахувати в кореневій гілці HKCR тільки розділи, включаючи вкладені. Section
    $ "$" "/ K = 1" EnumReg
    SectionEnd

    Function EnumReg
    DetailPrint "$ R8 \ $ 1"
    FunctionEnd
    Перерахувати в SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall всі існуючі розділи, параметри і значення параметрів. Section
    $ "$ \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall" "" EnumReg
    SectionEnd

    Function EnumReg
    DetailPrint `$ R8" $ 1 "`
    DetailPrint "Ім'я параметра: $ 2"
    DetailPrint "Значення параметра: $ 3"
    DetailPrint "Тип параметра: $ 4"
    DetailPrint "--------------"
    FunctionEnd
    Перерахувати у всіх існуючих розділах значення параметрів типу REG_DWORD. Section
    $ "$ \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall" "/ T = REG_DWORD" EnumReg
    SectionEnd

    Function EnumReg
    DetailPrint `$ R8" $ 1 "`
    DetailPrint "Ім'я параметра: $ 2"
    DetailPrint "Значення параметра: $ 3"
    DetailPrint "Тип параметра: $ 4"
    DetailPrint "--------------"
    FunctionEnd
    Перерахувати у всіх існуючих розділах значення параметрів типу REG_SZ, REG_MULTI_SZ і REG_EXPAND_SZ. Section
    $ "$ \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall" "/ T = REG_SZ REG_MULTI_SZ REG_EXPAND_SZ" EnumReg
    SectionEnd

    Function EnumReg
    DetailPrint `$ R8" $ 1 "`
    DetailPrint "Ім'я параметра: $ 2"
    DetailPrint "Значення параметра: $ 3"
    DetailPrint "Тип параметра: $ 4"
    DetailPrint "--------------"
    FunctionEnd
    Перерахувати у всіх існуючих розділах тільки імена параметрів типу REG_SZ. Section
    $ "$ \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall" "/ T = REG_SZ / V = ​​0" EnumReg
    SectionEnd

    Function EnumReg
    DetailPrint `$ R8" $ 1 "`
    DetailPrint "Ім'я параметра: $ 2"
    DetailPrint "Тип параметра: $ 4"
    DetailPrint "--------------"
    FunctionEnd

    Альтернатива бібліотеки дивіться Registry: Робота з реєстром