You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 20:05:12