无法读取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
相关产品推荐
相关产品推荐

