1

问题定义:

在 COM 注销期间挂断一段时间并说The setup was unable to automatically close all requested applications. Please ensure that the applications holding files in use are closed before continuing with the installation。但实际上我的扩展程序已成功卸载和卸载。

环境定义:

我为测试创建了某种虚拟 shell 命名空间扩展。它实现IContextMenu并且所有方法都返回S_OK并且不执行任何其他操作,并且 rgs 文件是

HKCR
{
    xxx.sergz.dummyShellExt.1 = s 'DummyNSE Class'
    {
        CLSID = s '{6C0FBE00-9898-4BB0-806F-3ED7D2F1170D}'
    }
    xxx.sergz.dummyShellExt = s 'DummyNSE Class'
    {
        CurVer = s 'xxx.sergz.dummyShellExt.1'
    }
    NoRemove CLSID
    {
        ForceRemove {6C0FBE00-9898-4BB0-806F-3ED7D2F1170D} = s 'DummyNSE Class'
        {
            ProgID = s 'xxx.sergz.dummyShellExt.1'
            VersionIndependentProgID = s 'xxx.sergz.dummyShellExt'
            ForceRemove Programmable
            InprocServer32 = s '%MODULE%'
            {
                val ThreadingModel = s 'Apartment'
            }
            TypeLib = s '{3DC947F0-6691-4043-B414-29F749209905}'
            Version = s '1.0'
        }
    }
    NoRemove Directory
    {
        NoRemove Background
        {
            NoRemove ShellEx
            {
                NoRemove ContextMenuHandlers
                {
                   ForceRemove DummyShellExt = s '{6C0FBE00-9898-4BB0-806F-3ED7D2F1170D}'
                }
            }
        }
    }
}


HKLM
{
  NoRemove Software
  {
    NoRemove Microsoft
    {
      NoRemove Windows
      {
        NoRemove CurrentVersion
        {
          NoRemove Shell Extensions
          {
            NoRemove Approved
            {
              val '{6C0FBE00-9898-4BB0-806F-3ED7D2F1170D}' = s 'xxx.sergz Dummy shell extension.'
            }
          }
        }
      }
    }
  }
}

我选择Professional安装程序并只添加了我的 dll 文件。Registration在我选择的文件属性选项卡上Auto register file...Extract registration info...并且SynchronizationEnabled。在Product Information->Install Parameters->PackageType我选择64-bit package for x64....

现在我构建 MSI 并安装扩展。启动资源管理器并右键单击文件夹背景上的某处。根据我的日志,我的扩展已加载并且是 DLL_PROCESS_ATTACH 和几次 DLL_THREAD_ATTACH。

我再次启动 MSI 并选择Remove. 它说你必须关闭... applications are using files...并且只有Windows Explorer在列表中。我选择Automatically close ...并按 OK。

所有资源管理器窗口都已关闭,但资源管理器似乎没有关闭。

状态是“正在关闭应用程序”,根据我的日志,dll 已经被卸载。问题就在这里。dll 已卸载,但 MSI 仍在等待某些内容,然后显示The setup was unable to automatically close all requested applications. Please ensure that the applications holding files in use are closed before continuing with the installation。我单击“确定”并继续该过程,最终成功删除了我的 DLL。

我使用的是 Windows 8 64 位。

这种等待的原因是什么以及应用程序无法关闭的消息。我怎样才能弄清楚?

4

1 回答 1

0

对,这行不通,shell 扩展很可能会被加载,而且 MSI 不会杀死 Explorer.exe。你也不想这样,这对用户来说是一个可怕的景象。

您需要使用另一种方法来取消/注册扩展。目前尚不清楚“专业安装程序”可能意味着什么。但是您始终可以通过自己修改注册表来取消/注册 COM 服务器,而不是将其留给 DLL 来完成。这实际上是推荐的方式。您已经知道 .rgs 文件中的注册表项。您还可以使用 WiX 工具集中的 Heat.exe 收割机。DLL 需要通过在下次用户登录时延迟删除来删除,方法是将其添加到 PendingFileRenameOperations 注册表项中。检查您的安装程序创建工具以了解正确的过程。

于 2013-04-05T10:19:05.187 回答