[Code] 部分中的数组变量和动态访问

2023-12-03

我的安装程序有Components与可下载文件相关联。这些东西在不同的构建中都在变化,所以我正在使用#insert来创建[Components]部分以及相应的条目[Files]部分。 其中一些组件依赖于常见的可下载文件。

现在,为了在下载页面中包含正确的 url,我当前正在定义数组变量,这些变量的命名类似于组件,并且具有所需可下载文件的名称作为值,例如:

#dim myfeature[2] {"01aed27862e2087bd117e9b677a8685aebb0be09744723b4a948ba78d6011bac", "677756ac5969f814fd01ae677dbb832ab2e642513fea44ea0a529430d5ec1fdc"}

在下载页面的代码中,我正在检查通过以下方式选择了哪些组件WizardSelectedComponents()将字符串转换为字符串数组后,我试图访问之前定义的变量,这就是我失败的地方:

function GetDownloads(): Array of String;
var
  Downloads: Array of String;
  SelectedComponents: String;
  SelectedArray: Array of String;
begin
  SelectedComponents := WizardSelectedComponents(False);
  // a custom procedure to parse the comma seperated string
  SelectedArray := ParseArray(SelectedComponents, SelectedArray);

  // trying to get to the constant array now this works:
  MsgBox(ExpandConstant('{#myfeature[0]}'), mbInformation, MB_OK);

  // same but trying to use the selected component value returns this as a literal
  // '+SelectedArray[0]+' instead the expanded value
  MsgBox(ExpandConstant('{#' + SelectedArray[0] + '[0]}'), mbInformation, MB_OK);
end;

所以我明白有些事情发生了#标记,但我找不到正确解决此问题的方法。

谢谢你! 马库斯


ExpandConstant扩大Inno Setup“常量”, not 预处理器价值观。也可以看看在 Inno Setup Pascal 脚本中评估运行时的预处理器宏.

您无法使用运行时索引访问预处理器编译时数组的元素。

如果您了解 C/C++,就好像您尝试执行以下操作:

#define VALUE1 123
#define VALUE2 456

int index = 1;
int value = VALUE ## index

我不太确定我完全理解你在做什么。但似乎您需要在编译时从各种来源创建一个数组并在运行时使用它。

有几种方法可以用于此目的。但您肯定需要在运行时初始化运行时数组。但是初始化它的代码可以在编译时生成。

下面是该方法的一个示例(最后还有一些其他方法的链接)。

在脚本的开头,定义这些支持函数:

[Code]
var
  FeatureDownloads: TStrings;

function AddFeature(
  Feature: Integer; CommaSeparatedListOfDownloads: string): Boolean;
begin
  if not Assigned(FeatureDownloads) then
  begin
    FeatureDownloads := TStringList.Create();
  end;
  while FeatureDownloads.Count <= Feature do
    FeatureDownloads.Add('');
  if FeatureDownloads[Feature] <> '' then
    RaiseException('Downloads for feature already defined');
  FeatureDownloads[Feature] := CommaSeparatedListOfDownloads;
  Result := True;
end;
#define AddFeature(Feature, CommaSeparatedListOfDownloads) \
  "<event('InitializeSetup')>" + NewLine + \
  "function InitializeSetupFeature" + Str(Feature) + "(): Boolean;" + NewLine + \
  "begin" + NewLine + \
  "  Result := AddFeature(" + Str(Feature) + ", '" + CommaSeparatedListOfDownloads + "');" + NewLine + \
  "end;"

在您的组件包含文件中,执行以下操作:

#emit AddFeature(2, "01aed27862e2087bd117e9b677a8685aebb0be09744723b4a948ba78d6011bac,677756ac5969f814fd01ae677dbb832ab2e642513fea44ea0a529430d5ec1fdc")

如果您添加:

#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")

到主脚本的末尾,您将在Preprocessed.iss由预处理器/编译器生成#emit指示扩展到:

<event('InitializeSetup')>
function InitializeSetupFeature2(): Boolean;
begin
  Result := AddFeature(2, '01aed27862e2087bd117e9b677a8685aebb0be09744723b4a948ba78d6011bac,677756ac5969f814fd01ae677dbb832ab2e642513fea44ea0a529430d5ec1fdc');
end;

现在你有FeatureDownloads您可以使用以下方式访问 Pascal Script 运行时变量FeatureDownloads[SelectedArray[0]]获取逗号分隔的字符串,您可以将其解析为单独的下载。

这可以优化/改进很多,但我不知道/理解你的任务范围。但我相信,一旦你掌握了这个概念(一开始可能会很困难),你就能自己做。


另外一个类似的问题:

  • 在 Inno Setup Pascal Script 中运行时评估来自预处理器的数据集合(简单的例子,一开始更容易掌握)
  • 注册表部分的脚本功能(与时代略有不同的方法事件属性尚不可用 - 这是你的问题)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Code] 部分中的数组变量和动态访问 的相关文章

  • 在使用 Inno Setup 安装期间报告已安装的 .NET Framework 版本

    我正在尝试使用 Inno Setup 来准备创建安装程序 我的第一次尝试是向用户报告当前安装了哪个 NET Framework 我想出了以下脚本 它安装了一个令牌 exe 但它没有显示我想要显示已安装的框架版本的消息框 Setup AppN
  • 如何根据我的应用程序版本自动设置 Inno Setup 安装程序的版本?

    我正在使用 Inno Setup 来生成我的应用程序的安装程序 如何设置setup exe的版本号 VersionInfoVersion 由 Inno 生成以自动与我的应用程序的版本号匹配 现在 每次部署应用程序的新版本时 我都需要手动更新
  • 是否可以使用 INNO 脚本移动现有目录/文件?

    我们最近对一个使用 INNO 脚本安装的应用程序进行了重大重组 不幸的是 该应用程序需要某些文件在不同版本之间保持不变 更不幸的是 这些文件的位置在这次重组期间发生了变化 最不幸的是 现在由我来制作一个 INNO 脚本片段 它将查看这些文件
  • Innosetup 添加多个 exe 文件并在主设置中执行

    我想知道如何添加额外的安装 exe 并使用 innosetup 与我的主 exe 一起执行额外的 exe 请帮助我 因为我在过去 3 天里一直在尝试这个 因为我是 innosetup 的新手 谢谢 最简单的方法是在 Run 部分调用附加的
  • Inno Setup 仅卸载部分组件

    我有一个通用的应用程序 例如媒体播放器 用于安装在同一文件夹中的每个不同的零售产品 即 C 程序文件 myapp 并且不同的内容 例如电影 都安装在同一个文件夹中 C 程序文件 myapp 电影 对于每个单独的安装 单独的零售产品 我只是创
  • Inno Setup - 更新时删除旧的/过时的文件

    所以 我意识到这个问题以前已经被问过 事实上 在写这篇文章之前 我读了其中的 10 篇文章 但没有一个有适用的解决方案 我希望现在有人已经找到了一些东西 问题 我的程序是使用脚本构建的 在单个文件夹中创建所有最终文件 这些文件包含在 inn
  • 如果在 Inno Setup 中更新安装,则排除 ssPostInstall 步骤中的部分代码部分

    我尝试对两者使用相同的安装程序 全新安装和更新 因此 如果用户第一次尝试安装我的应用程序 它将运行完整安装 包括 MySQL 安装程序作为先决条件 以及 MySQL 安装的一部分 Code 就会正常执行 但是 如果用户已经安装了我的应用程序
  • Inno Setup 卸载进度条更改事件

    有没有类似的事件 函数CurInstallProgressChanged对于进度条CurProgress and MaxProgressInno Setup 中卸载表单中的值 对此没有本机支持 您可以做的是设置一个计时器并观察时间的变化Un
  • 安装到 {sys} 的文件/DLL 未出现在 C:\Windows\system32 中

    我不知道为什么 但是当我尝试将文件从安装目录复制到system32 尽管在 Inno Setup 中显示安装成功 但它未能执行此操作 这是我的代码 Files specifies what files will be included in
  • Inno Setup 选择一个目录来安装预定义集中的文件

    在这种情况下 我需要将文件安装到特定目录 但在不同的计算机上它可能位于不同的文件夹中 所以我需要检查哪个是正确的 例如 我有一个文件 需要将其安装在A文件夹或B文件夹或C文件夹 取决于计算机有A or B or C 所以我需要先检查一下计算
  • 使用 inno setup 安装时检查可用端口

    我正在尝试在 inno setup 中创建以下功能 用户被要求输入他们希望我的应用程序进行通信的端口 一旦他们进入端口 他们就可以点击检查按钮 此检查按钮将运行一些代码来查看安装计算机上的端口是否可用 到目前为止 我可以为用户创建输入框来输
  • Inno Setup 无法导入 DLL

    我没有运气将 Delphi DLL 导入 Inno Setup Unicode 该DLL有一个简单的过程 procedure Foo stdcall begin end exports Foo 该 DLL 包含在安装程序源中 并添加到文件列
  • 从 Inno Setup 项目内部调用 MySQL

    我正在为一些使用 MySQL 的软件编写安装程序 我正在尝试运行 sql用于在安装时设置数据库的脚本 唉 我目前在执行它时遇到了很大的问题 这个问题似乎是由于这样一个事实而产生的 当你设置一条通往 sql文件内的 execute SOURC
  • Inno-Setup:在消息框中使用自己的按钮文本

    良好的 GUI 设计中的常见做法是不使用是 否消息框 而是为按钮提供真实名称 例如保存或丢弃 我们如何在显示的消息框中实现这一点MsgBox在 InnoSetup 中 至少对于我们在代码部分中显示的那些 The MsgBox http ww
  • Inno Setup:允许用户只选择可以安装软件的驱动器?

    我可以允许用户只选择要安装软件的驱动器吗 例如 他们可以选择C or D drive C Software D Software 但用户不能指定任何其他内容 就像他们不能选择安装下面的软件一样Downloads or MyDocumnets
  • Inno Setup安装先决条件[重复]

    这个问题在这里已经有答案了 我正在通过 Inno Setup 创建一个安装程序 我看到很多关于如何检测先决条件是否存在的代码示例 但没有任何关于当我找不到先决条件时如何实际安装先决条件的代码示例 我确信它非常简单 但是我该如何安装先决条件呢
  • 在 Inno Setup 中单击“下一步”按钮时验证自定义页面上的数据

    我已经设法获得一个基本脚本来显示向导 使用CreateInputFilePage 供用户识别我用来更新 XML 文件中某些设置的文件位置 但是 我想对所选文件的输入进行一些基本检查 而不是简单地接受用户提供的任何内容 例如 如果用户在内容无
  • Inno Setup - 如何在安装过程中读取 INF 文件

    我需要知道如何在安装过程中从 INF 文件 inf 读取值 我希望安装程序检查我要更新的程序的版本 该程序版本不存储在注册表或任何其他文件中 仅存储在 inf 文件中 然后必须从中获取版本 我得到了你的答案 Trama 我无法使用 DLL
  • Inno Setup 从 .NET Framework 4.5(或更高版本)安装程序获取进度以更新进度栏位置

    我目前正在安装 NET Framework 4 6 2 作为先决条件PrepareToInstall事件函数 以便我可以获得退出代码 设置NeedsReboot状态 或者如果安装失败则中止 我的代码如下 一切正常 var PrepareTo
  • 是否可以使用 Inno Setup 更改安装程序的窗口标题栏?

    是否可以使用 Inno Setup 更改安装程序的标题栏 默认情况下是 AppName My Program 当您运行安装程序时 标题栏中会出现 设置 我的程序 是否可以隐藏这个词 Setup 将以下行添加到您的 InnoSetup 脚本文

随机推荐

  • r - 如何根据另一列的数值序列动态添加列[重复]

    这个问题在这里已经有答案了 如何根据另一列的数值序列在数据框中动态添加列 我想添加n根据另一列的值将列转换为数据帧 我拥有什么以及我想要拥有什么 我有这个 head df x y 1 1 ola 2 2 ola 3 3 ola 4 5 ol
  • HTML 到图像 .tiff 文件

    有没有办法将 HTML 字符串转换为 Image tiff 文件 我正在使用 C NET 3 5 要求是为用户提供进行确认的选项 确认是使用 XML 和 XSLT 创建的 通常是通过电子邮件发送的 有没有办法可以获取由转换 HTML 字符串
  • docker-compose 中卷的权限

    我想创建带有卷和自定义组的 docker 容器 但在容器内遇到权限错误 所有文件都具有例如 自定义组 并且工作正常 但文档文件夹默认具有根组 我认为这是由于数量所致 如何将文档文件夹设置为 自定义组 我的代码如下 volumes base
  • javascript Node.js next()

    我看到很多用处next在 Node js 中 它是什么 它从哪里来 它有什么作用 我可以在客户端使用它吗 抱歉 这里使用的是 http dailyjs com 2010 12 06 node tutorial 5 查找 loadUser 函
  • 多域、单节点(express)应用程序

    我正在尝试创建简单的节点应用程序 用户可以在其中创建配置文件 默认情况下 他的个人资料的 url 应类似于 user1 myappname com 但是当用户填写自定义域输入 并将该域指向我的应用程序 IP 地址 时 他应该能够使用此自定义
  • 如何在数据表中的第一列标题添加垂直线?

    我想在 DT 表列标题中添加一条垂直线 有在帖子中添加此行的指导如何向数据表添加垂直线 但它适用于手动设置列的静态表 而在我的 MWE 代码 底部 中 列是使用lapply 在反应性设置中起作用 因此 在我的特定情况下 我在使用本指南时遇到
  • 在 php 中测试给定字符的大写或小写类型的最佳方法是什么?

    无论当前本地语言如何 检测字符是大写还是小写的理想方法是什么 有没有更直接的功能 假设 将内部字符编码设置为 UTF 8 并且本地浏览器会话是 en US en q 0 5 并且已安装多字节字符串扩展 不要使用 ctype lower 或
  • 当 Typescript 具有不同的参数计数时,有没有办法让 Typescript 认为函数类型不相等?

    考虑以下代码 function typeTest callback item1 number item2 string gt number number return callback 5 foo This works typeTest n
  • 使用 ggplot2 绘图:“错误:在分类 y 轴上提供连续刻度的离散值”

    下面的绘图代码给出Error Discrete value supplied to continuous scale 这段代码有什么问题 它工作正常 直到我尝试更改比例 所以错误就在那里 我试图从类似问题中找出解决方案 但不能 meltDF
  • 删除 git 中的分支是否会将其从历史记录中删除?

    来自svn 刚刚开始熟悉git 当git中删除一个分支时 它会从历史记录中删除吗 在svn中 您可以通过恢复删除操作 反向合并 轻松恢复分支 与 svn 中的所有删除一样 分支从未真正删除 它只是从当前树中删除 如果分支实际上从 git 的
  • Linux 中的 java.lang.UnsatisfiedLinkError

    我已经成功进入 Linux 机器来尝试中建议的 HotKey 库这个答案 我已经编译了示例代码 现在运行该程序并收到以下消息 oracle machine jxgrabkey 0 2 1 i386 java classpath lib JX
  • 在 Mercurial 中合并时排除文件

    我将 Mercurial 与 TortoiseHg 一起使用 我有两个分支 A and B 有两个文件 toto cs and titi cs 当我想合并时有办法吗B with A 排除titi cs不合并 并且仅合并toto cs 如果可
  • 为什么使用await后控制台仍然退出?

    using System using System Threading using System Threading Tasks namespace application public class Files public static
  • L5.6 - 数据透视表上的关系

    我有一个关系pivot桌子 我怎样才能扩展它 例如 shops id name products id name 产品商店 产品编号 shop id field 1 field 2 field 3 表A id table A id name
  • WebSphere Message Broker - 如何发送 PCF 消息

    我们需要从 MB 流发出一些 MQ 命令 解决方法是发送 PCF 命令 但我不知道如何创建它 有什么指点吗 塞巴斯蒂安 要通过 PCF 消息向 MQ 队列管理器发出命令 您可以查看 nix 上或安装 MQ 的位置的 opt mqm samp
  • 如何删除 Postgres 中两行重复数据之一?

    我正在使用 Postgres 9 5 我有以下查询 旨在查找表中相同的数据行 但具有唯一的 ID select e name e day e distance e created at e2 created at from events e
  • 在应用程序退出时保存变量

    我有一个简单的 iPhone 应用程序 具有多个视图和 5 个不同项目的列表 这些项目附加了变量 无论用户在应用程序中的哪个位置 这些变量都会传递到每个新视图 Example var Peron1 String var Person1Age
  • 没有数据库/框架的Asp.net mvc模型

    是否有关于如何创建 ASP NET MVC 应用程序而不由数据库管理模型 通过 linq2sql 或实体框架 的教程 示例 我必须为具有基于 json 的 api 的服务器创建一个前端 我想使用 mvc 3 或 2 并且保留 mvc 的大部
  • 如何重建全部?

    在 Visual Studio 中 如何重建完整的解决方案 包括所有配置 如果我选择 重建解决方案 它总是仅重建 调试 或 仅发布 但绝不会同时重建两者 使用批量构建选项 右键单击解决方案即可查看它 这是一个屏幕截图 VS2010 但我相信
  • [Code] 部分中的数组变量和动态访问

    我的安装程序有Components与可下载文件相关联 这些东西在不同的构建中都在变化 所以我正在使用 insert来创建 Components 部分以及相应的条目 Files 部分 其中一些组件依赖于常见的可下载文件 现在 为了在下载页面中