【问题标题】:C++ Shell Context Menu ExtensionC++ Shell 上下文菜单扩展
【发布时间】:2023-10-06 05:28:01
【问题描述】:

我尝试为 Windows 文件/文件夹创建上下文菜单扩展。我已经尝试了很多,但没有什么对我有用。我已经为 32 位系统提供了这样的扩展,但它已经过时了。我想为 64 位系统使用 C++ 重新创建它。

这个最接近我想做的事情:Klick 但这是针对 32 位系统的。阅读 cmets 后,我能够为 x64 修改和构建它。

在我的 64 位系统上使用 system32/regsvr32.exe 注册它,表明它已成功注册。所有注册表项均已正确创建。但是菜单项没有出现。我不知道为什么......

有人可以帮助我吗?如果你愿意,我可以为你上传项目。

更新

我使用上面链接中的原始项目并更改了以下内容:

1) 将目标设置为“x64”

2)由于无法编译,我更改了以下内容:

2.1) 在包含在 stdafx.h 之前,我添加了:

#define _ATL_NO_UUIDOF

2.2) 我在这里把 UINT 改成了 UINT_PTR:

HRESULT CFSBankShellExtension::GetCommandString (
UINT_PTR idCmd, 
UINT uFlags, 
UINT* pwReserved,
LPSTR pszName, 
UINT cchMax )

3) 我将 .rgs 文件中的 txtfile 更改为 *,因此它应该适用于所有文件类型。

4) 我能够编译并注册它

如果你不能帮助我,如果你能上传一个模板会很酷,它可以在 x64 系统上运行。

【问题讨论】:

  • 第一步是确定您的 dll 是否已实际加载到资源管理器进程中。尝试使用 SysInternals procexp 工具并打开底部窗格的 DLL View。
  • 它就在那里!我搜索了 SimpleExt.dll 并在 procexp 中找到了它。那么……接下来呢?
  • 您在使用 Visual Studio 吗?加载您的项目,将 VS 调试器附加到 explorer.exe 并在扩展的方法中设置断点。然后右键单击某个东西,看看你的函数是否真的被调用了。如果他们被调用,请逐步检查并尝试找出错误的地方。
  • 甚至没有一个函数被调用...
  • @FlashFan:如果已加载,您可以完全确定 DllMain() 已被调用,并且您的 QueryInterface() 也有 99.9x% 的确定性被调用。那只是基本的 COM 东西。但是你的反应正确吗? 32 位 Windows 有很多遗留的 hack,您可能会在不经意间依赖它们。

标签: c++ windows shell-extensions


【解决方案1】:

这篇文章可能会对我的项目有所帮助..

Simple shell context menu

所有文件、文件夹和驱动器的上下文菜单

您还可以通过以下方式将上下文菜单连接到所有文件、文件夹和驱动器 将条目添加到文件类型的 *、目录和驱动器注册表 键。例如,XP PowerToys 添加了 Open Command Window Here 菜单 到具有以下注册表脚本的所有文件夹:

REGEDIT4

[HKEY_CLASSES_ROOT\Directory\shell\cmd] @="在此处打开命令窗口"

[HKEY_CLASSES_ROOT\Directory\shell\cmd\command] @="cmd.exe /k \"cd %L\""

【讨论】:

  • 谢谢,但这对我来说不够灵活。我希望,当我选择多个文件/文件夹然后右键单击它们时,菜单项甚至会出现。我想检测所有选定的文件,然后(根据条件)决定是否应该出现菜单项。所以我需要为它创建一个DLL。
最近更新 更多