问题定义:
在 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...
并且Synchronization
是Enabled
。在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 位。
这种等待的原因是什么以及应用程序无法关闭的消息。我怎样才能弄清楚?