14

我正在尝试使用 Visual Studio 2010 在 C++ 中创建一个极其简单的 shell 扩展,但我什至无法将这些示例作为起点。

我正在使用 Windows 7 x64。

我已经尝试过这个 Visual Studio 模板,但是一旦我让模板在 VS2010 中工作,我就会遇到很多我不知道如何修复的错误。

我已经尝试过The Complete Idiot's Guide to Writing Shell Extensions,一旦演示编译完成,所有正确的注册表设置等都会创建,但不会出现上下文菜单。

我看过这个 C# COM Interop example ,但是由于这篇文章*,我一直对使用 C# 是否安全感到困惑*,但如果我使用 .NET 4 看起来我可能没问题,因为它支持进行并行 CLR 托管

  • 简而言之:历史上两个版本的 .NET 不能在同一个进程中运行,而 shell 扩展的工作方式是将自己注入到一个进程中。因此,如果 .NET 3.5 被注入到 .NET 2 进程中 -

那么,我现在可以使用 .NET 4.0 了吗?

是否有一个工作的、可下载的 VS2010 解决方案添加了一个简单的 shell 扩展?

以前我对 C++ 的使用还算不错,但是经过多年的 .NET 成型后,我已经很生疏了,因此,我在修改细节以修复我在现有示例中遇到的大量错误正在证明......繁琐!

我真的可以从一张白纸开始,我可以打破自己并弄清楚做错了什么!

4

4 回答 4

7

由于 x64 问题和 SDK 差异,我为此苦苦挣扎了一段时间,并且代码项目文章的成功有限。

我最近选择了这个项目并重新开始使用 MS一体化代码示例,我非常高兴。它制作了一个简单的示例上下文菜单,并且 x64 开箱即用: http: //code.msdn.microsoft.com/windowsdesktop/CppShellExtContextMenuHandl-410a709a

让它在你的机器上运行:

  1. 通过一体化示例浏览器下载代码或使用直接链接。
  2. 在 VS 中以管理员权限打开项目
  3. 将构建配置切换到 x64 并构建它
  4. 杀死所有资源管理器会话
  5. 找到新的 dll 并运行 regsvr32.exe .\CppShellExtContextMenuHandler.dll
  6. 再次打开资源管理器并右键单击 .cpp 文件以查看新菜单
  7. 通过使用 /u 标志运行相同的命令来删除它

我的下一步是让调试工作,我认为这可能会奏效:msdn

于 2012-01-22T14:44:31.930 回答
1

在 Windows 7 x64 上,对于 C++ 扩展,您需要将其构建为 x64 项目。在 Visual Studio 2010 中,ATL 向导中有一个选项可用于创建提供预览窗口支持、缩略图和 Windows 搜索支持的 shell 扩展项目。我最近使用了这个,一旦建成,似乎什么也没发生。但是,切换项目配置以构建 x64 dll 使其工作。

关于使用 .Net - Explorer 现在在单独的子进程中启动插件。因此,加载链接到 .net 4.0 的 shell 扩展不会用该版本的 .net 污染所有内容,因为只有托管子进程才会实际加载该 CLR。您可以使用预览扩展程序看到这一点,因为启动了一个新进程(prevhost)来包含它。

于 2011-02-25T22:02:35.487 回答
0

我得到了这个工作: http: //www.codeproject.com/Articles/174369/How-to-Write-Windows-Shell-Extension-with-NET-Lang

确保您使用正确RegAsm.exe的注销/注册它:

  • 32 位平台:为 x86/Any CPU 编译。使用C:\Windows\Microsoft.NET\Framework\vXYZ\RegAsm.exe.
  • 64 位平台:为 x64/任何 CPU 编译。使用C:\Windows\Microsoft.NET\Framework64\vXYZ\RegAsm.exe.

XYZ是您用于编译的 .NET Framework 版本。)

但是请注意,Microsoft 建议不要将 .NET 用于 shell 扩展

于 2013-08-01T12:46:35.643 回答
0

对您的“我可以使用 C#”的简短回答是否定的。这来自 Microsoft 的实施进程内扩展指南。“一个特别值得注意的运行时是公共语言运行时 (CLR),也称为托管代码或 .NET Framework。Microsoft 建议不要将托管进程内扩展写入 Windows Explorer 或 Windows Internet Explorer,并且不认为它们是受支持的方案。” 出现问题是因为在应用程序中只能使用一个版本的 .NET,如果使用多个 .NET 扩展,则无法强制实施该限制。

于 2017-09-05T01:17:38.790 回答