【问题标题】:Making a Windows shell extension in Visual Studio 2010在 Visual Studio 2010 中制作 Windows shell 扩展
【发布时间】:2010-09-08 18:05:32
【问题描述】:

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

我使用的是 Windows 7 x64。

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

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

我查看了this C# COM Interop example,但由于this article*,我一直对使用C# 是否安全感到困惑,但如果我使用.NET 4 看起来我可能没问题,因为it supports in process side-by-side CLR hosting.

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

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

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

过去我对 C++ 的使用并没有那么糟糕,但是经过多年的 .NET 成型后,我已经很生疏了,因此,我一直在摆弄细节来修复我遇到的大量错误现有的例子证明......很繁琐!

我真的可以从头开始,我可以打破自己并找出做错了什么!

【问题讨论】:

  • 是的,您现在可以使用 .NET 4.0。进程内并排是为了支持这种用法而明确发明的。
  • @Hans - 所以 .NET 4 将注入 .NET 2 并且一切都会继续存在?
  • 如果可能的话,我会劝阻它,这意味着系统上的每个应用程序都会在打开文件对话框时加载 CLR...
  • @Paul Betts:我会两次支持您的评论;我们都记得那个愚蠢的 ATI 快捷方式(使用 CLR shell 扩展制作),它使桌面上的每次右键单击都成为 PITA...

标签: windows visual-studio-2010 shell-extensions


【解决方案1】:

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

我最近选择了这个项目并重新开始使用 MS all-in-one 代码示例,我很高兴。它创建了一个简单的示例上下文菜单,并且 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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 您需要同时安装 32 位和 64 位版本,以便您的 32 位应用程序也获得扩展。
    • 注意,您不能依赖 Windows XP 中的资源管理器子进程加载。在那里,如果首先加载 .NET 2 插件,则 .NET 4 插件将失败,因为加载了错误的运行时。如果首先加载 .NET 4,则 .NET 2 将正常加载,因为 .NET 4 支持并行运行时。
    【解决方案3】:

    我得到了这个工作: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/Any CPU 进行编译。使用C:\Windows\Microsoft.NET\Framework64\vXYZ\RegAsm.exe

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

    但请注意,Microsoft recommends against using .NET for shell extensions.

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-20
        • 1970-01-01
        • 1970-01-01
        • 2012-06-30
        相关资源
        最近更新 更多