You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法读取HKLM下ObjectDirectories注册表键值的问题求助

解决NSIS无法读取HKLM中ObjectDirectories注册表值的问题
  • 核心原因:ObjectDirectories的注册表值类型为REG_MULTI_SZ(多字符串值),而你使用的ReadRegStr仅支持读取REG_SZ和REG_EXPAND_SZ类型的字符串值,类型不匹配导致读取失败。

  • 解决方案:通过调用Windows API手动读取REG_MULTI_SZ类型的值,以下是可直接使用的NSIS代码实现:

!include x64.nsh
!include LogicLib.nsh

Section
SetRegView 64

; 自定义读取REG_MULTI_SZ值的宏
!macro ReadRegMultiSz _userVar _root _key _name
    Push "${_root}"
    Push "${_key}"
    Push "${_name}"
    Call ReadRegMultiSzFunc
    Pop ${_userVar}
!macroend

; 读取REG_MULTI_SZ的核心函数
Function ReadRegMultiSzFunc
    Exch $3 ; 键名
    Exch
    Exch $2 ; 键路径
    Exch
    Exch $1 ; 根键
    Push $0
    Push $4
    Push $5
    Push $6

    ; 打开注册表键
    System::Call 'advapi32::RegOpenKeyEx(i ${$1}, t "$2", i 0, i 0x20019, *p.r0) i.r4'
    ${If} $4 <> 0
        Push ""
        Goto Cleanup
    ${EndIf}

    ; 获取值的大小
    System::Call 'advapi32::RegQueryValueEx(i $0, t "$3", i 0, *i.r5, i 0, *i.r4) i.r6'
    ${If} $6 <> 0
        Push ""
        Goto CloseKey
    ${EndIf}

    ; 分配内存并读取值
    System::Alloc $4
    Pop $6
    System::Call 'advapi32::RegQueryValueEx(i $0, t "$3", i 0, i 0, p $6, *i $4) i.r5'
    ${If} $5 = 0
        ; 转换多字符串编码并替换分隔符为换行
        System::Call 'kernel32::MultiByteToWideChar(i 0, i 0, p $6, i -1, p 0, i 0) i.r5'
        System::Alloc ${NSIS_MAX_STRLEN}
        Pop $4
        System::Call 'kernel32::MultiByteToWideChar(i 0, i 0, p $6, i -1, p $4, i ${NSIS_MAX_STRLEN})'
        System::Call 'kernel32::WideCharToMultiByte(i 0, i 0, p $4, i -1, p 0, i 0, p 0, p 0) i.r5'
        System::Alloc $5
        Pop $5
        System::Call 'kernel32::WideCharToMultiByte(i 0, i 0, p $4, i -1, p $5, i $5, p 0, p 0)'
        System::Free $4
        StrReplace $5 "\0\0" "" $5
        StrReplace $5 "\0" "$\r$\n" $5
        Push $5
        System::Free $5
    ${Else}
        Push ""
    ${EndIf}

CloseKey:
    System::Call 'advapi32::RegCloseKey(i $0)'
Cleanup:
    System::Free $6
    Pop $6
    Pop $5
    Pop $4
    Pop $0
    Exch $3
    Exch
    Exch $2
    Exch
    Exch $1
FunctionEnd

; 调用宏读取ObjectDirectories值
!insertmacro ReadRegMultiSz $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager" "ObjectDirectories"

MessageBox MB_OK "The value of the ObjectDirectories :$\r$\n$0"

SectionEnd
  • 额外注意:确保安装包以管理员权限运行,读取HKLM路径下的注册表项通常需要管理员权限,普通权限会导致读取失败。

内容的提问来源于stack exchange,提问作者revanth reddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 14:17:51