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

如何根据其他应用安装状态选择性注销并删除DLL文件

实现方案

核心判断逻辑非常明确:仅当系统中未安装应用A时,才在清理B的废弃DLL前执行regasm注销操作;无论A是否安装,都可以直接删除B自身安装目录下的废弃DLL——这些文件属于B的遗留文件,删除操作不会触碰A目录下的同名DLL。

步骤1:添加应用A的安装状态检测逻辑

在B的Inno Setup脚本的[Code]段添加如下检测函数,通过系统卸载注册表项判断A是否已安装,将代码中A_APP_UNINSTALL_KEY_NAME的取值替换为应用A安装包配置的AppId即可:

const
  A_APP_UNINSTALL_KEY_NAME = '替换为应用A的实际AppId';

function IsAppAInstalled: Boolean;
begin
  // 检测64位系统下64位程序、32位系统下程序的全局安装卸载项
  Result := RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + A_APP_UNINSTALL_KEY_NAME + '_is1');
  if not Result then
  begin
    // 检测64位系统下32位程序的全局安装卸载项
    Result := RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\' + A_APP_UNINSTALL_KEY_NAME + '_is1');
  end;
  if not Result then
  begin
    // 检测当前用户范围安装的卸载项(适配A支持普通用户安装的场景)
    Result := RegKeyExists(HKEY_CURRENT_USER, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + A_APP_UNINSTALL_KEY_NAME + '_is1');
  end;
end;

说明:Inno Setup默认生成的卸载注册表项格式为[AppId]_is1,如果你制作A的安装包时自定义过卸载项命名规则,对应调整注册表路径即可。

步骤2:调整B的[Run]段清理规则

修改B中原有regasm注销条目的Check条件,追加「未检测到A安装」的判断,DLL删除逻辑保持原有触发规则即可,修改后的代码如下:

Filename: "{dotnet40}\regasm.exe"; \
    Parameters: "/u PTSTools_x86.dll"; \
    WorkingDir: "{app}"; \
    Flags: runhidden; \
    Check: (not IsAppAInstalled) and FileExists(ExpandConstant('{app}\PTSTools_x86.dll')); \
    AfterInstall: DoDeleteFile(ExpandConstant('{app}\PTSTools_x86.dll'))

Filename: "{dotnet4064}\regasm.exe"; \
    Parameters: "/u PTSTools_x64.dll"; \
    WorkingDir: "{app}"; \
    Flags: runhidden; \
    Check: (not IsAppAInstalled) and IsWin64 and FileExists(ExpandConstant('{app}\PTSTools_x64.dll')); \
    AfterInstall: DoDeleteFile(ExpandConstant('{app}\PTSTools_x64.dll'))

边界场景兼容

该逻辑可以覆盖所有正常安装顺序的场景:

  • 若用户仅安装B:检测不到A存在,正常执行DLL注销+删除逻辑,无注册项或文件残留
  • 若用户先装B、后装A、再升级B:A安装时已经将COM组件注册到自身目录,此时清理B的文件时跳过注销步骤,仅删除B目录下的废弃DLL,不会破坏A的注册信息
  • 若用户先升级新版B(此时未装A)、后续再安装A:清理时正常注销B目录下DLL的注册信息,后续安装A时会自动完成自身目录DLL的注册,无冲突

极端场景提示:如果用户手动将A和B安装到完全相同的目录,直接删除DLL会影响A的运行,你可以在删除前额外校验DLL的版本、签名是否属于B的旧版本遗留文件,这类属于用户主动修改安装路径的非常规场景,默认安装流程下不会触发。

内容的提问来源于stack exchange,提问作者Andrew Truckle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 20:19:01