Setup Factory 9 教程
Setup Factory 9 是由 Indigo Rose 公司开发的一款经典且功能强大的 Windows 安装程序制作工具,它通过直观的图形化界面和强大的脚本语言 (Lua) 允许开发者创建专业、美观且功能丰富的安装包。

本教程将分为以下几个部分:
- 第一部分:入门基础 - 界面介绍与创建第一个安装包
- 第二部分:核心功能详解 - 项目设置、文件、屏幕、操作
- 第三部分:进阶技巧 - 变量、条件判断、循环与错误处理
- 第四部分:实战演练 - 创建一个带条件安装和注册表操作的安装包
- 第五部分:常见问题与资源
第一部分:入门基础
1 界面概览
启动 Setup Factory 9 后,你会看到一个包含多个窗格的界面,了解这些窗格是高效工作的第一步。
- 菜单栏: 包含所有命令,如文件、编辑、视图、项目、发布等。
- 工具栏: 提供常用命令的快捷按钮。
- 项目窗格: 位于左侧,这是项目的核心,它以树状结构列出了构成你安装包的所有组件。
- 项目设置: 配置安装包的全局属性,如产品信息、默认路径、语言等。
- 文件: 包含所有需要安装到用户电脑上的文件和文件夹。
- 屏幕: 定义安装程序运行时显示给用户的界面,如欢迎界面、许可协议、文件夹选择、安装进度等。
- 操作: 包含在安装过程中执行的脚本代码,最常用的是
On Startup(启动时) 和On Finish(完成时)。 - 注册表: 配置安装和卸载时需要操作的注册表项。
- 快捷方式: 定义需要创建的快捷方式。
- INI 文件: 操作 INI 配置文件。
- 环境变量: 修改系统环境变量。
- 字体: 添加安装包需要的字体。
- 类型库: 注册/注销 COM 类型库。
- 发布: 配置如何输出和分发你的安装包。
- 属性窗格: 位于右侧,用于查看和编辑当前选中对象(如屏幕、文件、操作等)的具体属性。
- 脚本编辑器窗格: 位于底部,用于编写和编辑 Lua 脚本代码。
2 创建你的第一个安装包
让我们来创建一个最简单的安装包,目标是把一个文件夹里的文件安装到用户的电脑上。
步骤 1:新建项目

- 打开 Setup Factory 9。
- 点击菜单
文件->新建,或直接点击工具栏的 "新建" 按钮。 - 你会看到一个默认的安装项目。
步骤 2:添加文件
- 在左侧的 项目窗格 中,双击 文件。
- 在右侧的 文件窗格 中,点击
添加文件按钮。 - 在弹出的对话框中,选择你想要打包的所有文件(一个 "MyApp" 文件夹下的所有文件)。
- 点击 "确定",你会看到文件列表已经出现在窗格中。
步骤 3:配置安装路径
- 在左侧 项目窗格 中,双击 项目设置。
- 在右侧 属性窗格 中,找到
目标路径这一项。 - 默认值是
%AppFolder%\Your Company Name\Your Product Name,这是一个宏,会自动解析为C:\Program Files\Your Company Name\Your Product Name。 - 你可以修改它,例如改为
%AppFolder%\MyApp,这样程序就会被安装到C:\Program Files\MyApp。
步骤 4:预览与构建
- 按
F5键,或者点击工具栏的 "预览" 按钮,这将启动一个模拟的安装程序窗口,让你看看效果。 - 模拟安装完成后,关闭预览窗口。
- 按
F7键,或者点击菜单项目->构建。 - 在弹出的对话框中,选择输出目录,然后点击 "构建"。
- 稍等片刻,你就会在指定的输出目录下找到一个
.exe文件,这就是你的安装包了!
恭喜!你已经成功创建了你的第一个安装包。

第二部分:核心功能详解
1 项目设置
这是安装包的“大脑”,决定了安装包的全局行为。
- 产品信息: 设置产品名称、版本、公司名称、网站 URL 等,这些信息会显示在控制面板的 "添加/删除程序" 中。
- 语言: 支持多语言安装包,可以添加多种语言,让用户选择。
- 编译: 设置压缩级别、是否显示密码、是否需要管理员权限等。
- 要求: 检查系统要求,如操作系统版本、.NET Framework 版本、内存等,如果不满足,安装程序会提示并退出。
2 文件
这是安装包的“血肉”,包含了所有需要分发的数据。
- 目标路径: 每个文件或文件夹都可以单独设置其安装目标路径,可以使用宏,如:
%AppFolder%:Program Files目录%SysFolder%:System32目录%TempFolder%: 系统临时目录%StartupFolder%: 用户“启动”菜单目录%Desktop%: 用户桌面
- 属性: 可以设置文件是否为只读、是否在安装前解压、是否在卸载时删除等。
- 条件: 可以设置文件安装的条件,"仅当 Windows 版本 >= 6.0 (Vista) 时才安装此文件"。
3 屏幕
这是安装包的“脸面”,定义了用户交互的流程。
- 欢迎屏幕: 安装程序启动后显示的第一个界面,通常有“下一步”、“取消”按钮。
- 许可协议屏幕: 显示软件的最终用户许可协议,用户必须“同意”才能继续。
- 文件夹选择屏幕: 允许用户选择或修改安装路径。
- 开始菜单文件夹屏幕: 允许用户选择程序在开始菜单中创建的文件夹名称。
- 安装类型屏幕: 典型、自定义、完整等选项,这通常与 组件 功能配合使用。
- 任务列表屏幕: 允许用户选择在安装后执行的任务,如“创建桌面快捷方式”、“阅读说明文件”等。
- 进度屏幕: 显示文件复制和脚本执行的进度条。
- 完成屏幕: 安装成功后显示的界面,可以提供“运行程序”、“查看说明”、“访问网站”等选项。
提示: 你可以在项目窗格的 屏幕 部分拖动屏幕来重新排列它们的显示顺序。
4 操作
这是安装包的“灵魂”,是实现复杂逻辑的地方,操作基于 Lua 脚本语言。
- On Startup: 安装程序启动时执行,通常用于进行一些初始化检查。
- On PreShow (ScreenName): 在某个屏幕显示之前执行,常用于根据条件动态修改屏幕内容(根据注册表信息决定是否显示某个复选框)。
- On Next (ScreenName): 用户点击“下一步”时执行,常用于验证用户输入(如输入的路径是否有效)。
- On Finish: 安装完成时执行,这是最重要的操作之一,常用于:
- 运行安装好的程序。
- 提示用户重启电脑。
- 发送已安装的报告到服务器。
- 打开一个包含感谢信息的网页。
第三部分:进阶技巧
1 使用变量
变量是存储信息的容器,SF9 有两种变量:
- 项目变量: 在整个安装包中都可用的全局变量,在
项目设置->变量中定义。 - 会话变量: 仅在当前安装会话中有效的临时变量,用户选择的安装路径 (
%InstallDir%) 就是一个会话变量。
如何使用变量?
在脚本中,使用 SessionVar 和 ProjectVar 函数来读写变量。
-- 定义一个项目变量
Project.SetProperty("MY_VAR", "Hello, World!");
-- 在脚本中读取项目变量
local myValue = Project.GetProperty("MY_VAR");
Dialog.Message("Info", "项目变量的值是: " .. myValue);
-- 读取会话变量(如安装路径)
local installDir = SessionVar.Expand("%InstallDir%"); -- 使用 Expand 来解析宏
Dialog.Message("Info", "程序将被安装到: " .. installDir);
-- 设置一个会话变量
SessionVar.Set("MY_CUSTOM_PATH", "C:\\MyCustomApp");
2 条件判断
使用 if-then-else 结构来执行不同的逻辑。
-- 在 On Finish 或其他操作中
local osVersion = System.GetOSVersion();
if osVersion >= "6.1" then -- Windows 7 或更高版本
Dialog.Message("提示", "您正在运行一个较新的 Windows 系统。");
-- 执行 Windows 7 及以上版本的代码
else
Dialog.Message("提示", "您的系统版本较旧,某些功能可能不可用。");
-- 执行旧版本系统的代码
end
3 循环
使用 for 或 while 循环来处理重复性任务,例如批量操作文件。
-- 假设我们有一个文件列表,需要逐个处理
local filesToProcess = {"file1.txt", "file2.txt", "file3.txt"};
for i, fileName in ipairs(filesToProcess) do
Dialog.Message("处理文件", "正在处理文件: " .. fileName);
-- 在这里添加处理每个文件的实际代码
-- File.Copy(_SourceFolder .. "\\" .. fileName, _DestinationFolder .. "\\" .. fileName, false, true, false, true, nil);
end
4 错误处理
使用 pcall (protected call) 来捕获脚本执行中的错误,防止安装程序崩溃。
local function riskyFunction()
-- 模拟一个可能出错的函数
local x = 1;
local y = 0;
local result = x / y; -- 这里会出错
return result;
end
-- 使用 pcall 来安全地调用函数
local success, errorMessage = pcall(riskyFunction);
if not success then
Dialog.Message("错误", "脚本执行出错: " .. errorMessage, MB_OK, MB_ICONEXCLAMATION);
else
Dialog.Message("成功", "函数执行成功,结果: " .. errorMessage);
end
第四部分:实战演练
目标: 创建一个安装包,它包含以下功能:
- 安装一个主程序。
- 如果用户系统是 64 位,则额外安装一个 64 位的支持库。
- 安装完成后,自动创建一个桌面快捷方式。
- 询问用户是否要立即运行程序。
步骤 1:添加文件
- 将你的主程序文件(如
MyApp.exe)添加到 文件 列表中,目标路径设为%AppFolder%\MyApp。 - 将你的 64 位支持库(如
x64_support.dll)添加到列表中,目标路径也设为%AppFolder%\MyApp。
步骤 2:为 64 位库添加安装条件
- 在 文件 列表中,右键点击
x64_support.dll。 - 选择 属性。
- 在属性窗格中,找到
条件字段,输入Is64BitOS(),这是一个内置函数,当系统是 64 位时返回true。
步骤 3:创建桌面快捷方式
- 在左侧 项目窗格 中,双击 快捷方式。
- 点击
添加按钮。 - 名称: "我的应用程序"
- 描述: (可选)
- 命令行:
%AppFolder%\MyApp\MyApp.exe(使用会话变量宏) - 工作目录:
%AppFolder%\MyApp - 位置: 选择
桌面。
步骤 4:配置 On Finish 操作
- 在左侧 项目窗格 中,双击 操作。
- 在右侧的
On Finish事件中,点击添加操作->脚本。 - 在脚本编辑器中输入以下代码:
-- 询问用户是否要运行程序
local result = Dialog.Message("安装完成", "安装已完成!\n\n是否要立即运行 '我的应用程序'?", MB_YESNO, MB_ICONQUESTION, MB_DEFBUTTON2);
if result == IDYES then
-- 如果用户点击“是”,则运行程序
local installDir = SessionVar.Expand("%InstallDir%"); -- 获取实际的安装路径
local exePath = installDir .. "\\MyApp.exe";
File.Run(exePath, "", "", SW_SHOWNORMAL, false);
end
步骤 5:构建和测试
按 F7 构建安装包,然后运行它进行测试,你会发现,在 32 位系统上,x64_support.dll 不会被安装;在 64 位系统上则会被安装,安装完成后,会弹出对话框询问是否运行程序。
第五部分:常见问题与资源
常见问题
-
Q: 安装包运行时提示“文件被占用”或“权限不足”?
- A: 确保安装程序是以管理员权限运行的,在
项目设置->编译中,勾选需要管理员权限,确保安装过程中没有其他程序在使用这些文件。
- A: 确保安装程序是以管理员权限运行的,在
-
Q: 如何实现静默安装(Silent Install)?
- A: 在命令行后加上
/S参数。MyInstaller.exe /S,你需要在项目设置->编译中,勾选支持静默安装选项。
- A: 在命令行后加上
-
Q: 脚本中如何获取用户输入(如文本框、密码框)?
- A: 使用
Dialog.Input()函数,它弹出一个简单的输入对话框。local username, username_return = Dialog.Input("用户名", "请输入您的用户名:", "", MB_ICONQUESTION); if username_return == IDOK then SessionVar.Set("USERNAME", username); end
- A: 使用
-
Q: 如何在安装过程中下载文件?
- A: 使用
HTTP.Download()函数,这是一个非常强大的功能,可以实现按需下载。local success, response = HTTP.Download("http://example.com/plugin.dll", _TempFolder .. "\\plugin.dll", MODE_BINARY, 20, nil, nil); if success then File.Copy(_TempFolder .. "\\plugin.dll", "%AppFolder%\\MyApp\\plugin.dll", false, true, false, true, nil); else Dialog.Message("下载失败", "无法下载插件文件。", MB_OK, MB_ICONERROR); end
- A: 使用
学习资源
- 官方文档: 这是最权威的资源,安装 Setup Factory 时通常会附带帮助文档(CHM 格式),或者可以在 Indigo Rose 官网找到。
- 官方论坛: Indigo Rose 官方论坛 是提问和交流的最佳场所,有大量的教程和示例。
- 示例项目: Setup Factory 自带了许多示例项目,位于
My Documents\Setup Factory 9\Projects\Examples,仔细研究这些示例是学习高级功能的捷径。 - 在线教程: 搜索 "Setup Factory 9 tutorial" 或 "Setup Factory 9 Lua script" 可以找到许多博客和视频教程。
希望这份详细的教程能帮助你从零开始,逐步精通 Setup Factory 9!祝你制作出专业、完美的安装包!
