Inno setup Inno Setup clean卸载不可能与shell扩展一起使用

Inno setup Inno Setup clean卸载不可能与shell扩展一起使用,inno-setup,shell-extensions,Inno Setup,Shell Extensions,我使用的是Inno Setup 6.0.5,我注册了两个shell扩展DLL,这两个DLL与。一个DLL注册动态上下文菜单,另一个DLL添加覆盖图标 我正在使用Inno安装程序提供的工具来执行此步骤。这意味着: [Setup] ChangesAssociations=true ChangesEnvironment=true [Files] ... Source: "shell-integration\*"; DestDir: "{app}\shell-integr

我使用的是Inno Setup 6.0.5,我注册了两个shell扩展DLL,这两个DLL与。一个DLL注册动态上下文菜单,另一个DLL添加覆盖图标

我正在使用Inno安装程序提供的工具来执行此步骤。这意味着:

[Setup]
ChangesAssociations=true
ChangesEnvironment=true

[Files]
...
Source: "shell-integration\*"; DestDir: "{app}\shell-integration"; Flags: regserver 64bit; Check: IsAdminInstallMode;
我观察到的情况如下:

  • 设置完成后,覆盖图标将不处于活动状态。它们仅在我手动强制重新启动explorer.exe时才可用。有一些消息来源声称,通过调用
    SHChangeNotify
    sendMessageTimeOut
    可以实现这一点,但它们显然是错误的,因为我正是这么做的(请参见
    ChangesAssociations
    ChangesEnvironment
    ,它们应该这样做)
  • 卸载后,不会删除应用程序目录,因为2个DLL文件仍处于锁定状态。这也会禁止更新我的应用程序。Inno安装程序应该检测锁定的文件,并提供关闭锁定它们的应用程序,但这种机制似乎不起作用。。。另外,
    uninsrestartdelete
    标志没有用,因为这会导致Inno安装程序仅在重新启动后删除文件,但我不想强制用户在升级应用程序时重新启动计算机

我该怎么办?我看到的唯一解决方案是自己做所有事情,而不是依赖
[Files]
regserver
标志。尤其是卸载需要先注销DLL,然后强制重新启动explorer.exe,然后实际删除文件和文件夹。如果CurUninstallStep=usUninstall,我会在
块的
CurUninstallStepChanged
中执行此操作。要重新启动explorer.exe,我将修改
if(CurStep=ssDone)
块中的
CurStepChanged

感谢您的澄清。请告诉我,除了我在文章最后一段中建议的方法之外,你是否还有其他方法可以解决我的问题。问题在于更新过程。好的,Inno安装程序通常只在以前的版本上安装应用程序,而不调用卸载程序,对吗?如果我不这样做,那么更新应用程序确实有效——当第二次调用安装程序时,安装程序会检测到explorer.exe锁定DLL并关闭explorer.exe并重新启动它。但是,如果我在
CurStepChanged->ssInstall
中手动添加代码以首先调用卸载程序(以获得一个干净的列表),则在安装完成后,Inno安装程序不会启动explorer.exe。我用它对DLL进行了干净、无需重新启动的卸载。使用
taskkill
start explorer.exe
手动重新启动explorer不可靠。感谢您的澄清。请告诉我,除了我在文章最后一段中建议的方法之外,你是否还有其他方法可以解决我的问题。问题在于更新过程。好的,Inno安装程序通常只在以前的版本上安装应用程序,而不调用卸载程序,对吗?如果我不这样做,那么更新应用程序确实有效——当第二次调用安装程序时,安装程序会检测到explorer.exe锁定DLL并关闭explorer.exe并重新启动它。但是,如果我在
CurStepChanged->ssInstall
中手动添加代码以首先调用卸载程序(以获得一个干净的列表),则在安装完成后,Inno安装程序不会启动explorer.exe。我用它对DLL进行了干净、无需重新启动的卸载。使用
taskkill
start explorer.exe
手动重新启动资源管理器不可靠。