gpt4 book ai didi

c++ - 如何用C++编写Shell扩展?

转载 作者:IT老高 更新时间:2023-10-28 22:12:32 60 4
gpt4 key购买 nike

这似乎是一个常见的问题,但是在进行了一些搜索之后,我才真正找不到答案。这里有一篇文章:

http://www.codeproject.com/KB/shell/shellextguide1.aspx

但这是针对非常旧版本的Visual Studio的。我使用的是VS 2008,因此说明和界面似乎与我所看到的不匹配。

我想使用C++创建一个简单的shell扩展,它为扩展名为.GZ的文件创建一个上下文菜单。右键单击这些文件时,我应该能够单击上下文菜单项,并在代码中进行回调以对该文件执行某种操作。

其他上下文菜单项将执行诸如生成无模式对话框之类的操作,以在执行某些操作之前接受用户输入。

从我所见,ATL用于此目的,但我从未使用过ATL,因此所有对象类型和接口(interface)都令我感到困惑。如果我有合适的教程或文档可以阅读,那还不错。

谁能帮我吗?那里有没有10年历史的教程吗?

最佳答案

我无法确切告诉您如何编写Shell扩展,但是我将提供许多技巧。与更简单的“仅注册”方法相比,编写Shell Extension具有一些明显的优势:

  • 使用Shell Extension,您可以动态创建与所选文件更相关的上下文菜单项(或子菜单)。例如,如果您正在为zip文件编写Shell Extension,则可以在上下文菜单中创建一个子菜单,以显示zip的全部内容。
  • 您可以同时处理多个文件,这可能不仅对提高性能有好处,而且还使您可以基于整体选择而不是每个文件来确定要做什么。

  • Shell扩展的一些缺点是:
  • 大大增加了复杂性。准备为此花费很多精力以使其正常运行。在计算机旁边安装家用咖啡机和/或雇人为您煮咖啡。
  • 大大增加了调试难度。同理咖啡。

  • 编写Shell扩展很困难,因为它们很难调试。
  • Shell扩展由explorer.exe进程加载,并且在没有特定的Explorer配置的情况下,您需要强制退出explorer.exe进程,以便可以安装更高版本的Shell Extension。有一种方法可以使资源管理器卸载不再使用的DLL,但是您只能在开发计算机上而不是在部署目标上执行此操作:
  • 在RegEdit中,浏览到以下键:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer
  • 添加一个名为“AlwaysUnloadDLL”的新DWORD key ,并将其值设置为1。
  • 重新启动资源管理器。

  • 在大多数情况下,这是可行的,但是由于Shell Extension尚未卸载,因此有时仍然需要关闭Explorer。
  • 请记住,您的Shell Extension可能会被其他应用程序加载,例如,如果右键单击带有应用程序“打开文件”对话框的文件,则您的Shell Extension将被加载到该应用程序中,而不是资源管理器中。
  • 如果Shell扩展程序导致运行时错误,则结果通常只是不显示上下文菜单项,很少会告诉您Shell扩展程序加载失败或导致运行时错误。
  • 即使进行安装,配置也可能很困难,需要在多个位置创建注册表数据,并且根据您希望上下文菜单显示的位置,注册表的位置在Windows的不同版本之间可能会有所不同。

  • 您需要做的是:
  • Visual Studio提供了一些用于创建Shell扩展的快捷方式,但是基本上您需要创建一个COM DLL。上下文菜单项的Shell Extension必须同时实现 IContextMenu 接口(interface)和 IShellExtInit 接口(interface)。
  • IShellExtInit::Initialize()方法中,您可以从IDataObject参数获取所选文件。从内存中,数据为“Drag-n-Drop”格式,因此您需要从HDROP获取IDataObject句柄,然后从那里查询文件(这是从内存中获取的,实际上可能与我在这里描述的有所不同,因此请谨慎操作)。
  • 准备好“安装”您的DLL后,您必须将其复制到某个地方,然后运行regsvr32以确保已注册。
  • 按照this guide知道将注册表项放在哪里。
  • 64位Windows可能存在问题,如果您构建32位DLL,则它可能无法在64位资源管理器中加载...因此,如果在使用64位Windows时遇到问题,请记住这一点。
  • 您的DLL实际上将具有两个与其关联的GUID。我不记得它是如何工作的,但是一个GUID指的是DLL本身,而另一个GUID指的是实际的Shell扩展。在需要GUID的注册表中创建注册表项时,请确保使用实际Shell Extension的GUID。

  • 考虑了所有事物…(tl; dr)
    权衡一下Shell扩展是否值得的成本。如果要基于所选文件动态创建菜单项,则Shell扩展可能是唯一的方法。如果要同时处理所有文件,则可能还需要Shell扩展。
    上下文菜单方法的另一种选择是在用户的桌面上放置一个拖放目标。探索其他让用户将文件提交到应用程序的方法,因为Shell Extension往往要付出更多的努力。我发现这很困难,我想其他人也都有。

    关于c++ - 如何用C++编写Shell扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8811621/

    60 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com