0

编辑:到目前为止,我包含的所有标题都是MUI.nsh. 我认为这应该排除将 LogicLib.nsh 和 Section.nsh 包含在脚本的其他部分中的选项。

尽管有我在下面发布的脚本,但代码仍然可以编译。

好的,我将 NSIS 脚本中那些看起来像!include MUI2.nsh名称空间的部分称为。我需要更清楚地了解哪些是我真正应该!include在我的代码中使用的命名空间。以下是我的困惑:

1)我有这样的代码:

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
Page custom DbPage "" ": Information Page"
Page instfiles
!insertmacro MUI_PAGE_FINISH

这基本上意味着我也在使用自定义的 InstallOptions 页面。所以我想我需要包括!include InstallOptions.nshand !include MUI.nsh。有用。但令我惊讶的是,即使我不包括!include InstallOptions.nsh代码编译,我也看不出最终结果有什么不同!但如果我只包含!include MUI2.nsh,则代码无法编译。但如果我包含!include MUI2.nsh & !include InstallOptions.nsh. 那么我应该包括什么,!include MUI.nsh单独还是!include MUI2.nsh&的组合!include InstallOptions.nsh. 如果我包含所有!include MUI2.nsh,!include InstallOptions.nsh!include MUI.nsh. 在这种情况下,宏和函数将从!include MUI2.nsh!include MUI.nsh??

2)我使用此处定义的函数来查看是否选择了一个部分,如下所示:

SectionGetFlags ${Section_Name} $R0 
IntOp $R0 $R0 & ${SF_SELECTED} 
IntCmp $R0 ${SF_SELECTED} show 

该链接要求包含!include Sections.nsh,但对我来说,即使不包含它,脚本也会编译。为什么??我应该理想!include吗?

3)我有这样的代码:

${If} ${FileExists} `$0\*.*`
${Else}
    CreateDirectory $0
${EndIf}

  ${If} $2 != <
    StrCpy $2 >
  ${EndIf}

  ${If} $3 != <
    StrCpy $3 >
  ${EndIf}

等等,所以我不应该!include LogicLib吗?即使不使用!include LogicLib.

为什么我能够在不包含适当的包/引用的情况下编译 NSIS 脚本?

更新:我在 nullsoft 的官方论坛中也得到了相同问题的答案。这讲述了同样的故事。

4

1 回答 1

1

不要称它们为命名空间,NSIS 没有命名空间!include'ed 文件被直接“粘贴”到代码中(在 !include 行所在的位置)。

1)

MUI2 对其自定义页面使用 nsDialogs,而 MUI(v1) 使用 InstallOptions。

如果在代码中需要 InstallOptions.nsh 中的宏,那么应该包含它。如果 MUI 需要它,那么它将包含它,而您无需执行任何操作。

您不应该同时包含 MUI2.nsh 和 MUI.nsh,您需要选择其中一个!

2)3)

其他一些代码已经包含 Sections.nsh/LogicLib.nsh。再次包含它并没有什么坏处,这样做是个好主意(这样您就不会依赖您无法控制的代码来包含它)。

于 2012-07-26T23:17:40.640 回答