NSIS ReadRegStr не находит раздел реестра, который существует - PullRequest
0 голосов
/ 14 февраля 2019

Я делаю простой установщик NSIS на Win 10, и у меня возникают некоторые проблемы с функцией ReadRegStr.ReadRegStr возвращает пустую строку и устанавливает флаг ошибки, который означает, что значение не может быть найдено.Это значение определенно существует (оно было сделано мной) и имеет правильный тип REG_SZ.

Такое же поведение наблюдается даже с SOME другими ключами:

  • ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ HKLM \ FooBar ( не работает )
  • ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ HKLM \ Docker Inc. \ Docker \ 1.0 ( не работает )
  • ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ HKLM \ Классы/.3gp ( работает )
  • Программное обеспечение HKCU \ Python \ PythonCore \ 3.6 \ InstallPath ( работает )

Powershell находит значениябез каких-либо проблем.

PS C:\Users\Admin\test> Get-ItemProperty -Path HKLM:\SOFTWARE\FooBar
(default)    : fb

Вот легкий nsi скрипт, который я использую

OutFile "Installer.exe"
Var FOO_VAR
!include LogicLib.nsh

Section
  ReadRegStr $FOO_VAR HKLM "SOFTWARE\FooBar" ""

  ${If} ${Errors}
    MessageBox MB_OK "Value not found"
  ${Else}
    MessageBox MB_OK "FooBar $FOO_VAR"
  ${EndIf}
SectionEnd

Все приведенные выше ключи имеют как минимум разрешение на чтение для каждого пользователя / установщика.Что еще может быть причиной этого?

1 Ответ

0 голосов
/ 14 февраля 2019

64-битная Windows имеет два «просмотра» реестра , и 32-битные приложения видят 32-битное представление по умолчанию.Вы можете использовать инструкцию SetRegView для принудительного использования 32-битного установщика NSIS в 64-битном представлении:

!include x64.nsh
!include LogicLib.nsh

Section
${If} ${RunningX64}
  SetRegView 64
  ReadRegStr ... value on 64-bit systems
  SetRegView LastUsed
${Else}
  ReadRegStr ... value on 32-bit systems
${EndIf}
SectionEnd
...