如何使用 NSIS 文本框、按钮事件?

How use to NSIS textbox, button event?

我想通过 IP 文本框和密钥文本框传递外部 .exe 参数。

这是我的设置代码。外部.exe接收三个参数。

第一个是产品名,第二个是ip,第三个是key

你不知道如何编写nsis来传递外部参数。

使用方法一头雾水

下码(Setup.nsi)

## input lincesekey, ip
Function PageInputLicenseInfo
  ReserveFile "pageInputLicenseInfo.ini"
  !insertmacro MUI_INSTALLOPTIONS_EXTRACT "pageInputLicenseInfo.ini"
  !insertmacro MUI_INSTALLOPTIONS_DISPLAY "pageInputLicenseInfo.ini"
FunctionEnd

## I want to pass external .exe parameters
Function MyCustomLicense
  #IP
  !insertmacro MUI_INSTALLOPTIONS_READ $R0 "pageInputLicenseInfo.ini" "Field 3" "State"
  ${If} $R0 == "1"
  Exec '"$INSTDIR\JCertFileGenerator.exe "/${PRODUCT_NAME},$R0""'
  ${EndIf}
  #KEY
  !insertmacro MUI_INSTALLOPTIONS_READ $R1 "pageInputLicenseInfo.ini" "Field 4" "State"
  ${If} $R1 == "1"
  Exec '"$INSTDIR\JCertFileGenerator.exe "/${PRODUCT_NAME},$R0,$R1""'
  ${EndIf}
  ## external .exe
  !insertmacro MUI_INSTALLOPTIONS_READ $R2 "pageInputLicenseInfo.ini" "Field 5" "State"
  ${If} $R2 == "1"
  File "..\ADAgent\bin\Release\JCertFileGenerator.exe"
  Exec '"$INSTDIR\JCertFileGenerator.exe "/${PRODUCT_NAME},$R0,$R1""'
  ${EndIf}
FunctionEnd

下码(pageInputLicenseInfo.ini)

Ini file generated by the HM NIS Edit IO designer.
[Settings]
NumFields=5

[Field 1]
  Type=Label
  Text=IP
  Left=6
  Right=37
  Top=8
  Bottom=19

  [Field 2]
  Type=Label
  Text=License Key
  Left=5
  Right=64
  Top=24
  Bottom=35

  [Field 3]
  Type=Text
  Left=65
  Right=274
  Top=4
  Bottom=16
  State=1

[Field 4]
Type=Text
Left=65
Right=274
Top=20
Bottom=33
State=1

[Field 5]
Type=Button
Text=확인
Flags=NOTIFY
Left=225
Right=275
Top=40
Bottom=56
State=1

如果您编写一个使用字段 3、4、5 将参数传递给外部 .exe 的方法,我将不胜感激。

你的命令行引号是错误的,你也未能在某些代码路径中提取 JCertFileGenerator.exe!

引用应如下所示:

Exec '"c:\my path\program.exe" param1 "param with spaces" /param3'

这是一个愚蠢的例子:

Unicode True
!define PRODUCT_NAME "Hello World"
Name "${PRODUCT_NAME}"
OutFile Test.exe
!include MUI.nsh
!include LogicLib.nsh
!include InstallOptions.nsh

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
Page Custom LicensekeyPageCreate LicensekeyPageNotify
!insertmacro MUI_LANGUAGE English

Function .onInit
; I'm writing the .ini directly here because this is just an example
InitPluginsDir
FileOpen [=11=] "$PluginsDir\pageInputLicenseInfo.ini" a
FileWriteUTF16LE /BOM [=11=] ""
FileClose [=11=]
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Settings" NumFields 5
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 1" Type Label
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 1" Text IP
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 1" Left 6
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 1" Right 37
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 1" Top 8
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 1" Bottom 19
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 2" Type Label
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 2" Text "License Key"
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 2" Left 5
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 2" Right 64
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 2" Top 24
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 2" Bottom 35
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 3" Type Text
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 3" Left 65
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 3" Right 274
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 3" Top 4
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 3" Bottom 16
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 3" State 1
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 4" Type Text
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 4" Left 65
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 4" Right 274
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 4" Top 20
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 4" Bottom 33
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 4" State 1
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 5" Type Button
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 5" Text "${U+d655}${U+c778}"
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 5" Flags NOTIFY
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 5" Left 225
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 5" Right 275
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 5" Top 40
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 5" Bottom 56
WriteIniStr "$PluginsDir\pageInputLicenseInfo.ini" "Field 5" State 1
FunctionEnd


Function LicenseKeyPageCreate
!insertmacro INSTALLOPTIONS_DISPLAY "pageInputLicenseInfo.ini"
FunctionEnd


Function LicensekeyPageNotify
!insertmacro INSTALLOPTIONS_READ [=11=] "pageInputLicenseInfo.ini" "Settings" "State"
${If} [=11=] = 5 ; Was the button clicked?
    !insertmacro MUI_INSTALLOPTIONS_READ $R0 "pageInputLicenseInfo.ini" "Field 3" "State"
    !insertmacro MUI_INSTALLOPTIONS_READ $R1 "pageInputLicenseInfo.ini" "Field 4" "State"
    ExecWait '"cmd.exe" /C echo "${PRODUCT_NAME}" IP=$R0 Key="$R1" &pause'
    Abort ; Stay on the current page
${EndIf}
FunctionEnd

在到达 InstFiles 页面之前在 $InstDir 中执行某些操作通常不是一个好主意,您可能想改用 $PluginsDir 或在 InstFiles 页面之后询问许可证密钥信息。