1

NSIS スクリプト言語では、マクロ内からグローバル変数にアクセスするとエラーが発生します。

私の変数 installDirectory は本当にグローバルですか? マクロまたは関数内から変数 installDirectory を設定するにはどうすればよいですか (関数内で可能な場合)?

var installDirectory

!macro IdentifyDir
   IfFileExists C:\test\9.00\ Version9 AbortInstall

   Version9:
      $installDirectory "C:\test\9.00\"
   AbortInstall:
      Abort
!macroend

また、マクロや関数は NSIS で値を返すことができますか (または shd はプッシュ/ポップを使用するだけです)?

!macro IdentifyDir
   IfFileExists C:\test\9.00\ Version9 AbortInstall

   Version9:
      return "C:\test\9.00\"
   AbortInstall:
      Abort
!macroend

var installDir !insertmacro IdentifyDir # is that valid?
4

1 に答える 1

1

2つの問題があります:

  • 変数を割り当てるには、1つの割り当て命令を見逃します。文字列変数の場合、次を使用できますStrCpyStrCpy $installDirectory "C:\test\9.00\"

  • ラベルに関する別の質問で述べたように、ラベルはサブではなく、フロー制御によって到達できるいくつかの定義されたポイントのみです。したがって、ラベルにジャンプすると、別のジャンプなしで、ラベルに続くステートメントVersion9に実行されます。ステートメントの前のように別のラベルを配置しラベルの前にaを追加する必要があります(マクロは配置した場所で展開されるため、一意のラベル名を選択する必要があります。セクションや関数の場合とは異なります)AbortAbortInstallend_of_macro:!macroEndgotoAbortInstall!insertMacro(よりエレガント)2つのラベルを反転します:中止の場合、実行はそこで停止し、2番目の場合はマクロの外で続行します

!macro IdentifyDir 
    IfFileExists C:\temp\9.00 Version9 AbortInstall
AbortInstall:
    Abort
Version9:
    StrCpy $installDirectory "C:\test\9.00\"
!macroend

戻り値に関する質問については、デフォルトのレジスタ$0を使用$9$R0$R9

于 2012-05-03T08:44:19.750 に答える