【问题标题】:How to set ISPP defines based on default Inno Setup variables?如何根据默认的 Inno Setup 变量设置 ISPP 定义?
【发布时间】:2011-02-18 16:36:28
【问题描述】:

我试图:

#define CommonAppData {commonappdata}

但它会产生:

编译器错误

[ISPP] 应为表达式,但找到了左大括号 ("{")。

如何使用 Inno Setup PreProcessor 实现这一点?

【问题讨论】:

  • 为什么要把变量定义成常量,不能直接把常量写到定义变量的地方吗?
  • @jachguate 你好,伙计! =) 我总是在我的 SO 问题中使用过于简单的例子。真实的代码比你看到的有用得多。我向你保证。
  • 您好!我不介意代码没有用,事实上我很欣赏你没有显示所有代码只是为了问一个问题......我的意思是我没有看到这样的定义有用的用途...... . 如果你详细说明你想得到什么......
  • 这取决于您打算使用该定义的目的。您是否对编译安装程序的机器或运行已编译安装程序的机器上的 common app data 文件夹的路径感兴趣?请参阅我关于如何处理这两种情况的回答。

标签: preprocessor environment-variables inno-setup pre-compilation


【解决方案1】:

{commonappdata} 不能在编译时扩展,即当预处理器运行时,因为它只在运行时才知道:它标识了运行已编译安装程序的机器上的公共应用程序数据目录.

如果您能阐明您打算如何使用该定义,我们或许可以提供帮助。例如,如果您真正感兴趣的不是目标机器上的通用应用程序数据目录,而是开发者机器上的目录,那么您可以使用这个:

#define CommonAppData GetEnv("COMMONAPPDATA")

但是,如果您打算使用该定义来填充本身能够在运行时扩展常量的 Inno 属性,那么您应该使用这个:

#define CommonAppData "{commonappdata}"

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    #define 是一个 inno setup 预处理器指令,处于预编译阶段。它的工作原理很像 C 预处理器。

    通过定义一个预处理器变量,我们强制编译器在ispp定义被解析后看到一个脚本:

    Inno Setup Preprocessor (ISPP) 是 Jordan Russell 的 Inno Setup 编译器的附加组件。从技术上讲,它是 GUI(您的 Inno 设置脚本)和编译器之间的附加层,它在传递文本之前截取并修改它,通过在脚本文本中使用特殊指令告知它。

    也就是说,我无法在文档中找到源代码,也没有时间深入研究源代码,但我很确定在此预编译期间 inno 设置变量不可用。

    如果您只是希望定义的变量包含字符串{commonappdata},请直接在您的源代码中使用它...如果您希望定义的变量具有 commonappdata 的运行时值,似乎不可能我,因为该值是在运行时确定的,因为它的当前值取决于目标机器(Windows 版本、语言等)。

    如果您三思而后行,那么在预编译或编译时尝试使用该值是没有意义的……这就是带来诸如{commonappdata}{destdir} 之类的设置常量的全部事实等存在...您可以在编译时以标准方式表达一个未知但有意义的值,该值将在运行时被知道和评估。

    【讨论】:

      【解决方案3】:

      您可能需要摆脱大括号。比如:

      #define CommonAppData {{commonappdata}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-06
        • 1970-01-01
        • 2013-03-28
        • 2011-12-17
        • 1970-01-01
        • 1970-01-01
        • 2011-02-07
        • 1970-01-01
        相关资源
        最近更新 更多