Inno Setup如何将自定义过程创建的文件夹路径加入卸载列表?
动态注册符号链接文件夹到Inno Setup卸载程序
核心思路是在动态创建符号链接后,调用Inno Setup内置的RegisterUninstallDelete函数,将每个符号链接的路径注册到卸载列表中,让卸载程序运行时自动删除这些路径。
1. 修改自定义过程,添加卸载注册逻辑
在你的CreateSymForPath过程中,完成符号链接创建后,新增卸载注册代码,同时修复原代码中的路径拼接遗漏和资源泄漏问题:
procedure CreateSymForPath(sor_pth: string; des_pth: string; isfolder: Boolean); var FindRec: TFindRec; RootPath: string; TargetDirPath: string; LinkNfo: SYMLINK_INFO; begin RootPath := ExpandConstant(sor_pth); if FindFirst(RootPath + '\*', FindRec) then begin repeat if ((FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY) <> 0) and (FindRec.Name <> '.') and (FindRec.Name <> '..') then begin TargetDirPath := ExpandConstant(des_pth + '\' + FindRec.Name); // 创建目标文件夹 CreateDir(TargetDirPath); Log('目标路径: ' + TargetDirPath); Log('源路径: ' + ExpandConstant('{src}' + '\' + sor_pth + '\' + FindRec.Name)); // 配置符号链接信息 LinkNfo.name := TargetDirPath; LinkNfo.target := ExpandConstant('{src}' + '\' + sor_pth + '\' + FindRec.Name); LinkNfo.create_dir := isfolder; LinkNfo.relative := false; // 替换为符号链接 ReplaceWithSymlink(LinkNfo); // 注册到卸载程序,指定删除符号链接 // Inno Setup v6.0+推荐使用udtSymlink类型,精准删除符号链接本身 RegisterUninstallDelete( '', // 组件名称,留空表示属于所有组件 TargetDirPath, udtSymlink, // 卸载时仅删除符号链接,不影响源文件夹 0, // 标志位,默认0即可 '', // 可选描述文本 '' // 仅用于注册表项/值,留空 ); // 若使用旧版本Inno Setup(不支持udtSymlink),改用udtDir类型 // RegisterUninstallDelete('', TargetDirPath, udtDir, 0, '', ''); end; until not FindNext(FindRec); FindClose(FindRec); // 关闭查找句柄,避免资源泄漏 end; end;
2. 关键细节说明
RegisterUninstallDelete参数:- 第一个参数为组件名,留空则该卸载项属于所有组件;
- 第二个参数是要删除的绝对路径,必须用
ExpandConstant处理确保路径正确; - 第三个参数
udtSymlink会直接删除符号链接本身,不会影响链接指向的源文件夹;旧版本可改用udtDir,同样只会删除符号链接文件夹,不会递归删除源内容。
- 路径拼接修复:原代码中
des_pth +FindRec.Name缺少路径分隔符\,修改后避免生成错误路径(比如{app}\dirfolder)。 - 资源泄漏修复:添加
FindClose(FindRec)关闭查找句柄,防止资源占用。
3. 为什么不能用[Dirs]节
[Dirs]节是静态配置节点,只能写入固定路径,无法动态读取源文件夹的名称并生成目标路径,因此必须通过运行时的Pascal脚本动态注册卸载项。
内容的提问来源于stack exchange,提问作者Anton Vladimirov
相关产品推荐
相关产品推荐

