2

我有一个试图在 Windows 7 64 位上安装的 Copy Hook Handler shell 扩展。

Shell 扩展 DLL 编译为 32 位和 64 位 Windows 的两个不同版本。

DLL 实现了 DLLRegisterServer,它添加了必要的注册表项。

添加注册表项后,它调用以下代码行来通知 Windows shell:

SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);

在 Windows7 32 位上一切正常。shell 会立即识别扩展名。

在 64 位上,只有在重新启动 shell 后才能识别 shell 扩展。

我有什么办法可以在不重新启动 64 位 shell 的情况下识别扩展名?

4

1 回答 1

2

事实证明,该问题并非特定于 64 位 Windows。

在与 Microsoft 协商后,我了解到这种行为会影响 32 位和 64 位系统中的 Copy Hook Handlers。带有 SHCNE_ASSOCCHANGED API 的 SHChangeNotify() 显然不会导致 shell 重新加载 Copy Hook 处理程序。

据微软代表称:

在进程中第一次调用复制挂钩处理程序时,shell 会构建并缓存已注册的复制挂钩处理程序列表。创建列表后,除了终止进程之外,没有其他机制可以更新或刷新缓存。这适用于 Windows 资源管理器和任何其他可能调用 shell 文件函数的进程,例如 SHFileOperation。此时我们可以提供的最佳选择是在复制挂钩处理程序注册后重新启动系统。

希望这对某人有帮助!

于 2010-01-26T00:34:12.793 回答