使用IContextMenu接口实现COM对象时如何获取目标文件/文件夹信息

问题描述 投票:0回答:1

我想自定义在windows桌面和windows资源管理器上右键单击文件夹时出现的菜单。由于我的菜单显示的文本应该是动态的(取决于文件夹路径),我在 C++ Dll 中实现了

IContextMenu
接口,并在我的注册表中指定了
CLSID
和 DLL 路径。

有效,当用户右键单击一个文件夹时,shell 调用我的

IContextMenu::QueryContextMenu
函数,我可以在
MENUITEMINFOA
中插入我的
HMENU
结构。然后用户可以在上下文菜单中看到它。

我的问题是如何获取用户在将我的

MENUITEMINFOA
结构插入
HMENU
之前右键单击的文件夹路径所以我可以调整我放在
MENUITEMINFOA.dwTypeData
中的内容?

我尝试实现

IShellExtInit
接口,因为 shell 似乎可以使用此接口提供信息,但是当我记录对我的 dll 的调用时,我发现 shell 永远不会调用
IShellExtInit::Initialize
.

我猜 shell 通过我没有实现的接口提供信息,但我在文档中找不到任何线索。然而,这似乎是可行的,例如,TortoiseSVN 这样做:上下文菜单在某些文件夹上显示“SVN Checkout ...”,在其他一些文件夹上显示“SVN Update”/“SVN Commit ...”。

祝你有美好的一天:)

winapi com windows-shell shell-extensions
1个回答
1
投票

根据微软的文档:

创建 Shell 扩展处理程序

像所有 COM 对象一样,Shell 扩展处理程序必须实现一个

IUnknown
接口和一个类工厂。大多数扩展处理程序还必须在 Windows XP 或更早版本中实现
IPersistFile
IShellExtInit
接口。 这些在 Windows Vista 中被
IInitializeWithStream
IInitializeWithItem
IInitializeWithFile
取代。
Shell 使用这些接口来初始化处理程序。

因此,在您的情况下,实施

IInitializeWithItem
将为您提供一个
IShellItem
接口,实施
IInitializeWithFile
将为您提供一个文件路径字符串。

© www.soinside.com 2019 - 2024. All rights reserved.