字符串中的变量——NSIS中是否可以进行字符串插值?

字符串中的变量——NSIS中是否可以进行字符串插值?,nsis,Nsis,我正在用NSIS构建一个安装程序,帮助我将cgminer部署到我地下室的一堆计算机上。安装程序要求两件事: 挖掘池URL和工作人员凭据 要在其中提取cgminer的目录 安装程序使用用户提供的池URL、登录名和密码生成一个简单的cgminer配置文件 以下是编写JSON配置文件的代码: FileOpen$9$INSTDIR\config.conf w;打开一个空文件进行写入 文件写入$9“{$\r$\n” 文件写入$9“$\”池“$\”:[$\r$\n” 文件写入$9“$\t{$\r$\n”

我正在用NSIS构建一个安装程序,帮助我将cgminer部署到我地下室的一堆计算机上。安装程序要求两件事:

  • 挖掘池URL和工作人员凭据
  • 要在其中提取cgminer的目录
安装程序使用用户提供的池URL、登录名和密码生成一个简单的cgminer配置文件

以下是编写JSON配置文件的代码:

FileOpen$9$INSTDIR\config.conf w;打开一个空文件进行写入
文件写入$9“{$\r$\n”
文件写入$9“$\”池“$\”:[$\r$\n”
文件写入$9“$\t{$\r$\n”
文件写入$9“$\t$\t$\”url$\”:$\“$POOL$\”,$\r$\n”
文件写入$9“$\t$\t$\”用户$\”:$\“$user$\”,$\r$\n
文件写入$9“$\t$\t$\”pass$\”:$\“$pass$\”,$\r$\n”
文件写入$9“$\t}$\r$\n”
文件写入$9“],$\r$\n”
文件写入$9“$\r$\n”
文件写入$9“$\”强度$\”:$\“d$\”$\r$\n
文件写入$9“}$\r$\n”
文件关闭$9;关闭文件
这就是我所期待的:

{
“池”:[
{
“url”:”http://bc.minercity.org:4583",
“用户”:“嘶嘶作响的矿工”,
“通行证”:“玫瑰花蕾”,
}
],
“强度”:“d”
}
然而,我得到的是:

{
“池”:[
{
“url”:“1639776”,
“用户”:“1115594”,
“通行证”:“1115614”,
}
],
“强度”:“d”
}
我假设我得到的是内存地址,而不是输入的字符串。以下是完整的代码:

;比特币矿业公司
;
; 建立一个基本的比特币矿工。
; 向用户询问挖掘池和用户/通行证
; 将cgminer安装到\Documents and Settings\\Local Settings\Application Data\ccc\bitcoin\cgminer
; 生成cgminer配置文件并将其放在上面的目录中
;
;--------------------------------
; 包括
!包括nsDialogs.nsh
!包括LogicLib.nsh
;--------------------------------
; 安装程序的名称
名称“比特币矿工”
输出文件BitcoinMiner.exe
; 默认安装目录
InstallDir“$PROFILE\Local Settings\Application Data\ccc\bitcoin\cgminer2”
; 请求Windows Vista的应用程序权限
RequestExecutionLevel用户
;--------------------------------
; 页
页面自定义池页面创建池页面离开
页面目录
页面文件
风险值池
变量用户
Var通行证
函数poolPageCreate
nsDialogs::create1018;创建一个新对话框并在堆栈上返回它的HWND
流行音乐0美元;新对话框的HWID存储到$0
${NSD_CreateLabel}0 0u 75%12u“池URL(例如:http://bc.minercity.org:6347)" ; 创建标签。堆栈上的HWND
流行音乐0美元;存储到$0的新标签的HWID
${NSD_CreateText}0 13u 100%12u'http://bc.minercity.org:6347'                
Pop$POOL
GetFunctionAddress$0池更改
nsDialogs::OnChange$池$0
${NSD_CreateLabel}0 40u 75%12u“登录名(例如:fizzlefazzle_miner)”
流行音乐$0
${NSD_CreateText}0 53u 100%12u“fizzlefazzle_miner”
Pop$用户
GetFunctionAddress$0用户更改
nsDialogs::OnChange$USER$0
${NSD_CreateLabel}0 77u 75%12u“密码(例如:玫瑰花蕾)”
流行音乐$0
${NSD_CreateText}0 90u 100%12u“玫瑰花蕾”
Pop$通行证
GetFunctionAddress$0 passChange
nsDialogs::OnChange$PASS$0
nsDialogs::Show
功能端
功能池页面离开
功能端
功能池更改
Pop$0#HWND
System::Call user32::GetWindowText(i$POOL,t.r0,i${NSIS\u MAX\u STRLEN})
功能端
函数用户更改
流行音乐$0
System::Call user32::GetWindowText(i$USER,t.r0,i${NSIS\u MAX\u STRLEN})
功能端
功能转换
流行音乐$0
System::Call user32::GetWindowText(i$PASS,t.r0,i${NSIS\u MAX\u STRLEN})
功能端
部分
;--------------------------------
; 要安装的东西
; 将输出路径设置为安装目录。
SetOutPath$INSTDIR
; 把文件放在那里
文件/r“cgminer\”
FileOpen$9$INSTDIR\config.conf w;打开一个空文件进行写入
文件写入$9“{$\r$\n”
文件写入$9“$\”池“$\”:[$\r$\n”
文件写入$9“$\t{$\r$\n”
文件写入$9“$\t$\t$\”url$\”:$\“$POOL$\”,$\r$\n”
文件写入$9“$\t$\t$\”用户$\”:$\“$user$\”,$\r$\n
文件写入$9“$\t$\t$\”pass$\”:$\“$pass$\”,$\r$\n”
文件写入$9“$\t}$\r$\n”
文件写入$9“],$\r$\n”
文件写入$9“$\r$\n”
文件写入$9“$\”强度$\”:$\“d$\”$\r$\n
文件写入$9“}$\r$\n”
文件关闭$9;关闭文件
分段结束

我做错了什么?

字符串插值没有问题。您的问题在于编辑文本的处理:当您声明例如

${NSD_CreateText} 0 13u 100% 12u 'http://bc.minercity.org:6347'                
Pop $POOL
GetFunctionAddress $0 poolChange
nsDialogs::OnChange $POOL $0
正确创建编辑文本并保留其句柄以在已定义的回调中使用。但后来

FileWrite $9 "$\t$\t$\"url$\" : $\"$POOL$\",$\r$\n"
文件写入将在文件中存储控制句柄,而不是其内容

回调也存在一些问题:

  • 您将不同的编辑值读入相同的
    $0
    寄存器,因此
    $0
    将包含上次修改字段的文本
  • 回调仅在编辑更改时触发,如果用户未进行更改,则不会触发回调
我将使用3个变量作为编辑句柄,另外3个变量作为值,然后读取页面离开回调中的值。此外,如果您只想获取最终值而不想对值更改做出反应,则可以删除3个回调:

!包括nsDialogs.nsh
!包括LogicLib.nsh
名称“比特币矿工”
输出文件BitcoinMiner.exe
RequestExecutionLevel用户
页面自定义池页面创建池页面离开
页面目录
页面文件
Var POOLHDL
Var USERHDL
Var PASSHDL
风险值池
变量用户
Var通行证
函数poolPageCreate
nsDialogs::create1018;创建一个新对话框并在堆栈上返回它的HWND
流行音乐0美元;新对话框的HWID存储到$0
${NSD_CreateLabel}0 0u 75%12u“池URL(例如:http://bc.minercity.org:6347)" ; 创建标签。堆栈上的HWND
流行音乐$0
 Function poolPageLeave
${NSD_GetText} $POOL $POOL
${NSD_GetText} $USER $USER
${NSD_GetText} $PASS $PASS
FunctionEnd