首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSIS:无法读取长注册表(字符串)值

NSIS:无法读取长注册表(字符串)值
EN

Stack Overflow用户
提问于 2015-02-18 09:19:33
回答 2查看 424关注 0票数 0

编辑问题是注册表条目中的字符串数据太长,NSIS无法读取。手动缩短字符串解决了这个问题。显然,新的问题是如何从注册表中读取长字符串值.

我正在尝试从注册表中阅读ffdshow的白名单。我已经找到了特定的注册表条目,它在HKEY_CURRENT_USER\Software\GNU\ffdshow中。这是一个很长的应用程序列表。

我试着像这样阅读注册表条目:

代码语言:javascript
复制
ReadRegStr $R0 HKEY_CURRENT_USER "Software\GNU\ffdshow" "whitelist"
DetailPrint "Values: $R0"

不幸的是,R0似乎是一个空字符串。

如前所述,缩短白名单字符串解决了问题,但我如何才能恢复如此长的字符串呢?我想把我的申请附在清单上。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-18 13:34:58

默认情况下,NSIS可用,内部字符串长度为1024字节。如果您读取的字符串大于1024字节,则可能会截断或取消该字符串,因为它的缓冲区对于注册表查询来说太短。

一种解决方案是使用使用较长字符串长度编译的NSIS版本。这种带有8k字符串的版本可以从NSIS的特殊建筑页面获得。如果需要其他构建时设置,也可以自己重新编译它。

票数 1
EN

Stack Overflow用户

发布于 2015-02-18 18:14:30

使用NSIS长字符串构建是一种权宜之计,当字符串超过该限制时,您会做什么?遗憾的是,NSIS对字符串的支持时间不超过内部字符串限制,您唯一的选择是调用本机Windows函数或编写处理任务的自定义插件。

仅仅读取字符串是很困难的,甚至在我们考虑解析它之前:

代码语言:javascript
复制
#define STANDARD_RIGHTS_READ 0x00020000
!define KEY_QUERY_VALUE 0x0001
!define SRRF_RT_REG_SZ 2
!include WinCore.nsh
!include LogicLib.nsh

Function RegReadValueString
Exch $2
Exch 
Exch $1
Push $3
Push $4
Push $5
Push $6
Push $0
StrCpy $3 0
loop:
    System::Call 'shlwapi::SHRegGetValue(i$1,i0,tr2,i${SRRF_RT_REG_SZ},*i.r4,i0,*i0r5)i.r0' ; Note: This function is XP.SP2+, use RegQueryValueEx + real \0 termination on older systems
    StrCpy $6 $5
    ${IfThen} $4 <> ${REG_SZ} ${|} Goto error ${|}
    System::Alloc $5
    Pop $3
    ${IfThen} $3 = 0 ${|} Goto done ${|}
    System::Call 'shlwapi::SHRegGetValue(i$1,i0,tr2,i${SRRF_RT_REG_SZ},*i.r4,ir3,*ir5r5)i.r0'
    ${If} $4 = ${REG_SZ}
    ${AndIf} $0 = 0
    ${AndIf} $5 U<= $6
        Goto done
    ${EndIf}
error:
    System::Free $3
    StrCpy $3 0
done:
    ${IfThen} $5 U> $6 ${|} Goto loop ${|}
Pop $0
Pop $6
Pop $5
Pop $4
Exch $3
Exch 2
Pop $2
Pop $1
FunctionEnd

Section
System::Call 'advapi32::RegOpenKeyEx(i${HKEY_CURRENT_USER},t"Software\Microsoft\Internet Explorer\TypedURLs",i0,i${STANDARD_RIGHTS_READ}|${KEY_QUERY_VALUE},*i0r1)i.r0'
${If} $0 = 0
    Push $1
    Push "url1"
    Call RegReadValueString
    Pop $2
    ${If} $2 <> 0
        System::Call 'user32::MessageBox(i$hwndparent,i$2,t"The value:",i0)'
        System::Free $2
    ${EndIf}
    System::Call 'advapi32::RegCloseKey(i$1)'
${EndIf}
SectionEnd
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28579862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档