编辑问题是注册表条目中的字符串数据太长,NSIS无法读取。手动缩短字符串解决了这个问题。显然,新的问题是如何从注册表中读取长字符串值.
我正在尝试从注册表中阅读ffdshow的白名单。我已经找到了特定的注册表条目,它在HKEY_CURRENT_USER\Software\GNU\ffdshow中。这是一个很长的应用程序列表。

我试着像这样阅读注册表条目:
ReadRegStr $R0 HKEY_CURRENT_USER "Software\GNU\ffdshow" "whitelist"
DetailPrint "Values: $R0"不幸的是,R0似乎是一个空字符串。

如前所述,缩短白名单字符串解决了问题,但我如何才能恢复如此长的字符串呢?我想把我的申请附在清单上。
发布于 2015-02-18 13:34:58
默认情况下,NSIS可用,内部字符串长度为1024字节。如果您读取的字符串大于1024字节,则可能会截断或取消该字符串,因为它的缓冲区对于注册表查询来说太短。
一种解决方案是使用使用较长字符串长度编译的NSIS版本。这种带有8k字符串的版本可以从NSIS的特殊建筑页面获得。如果需要其他构建时设置,也可以自己重新编译它。
发布于 2015-02-18 18:14:30
使用NSIS长字符串构建是一种权宜之计,当字符串超过该限制时,您会做什么?遗憾的是,NSIS对字符串的支持时间不超过内部字符串限制,您唯一的选择是调用本机Windows函数或编写处理任务的自定义插件。
仅仅读取字符串是很困难的,甚至在我们考虑解析它之前:
#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}
SectionEndhttps://stackoverflow.com/questions/28579862
复制相似问题