[转]Inno Setup教程-常见问题解答
* 翻译 Inno Setup 文字
* 它支持 MBCS (多字节字符集) 吗?
* 将来会支持 Windows Installer 吗?
* 怎样更改 Setup.exe 的图标?
* 可以用 Inno Setup 创建一个带条件的安装程序吗 - 例如,仅在某个注册表键或文件存在时进行?
* “网络安装”功能在哪里?
* 可以不使用 /SILENT 或 /VERYSILENT 命令行参数创建一个后台安装程序吗?
* 安装程序可以使用读取注册表值作为默认的安装目录吗?
问题
* 编译器说“参数引号错配或放置不当"
* 双击安装程序创建的快捷方式时不能找到我的应用程序一些文件。在资源管理器中双击 应用程序的 EXE 文件时能正常工作。
* 在没有卸载老版本的情况下我安装新版本的应用程序,在控制面板的添加/删除程序中出现两个条目。
* 为什么会在某些系统中显示错误消息“安装程序文件已被破坏”?
* 安装程序给出一条消息“不能注册 DLL/OCX: DllRegisterServer 输出未找到”
* 程序卸载后,安装程序创建的目录仍存在。
* 我在 [Run] 段运行一个批处理文件,但完成执行后窗口仍留在屏幕中,我想让它在“退出时关闭”。
* 我已经在脚本中更改了 DefaultDirName,但当我运行安装程序时还是默认为以前的目录。
* 我有两个相同名字的 [Icons] 条目,但只安装了一个。
* 安装不等待程序 [Run] 段条目完成执行。
* 选择安装程序语言对话框中丢失了某些语言,或不能全部显示。
安装任务
* 创建 Internet (URL) 快捷方式
* 在快速运行栏创建快捷方式
* 在快捷方式中设置“起始位置”对象
* 创建文件关联
* 设置环境变量
* 在 MS-DOS 程序快捷方式设置“退出时关闭”框
* 替换文件之前制作备份
* 根据 Windows 版本安装不同的文件
* 设置文件、目录或注册表键许可
* 我的安装程序需要做一些 Inno Setup 目前还没有的功能。
怎样安装...?
* OCX 文件
* Visual Basic 系统文件
* Visual C++ 系统文件 (例如 MFC)
* COMCTL32.DLL
* BDE (Borland 数据库引擎)
* MDAC,ADO,Jet 等
兼容性
* 操作系统兼容性
* Windows NT/2000/XP 管理员权限
杂项
* 制作的安装程序有没有多大文件限制?
* 单击用户在安装期间单击“取消”后发生什么?
功能
翻译 Inno Setup 文字
翻
译 Inno Setup 文字为其它语言不需要修改源代码。只要简单地制作一个 Default.isl 文件 (包含在 Inno Setup) 的
副本并编辑其中的文字就行了。(不要直接编辑 Default.isl 文件,否则你的更改将在安装新版本的 Inno Setup 后丢
失。) 在 Inno Setup 帮助文件中查看“[Messages] 段”获取一些重要提示。
一旦你完成新的 .isl 文件编辑,在 [Languages] 段创建一个条目告诉编辑器你要使用它:
[Languages]
Name: mytrans; MessagesFile: "compiler:MyTranslation.isl"
如果你使用 4.0 之前的 Inno Setup 版本,用下列替换:
[Setup]
MessagesFile=compiler:MyTranslation.isl
在下列网页中有许多其它人提供的翻译可用: Inno Setup 第三方文件页,还有一个能编辑 .isl 文件的程序。
它支持 MBCS (多字节字符集) 吗?
Inno Setup 2.0.6 添加了完善的 MBCS 支持。在所有文件名和常量解析中使用了头字节检查,因此应该不会出现使用反斜框字符 (“\”) 或括号 (“{”) 错误。
2.0.6 及以前版本不包含任何 MBCS 的特殊支持。
将来会支持 Windows Installer 吗?
现在我还没有打算编写 Windows Installer 版本的 Inno Setup。“Supporting” Windows Installer 好象还没有完善一点的编写器 - 有些东西我还没有兴趣去做。
怎样更改 Setup.exe 的图标?
安装程序的图标可以通过设置 [Setup] 段的 SetupIconFile 进行更改。要设置卸载程序的图标,设置 UninstallIconFile。
可以用 Inno Setup 创建一个带条件的安装程序吗 - 例如,仅在某个注册表键或文件存在时进行?
Inno Setup 4 添加了支持这个的新 Pascal 脚本功能。
注意: 用早期的 Inno Setup 版本它已经提供根据 Windows 版本安装不同的文件。
“网络安装”功能在哪里?
没有,这次写入的版本我还没有添加这样的功能。
可以不使用 /SILENT 或 /VERYSILENT 命令行参数创建一个后台安装程序吗?
没有,也不打算添加这样的功能 (它会被滥用)。如果你的目的是保护用户交互让它最小化,使用禁用 [Setup] 段指示。
安装程序可以使用读取注册表值作为默认的安装目录吗?
是的。在 DefaultDirName 中使用一个 {reg:...} 常量。例如:
[Setup]
DefaultDirName={reg:HKLM\Software\My Program,Path|{pf}\My Program}
查阅 Inno Setup 帮助文件中的“常量”主题获取更多 {reg:...} 常量的信息。
问题
编译器说“参数引号错配或放置不当"
如果你尝试在一个参数数据中嵌入一个引号 (") 字符,但不完整 (只有一个) 时显示这个消息。在 Inno Setup 帮助主题中查阅“段中参数”获取更多信息。
双击安装程序创建的快捷方式时不能找到我的应用程序一些文件。在资源管理器中双击 应用程序的 EXE 文件时能正常工作。
你的应用程序很可能未指定尝试打开的文件路径名,因此它在当前目录查找。Inno Setup 默认在它创建的快捷方式中不设置“起始位置”对象;这会导致 Windows 拾取它自已的目录,通常不是包含你应用程序的目录。
实
际上所有的事例中,这是一些应该创建的应用程序同层的东西。通常设计的 GUI 应用程序应该不会期待从特殊目录中启动;它们应该总是指定打开文件的完整
路径名。在 Delphi 或 C++Builder,例如,它可以通过下列调用获取包含应用程序 EXE 的完整路径
名: ExtractFilePath(ParamStr(0))。要获取在应用程序目录中的名为“File.txt”的完整路径,使
用: ExtractFilePath(ParamStr(0)) + 'File.txt'。
如果因某些原因你不能在应用程序层中修正这个问题,你可以通过在 [Icons] 段添加“WorkingDir: {app}”告诉 Inno Setup 设置“起始位置”对象。
为什么会在某些系统中显示错误消息“安装程序文件已被破坏”?
这个错误消息在隶属安装程序的一个文件 (例如 setup.exe,setup.1) 大小错误,或部分文件 CRC 校验失败时显示。它不会没有任何理由显示。
如果你的安装程序通过 internet 分布,且在获取时有许多错误报告,它可能因为你的网络服务器故障传送部分文件错误。
如果你的安装程序通过 CD-ROM 或软盘分布,CD-ROM 或软盘可能已坏,或设备有问题。
在没有卸载老版本的情况下我安装新版本的应用程序,在控制面板的添加/删除程序中出现两个条目。
这
在你更改了 AppId 版本时会发生,或如果未指定 AppId 和 AppName.。如果你这样做,安装程序不知道同一应用程序的两个版本,因此将
在添加/删除程序中创建新条目。同时将创建一个新的卸载记录文件 (unins???.dat)。最好的方法是更改 AppId 和 AppName。
如果你在新版本中必须改变 AppName,设置 AppId 先前版本的 AppId 或 AppName 值。
安装程序给出一条消息“不能注册 DLL/OCX: DllRegisterServer 输出未找到”
这个消息通常意味着你在文件中指定了“regserver”标记,但它不能注册。从 [Files] 条目中删除“regserver”标记就不会出错这个消息。
程序卸载后,安装程序创建的目录仍存在。
这个有几个说明为什么目录没有被删除:
* 目录在安装前已经存在。按默认,卸载程序为了安全起见不删除安装程序没有创建的目录。
* 它含有文件或子目录。如果你需要卸载程序删除其它的文件/目录,使用 [UninstallDelete]
* 在当前目录中还有一个进程正在运行。
注
意: 在 Inno Setup 2.0.1 以有版本中,目录必须指定在 [Dirs] 或 [UninstallDelete] 段才能被卸载程序删
除。在新的 Inno Setup 版本中,用 [Files] 段条目创建的目录将被卸载程序自动删除 (如果它不是用先前的安装程序创建)。
我在 [Run] 段运行一个批处理文件,但完成执行后窗口仍留在屏幕中,我想让它在“退出时关闭”。"
来自 Tim Rude:
简单地让批处理文件在退出后自动关闭是,使用 CLS 命令在结束时清除屏幕。
--- 批处理文件 1 ---
@echo off
echo Hello World
echo 这个批处理文件在退出时不关闭
--- 批处理文件 2 ---
@echo off
echo Hello World
echo 这个批处理文件在退出时关闭
cls
我已经在脚本中更改了 DefaultDirName,但当我运行安装程序时还是默认为以前的目录。
在
启动安装程序时在注册表中发现如果以前已经安装了相同的应用程序,它将使用以前安装的目录作为默认目录在安装向导中提供给用户。如果卸载应用程序再运行安
装程序,它将使用新的 DefaultDirName 设置。如果你想禁用这个功能,设置 UsePreviousAppDir 为“no”。
我有两个相同名字的 [Icons] 条目,但只安装了一个。
两个文件不能用相同的名字,快捷方式其实也是文件,因此两个快捷方式不能用相同的名字。
安装不等待程序 [Run] 段条目完成执行。
首先,请确认你在 [Run] 条目中没有使用“nowait”或“waituntilidle”标记。这些标记防止安装程序在进程完成终止前等待。
如
果你没有使用这些标记,但它还是好象不等待程序完成,那么很可能你正在运行的 EXE 分出其它进程肯不能用它自身直接终止,导致安装程序认为该程序已经
完成。现在已知在老的 InstallShield-based 安装程序会偶尔发生 (要围绕它工作,尝试使用 /SMS 切换)。
一个简单的检查方法,如果程序从命令行运行“START /WAIT ProgramName.exe”,在程序退出前返回到命令提示时查看。
选择安装程序语言对话框中丢失了某些语言,或不能全部显示。
从 Inno Setup 4.2.2 开
始,, languages specified in the [Languages] section that cannot be displayed under the 活
动 Windows ANSI 代码页下不能显示的 [Languages] 段中指定的语言,不再在选择安装语言对话框中列出。例如,俄语只能在活动代
码页是 1251 的情况下显示;如果用户不是运行在代码页 1251,那么他们不能在选项中看到俄语选项。
在 Windows XP 中,活动代码页可以在控制面板的区域和语言选项中进行更改,并在高级标签中设置非 Unicode 程序语言,然后点击设置默认...。
如果你能保存你正在正确的代码页中运行,并且语言仍不能列出,那么很可能是 .isl 语言文件中的 LanguageID 设置错误。
如果你想让所有的语言强制可见,不考虑它们是否可以在使用的活动代码页下正确显示,请在脚本中添加以下内容:
[LangOptions]
LanguageCodePage=0
安装任务
创建 Internet (URL) 快捷方式
先创建一个文件名,例如“website.url” ,其后在内部写入这些行:
[InternetShortcut]
URL=http://web.site.address/
然后添加下列行到你的脚本:
[Files]
Source: "website.url"; DestDir: "{app}"
[Icons]
Name: "{group}\访问我的网站"; Filename: "{app}\website.url"
在快速运行栏创建快捷方式
升级到至少 Inno Setup 1.3.11 版,然后使用:
[Icons]
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\My Program"; Filename: "{app}\MyProg.exe"
在快捷方式中设置“起始位置”对象
在 [Icons] 段条目中使用一个 WorkingDir 参数。
创建文件关联
先设置 [Setup] 段指示“ChangesAssociations”为“yes”。然后根据下面显示创建 [Registry] 条目。
[Registry]
Root: HKCR; Subkey: ".myp"; ValueType: string; ValueName: ""; ValueData: "MyProgramFile"; Flags: uninsdeletevalue
“.myp”是我们要关联的扩展名。“MyProgramFile”是贮存在注册表中的文件类型内部名字。请确认你使用了一个唯一的名字,这样你不会一不小心覆盖其它应用程序的注册表键。
Root: HKCR; Subkey: "MyProgramFile"; ValueType: string; ValueName: ""; ValueData: "My Program File"; Flags: uninsdeletekey
“My Program File”是显示在资源管理器中的文件类型的名字。
Root: HKCR; Subkey: "MyProgramFile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\MYPROG.EXE,0"
“DefaultIcon”是指定与文件类型关联的文件名包含的图标的注册表键。“,0”告诉资源管理器使用 MYPROG.EXE 中的第一个图标索引。(“,1”表示第二个图标索引。)
Root: HKCR; Subkey: "MyProgramFile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\MYPROG.EXE"" ""%1"""
“shell\open\command”是指定在资源管理器双击该文件类型时执行的程序的注册表键。命令行中的引号是让它可以正确处理长文件名。
设置环境变量
在 Windows NT/2000/XP,环境变量是用字符串值贮存的注册表中,因此可以使用 [Registry] 段进行操作。系统宽度环境变量位于:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
用户指定环境变量位于:
HKEY_CURRENT_USER\Environment
在 Windows 95/98/Me,你需要修改 AUTOEXEC.BAT 设置环境变量。Inno Setup 不包括进行设置的内置功能,可以是你可写一个小程序通过在 [Run] 段运行它进行设置。(更多信息)。
在 MS-DOS 程序快捷方式设置“退出时关闭”框
Inno Setup 1.3.15 及更高版本支持在 [Icons] 段的“closeonexit”和“dontcloseonexit”标记。
替换文件之前制作备份
Inno Setup 目前还没有执行备份的特殊功能,但你可以通过在 [Files] 段条目中象下面这样在替换前先制作一个文件副本:
Source: "{app}\MyProg.exe"; DestDir: "{app}\backup"; Flags: external skipifsourcedoesntexist uninsneveruninstall
根据 Windows 版本安装不同的文件
这可以在条目中的 MinVersion 和/或 OnlyBelowVersion 参数来完成。在帮助文档中查看公共参数主题获取详细资料。
这里有一个简单地的例子说明怎样安装一个文件到 NT 平台 (Windows NT/2000/XP) 以及其它文件安装到非 NT 平台 (Windows 95/98/Me):
[Files]
Source: "{app}\WinNT2000XP.exe"; DestDir: "{app}"; MinVersion: 0, 1
Source: "{app}\Win9598Me.exe"; DestDir: "{app}"; MinVersion: 1, 0
“0”表示从不安装;“1”表示在任何版本安装 (例如 version 1.0 或更高)。
注意: 上述方法不只限制为 [Files] 段;MinVersion 和 OnlyBelowVersion 可以在大多数段中使用。
设置文件、目录或注册表键许可
从 Inno Setup 4.1.0 开始,[Dirs],[Files] 和 [Registry] 段支持设置目录、文件和注册表键许可的许可参数。
如果你需要更高高级需求,查阅 SetACL。
我的安装程序需要做一些 Inno Setup 目前还没有的功能。
查阅 How-To 文档执行自定义功能。
怎样安装...?
OCX 文件
推荐你用下列方法安装 OCX 文件。
[Files]
Source: "ComCtl32.ocx"; DestDir: "{sys}"; CopyMode: alwaysskipifsameorolder; Flags: restartreplace sharedfile regserver
Visual Basic 系统文件
查阅这个 How-To 文档。
Visual C++ 系统文件 (例如 MFC)
查阅这个 How-To 文档。
COMCTL32.DLL
如果你的安装程序需要一个更新版本的 COMCTL32.DLL,你可以指引用户从 Microsoft 下载 COMCTL32 更新版本,或从你的安装程序通过使用下列语句调用 COMCTL32 更新:
[Files]
Source: "50comupd.exe"; DestDir: "{tmp}"
[Code]
function ShouldInstallComCtlUpdate: Boolean;
var
MS, LS: Cardinal;
begin
// Only install if the existing comctl32.dll is < 5.80
Result := False;
if GetVersionNumbers(ExpandConstant('{sys}\comctl32.dll'), MS, LS) then
if MS < $00050050 then
Result := True;
end;
[Run]
Filename: "{tmp}\50comupd.exe"; Parameters: "/r:n /q:1"; Check: ShouldInstallComCtlUpdate
不能尝试直接使用 [Files] 段安装 COMCTL32.DLL;Microsoft 不允许这样做,而且这这样做很危险。
BDE (Borland 数据库引擎)
查阅 How-To 文档安装 BDE 获取使用 Inno Setup 配置 32 位的详细资料。
MDAC,ADO,Jet 等。
查阅这个 How-To 文档。
兼容性
操作系统兼容性
当前支持的平台包括 Windows 95,98,2000,XP,Me 和 NT 4.0。
我当前是在 Windows 2000 平台上使用和开发,因此对 Windows 2000 的兼容性是可靠的。
当引入新的主功能时,我通常在所有支持的 Windows 版本中进行测试。
16 位版本的 Inno Setup 已在版本 1.3 中放弃。Windows NT 3.51 支持在版本 3.0 中放弃。
Windows NT/2000/XP 管理员权限
典型的 Inno Setup 安装程序在 Windows NT/2000/XP 中运行不需要管理员或“超级用户”权限。除非下面注明的部分。
用 Windows NT/2000/XP 中需要管理员权限:
* 在脚本中的 [Setup] 段使用“AdminPrivilegesRequired=yes”。这会使安装程序在缺少管理员权限的用户安装时出现错误消息并中断。(默认设置中 AdminPrivilegesRequired 指示是“no”。)
* 在 [Files] 段
使用“restartreplace”。这个功能会使 Inno Setup 调用 MoveFileEx 功能,尝试写入到
“HKEY_LOCAL_MACHINE\ SYSTEM\ CurrentControlSet\ Control
\ Session Manager”。 写入这些注册表必须要有管理员权限。
* 用 [Registry] 段在 HKEY_USERS\.DEFAULT 下写入任何键。写入这些注册表必须要有管理员权限。
在 Windows 2000/XP 中需要管理员或“超级用户”权限之一:
* 在 [Files] 段使用“regserver”标记。在大多数场合中注册一个 DLL 写入到 HKEY_CLASSES_ROOT,普通用户是没有权限的。
* 在 [Files] 段
使用“sharedfile”标记。这个标记会使 Inno Setup 创建/更新在“HKEY_LOCAL_MACHINE\ SOFTWARE
\ Microsoft\ Windows\ CurrentVersion\ SharedDLLs”中的一个值。普通用户不允许写入这些键值。
* 在 [Files] 段使用 FontInstall 参数。
* 在 [Registry] 段在 HKEY_LOCAL_MACHINE 或 HKEY_CLASSES_ROOT 下写入任何键。普通用户不允许写入这些键值。
Inno Setup 自身不需要写入到 WINNT 目录,或上述提及的任何注册表键。
当安装程序被一个没有管理员权限的用户安装有什么不同呢?
* 添加/删除程序控制面板条目注册表键创建在 HKEY_CURRENT_USER 下而不是 HKEY_LOCAL_MACHINE 中。因此,只有安装的用户可以在添加/删除程序条目看到它。
* “{group}”常量总是指向当前用户配置文件,同时指向所有用户配置文件。
* 所有“{common...}”常量等同于“{user...}”常量。
* 该程序可以被其它用户卸载。(当管理员安装程序,只有管理员允许卸载。)
杂项
制作的安装程序有没有多大文件限制?
http://www.zbedu.net/yuwen/user1/376/archives/2006/5292.html
Inno Setup 没有在单个安装程序中限制多大文件、快捷方式、注册表条目等。但是,安装程序脚本中的每个条目都需要一定数量的内存。例如,每个 [Files] 条目大概需要 120 字节的内存。
在 Inno Setup 3.x 及更早版本中,安装程序和单个文件不能超过 2 GB,因为它不使用 64 位算法。这已经在 Inno Setup 4 中添加。
单击用户在安装期间单击“取消”后发生什么?
当单击“取消”时,安装程序将开始用非常类似卸载程序的模式回复先前制作的更改。因此,不会剩下部分已安装的程序