这似乎是一个常见的问题,但经过一些搜索,我真的无法找到答案。这里有一篇文章:
http://www.codeproject.com/KB/shell/shellextguide1.aspx
但它适用于Visual Studio的旧版本。我正在使用VS 2008,因此说明和界面似乎与我所看到的不相符。
我想使用C ++创建一个简单的shell扩展,为扩展名为.GZ的文件创建上下文菜单。当右键单击这些文件时,我应该能够单击我的上下文菜单项并在代码中进行回调以对该文件执行某种操作。
其他上下文菜单项会执行诸如生成无模式对话框之类的操作,以在执行某些操作之前接受用户输入。
从我所看到的,ATL用于此但我从未使用过ATL,因此所有的对象类型和接口都让我很困惑。如果我有适当的教程或文档可供阅读,那就不会那么糟糕了。
任何人都可以帮助我吗?是不是有一些不是10年的教程?
答案 0 :(得分:24)
我无法确切地告诉你如何编写shell扩展,但我会提供一些提示。编写Shell扩展比简单的“仅限注册表”方法提供了一些显着优势:
Shell Extensions的一些缺陷是:
复杂性大幅增加。准备好花费大量精力来实现它。在您的计算机旁安装家用浓缩咖啡机和/或雇用某人为您做咖啡。
大大增加了调试难度。关于咖啡也是如此。
编写Shell扩展很困难,因为它们很难调试。
Shell扩展由explorer.exe
进程加载,如果没有特定的Explorer配置,您需要强制退出explorer.exe
进程,以便安装更新版本的Shell延期。有一种方法可以让Explorer卸载它不再使用的DLL,但是你应该只在开发机器上而不是在部署目标上执行此操作:
在RegEdit中,浏览以下密钥:
HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \ Explorer中
添加名为“AlwaysUnloadDLL”的新DWORD键并将其值设置为1.
这在大多数情况下都有效,但有时您可能需要关闭资源管理器,因为未卸载Shell扩展。
请记住,其他应用程序可能会加载Shell扩展,例如,如果右键单击带有应用程序“打开文件”对话框的文件,则Shell扩展将加载到该应用程序中,而不是资源管理器。
您需要做什么:
IContextMenu
接口和IShellExtInit
接口。IShellExtInit::Initialize()
方法中,您可以从IDataObject
参数中获取所选文件。从内存中,数据采用“Drag-n-Drop”格式,因此您需要从HDROP
获取IDataObject
句柄并从那里查询文件(这是来自内存,实际上可能是与我在此描述的不同,所以请谨慎行事。regsvr32
以确保它已注册。衡量Shell Extension是否值得的成本。如果要根据所选文件动态创建菜单项,则Shell扩展可能是唯一的方法。如果你想同时处理所有文件,那么你可能也需要一个Shell扩展。
上下文菜单方法的替代方法可能是在用户的桌面上有一个拖放目标。探索可以让用户将文件提交到应用程序的其他方式,因为Shell扩展通常比它的价值要大得多。我发现这很困难,我认为其他人也都有。