3

我正在考虑编写一个 shell 扩展,以便在单击文件时可以对其执行操作。(就像任何其他上下文菜单:))

我需要在上下文菜单中插入新菜单项并对一个或多个文件执行操作的最低要求是多少。一个比较示例是我选择了 10 个文件并发送到 Zip。

我读到需要编写一些非托管代码,但我对 c++ 非托管代码的了解几乎为零,所以我想尽可能少地获取 Windows 上下文菜单中的菜单项(文件 > 右键单击​​)。之后我想调用一个 C# 控制台应用程序来进行主要处理,那么是否可以从非托管代码调用 ac# 控制台应用程序?

另外,我需要什么类型的 Visual Studio 项目来创建 Windows Shell 程序?我选择哪种项目类型:

  • Win32 控制台应用程序
  • MFC 应用程序
  • Win32 项目
  • ATL 项目
  • MFC DLL
  • CLR 控制台应用程序
  • 类库
  • 生成文件项目
  • MFC ActiveX 控件
  • Windows 窗体控件库

干杯

4

4 回答 4

5

这篇 MSDN 文章将帮助您入门。

您生成一个进程(用托管代码编写)来完成 shell 扩展的实际工作的方法应该没问题。我建议通过CreateProcess将选定的文件作为命令行参数传递。

至于项目类型,您需要生成一个 Win32 动态链接库 (DLL)。2005下,居然有Win32 Dll项目类型。对于 2008(我推断您正在使用),您应该创建一个 Win32 项目,然后在生成的向导中选择 DLL 作为应用程序类型。

于 2010-03-06T04:27:37.427 回答
3

虽然完全在托管代码中编写 shell 扩展并非不可能(我已经完成了),但出于各种原因不建议这样做,但最大的是 shell 扩展是进程内扩展,这意味着资源管理器必须加载整个CLR 进入它自己的地址空间,如果你有两个扩展写入不同版本的 CLR,上帝会帮助你。

最重要的是,这样一个小功能的开销很大。所以最好用 C++ 编写它,因为有很多工具可以做到这一点,包括活动模板库 (ATL)。

于 2010-03-06T05:39:25.963 回答
2

如果您没有使用 Windows 和 COM 的 C++ 经验,那么 shell 扩展可能不是最容易进行的项目。

你确定你真的需要写一个shell扩展吗?

您可以通过注册表轻松添加新的菜单选项(参见此处的示例)并将该选项的“命令”设置为您的 C# 可执行文件。

%1您可以使用路径中的命令将所选文件传递给进程。

所有文件的示例注册表项将是:

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\\*\shell\SomeCmd]
@="Do Some Cmd"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\\*\shell\SomeCmd\command]
@="\"Path to your app\\YourApp.exe\" \"%1\""

注意%1最后的 - 它将是文件的名称。限制是您实际上将为每个文件实例化一次 - 这也将发生在扩展名上。设置注册表项后,它将一直存在,直到您将其删除。

于 2010-03-06T05:33:20.300 回答
0

以下是如何将非托管客户端与 .NET 一起使用的一个示例:http ://groups.google.com/group/codefactory/web/wcf-service-and-unmanaged-c-client

是的,您必须编写非托管代码 (C++) 才能与 Shell 交互。一些 Shell 扩展是用 C# 编写的,但即使是微软也不推荐,因为它将运行时加载到资源管理器的进程空间中。您可以在 codeproject 上找到很多关于编写 ContextMenu 扩展的文章。它涉及编写一个实现 IContextMenu 接口的 COM dll 并在注册表中适当地注册它。

于 2010-03-06T04:34:21.867 回答