c++ - 注销 COM 的问题(高级安装程序)

标签 c++ windows com advanced-installer

问题定义:

在 COM 取消注册期间挂起一段时间并提示 安装程序无法自动关闭所有请求的应用程序。请确保在继续安装之前关闭正在使用的保存文件的应用程序。但是实际上我的扩展已经成功卸载卸载了。

环境定义:

我为测试创建了某种虚拟 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 已启用。在 Product Information->Install Parameters->PackageType 中,我选择 64-bit package for x64...

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

我再次启动 MSI 并选择 Remove。它说您必须关闭 ...应用程序正在使用文件... 并且列表中只有 Windows Explorer。我选择 Automatically close ... 并按 OK。

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

状态是“正在关闭应用程序”,根据我的日志,dll 已经卸载。问题就在这里。 dll 已卸载,但 MSI 仍在等待某些内容,然后它显示 安装程序无法自动关闭所有请求的应用程序。请确保在继续安装之前关闭正在使用的保存文件的应用程序。 我单击“确定”,该过程继续进行,最后成功删除了我的 DLL。

我使用的是 windows 8 64 位。

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

最佳答案

是的,这是行不通的,很可能会加载 shell 扩展,而 MSI 不会杀死 Explorer.exe。您也不希望它出现,这对用户来说是一种可怕的景象。

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

关于c++ - 注销 COM 的问题(高级安装程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15829573/

相关文章:

c# - 一旦我在 Active Directory 中获得用户组,如何获得组的 SID?

c++ - 如何在 Visual Studio 中的干净构建期间删除 dlldata.c?

c++ - 如何在 C++ 中实现时间本地化?

c++ - SetDllDirectory,重置(强制)?

c++ - 组件 X 的父类(super class)型未知,其某些属性未经过验证

c++ - 多态性不适用于相同数据类型(基类和继承类)的函数返回值

c++ - 我无法创建窗口

c# - 即使文件位于 Bin 文件夹中,DLLImport 也不起作用

c++ - 如何测试 Audio Session 的相等性

c++ - 为什么无效套接字在 WinSock2.h (c++) 中定义为 ~0?