代码之家  ›  专栏  ›  技术社区  ›  joshcomley

在Visual Studio 2010中生成Windows Shell扩展

  •  14
  • joshcomley  · 技术社区  · 14 年前

    我试图用VisualStudio 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 但是我一直对使用C是否安全感到困惑,因为 this article *,但如果我使用.NET 4可能会没事,因为 it supports in process side-by-side CLR hosting .

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

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

    有没有一个有效的,可下载的,VS2010解决方案,添加了一个简单的shell扩展?

    在过去的一段时间里,我用C++做的不是那么糟糕,但是经过多年的模压到.NET,我已经生锈了,因此,用细节来修复我在现有例子中发现的错误是证明……烦躁!

    我真的可以用一张干净的石板来开始,我可以打破自己,找出什么 做错了!

    4 回复  |  直到 7 年前
        1
  •  7
  •   wtjones    13 年前

    我为此挣扎了一段时间,由于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。\cppshelextcontextmenuhandler.dll
    6. 再次打开资源管理器,右键单击.cpp文件以查看新菜单
    7. 通过运行带有/u标志的相同命令来删除它

    我的下一步是让调试工作正常进行,我认为这可能会起到关键作用: msdn

        2
  •  1
  •   patthoyts    14 年前

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

    关于使用.NET资源管理器,现在在单独的子进程中启动插件。因此,加载一个链接到.NET 4.0的shell扩展不会污染该.NET版本的所有内容,因为只有宿主子进程才会实际加载该clr。您可以在启动新进程(prevhost)以包含此内容时使用预览扩展来查看此内容。

        3
  •  0
  •   Rok StrniÅ¡a    11 年前

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

    确保使用正确的 RegAsm.exe 取消/注册:

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

    ( XYZ 是用于编译的.NET框架的版本。)

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

        4
  •  0
  •   RLH    7 年前

    您的“我能用c_吗”的简短答案是否定的。这是来自于Microsoft__的过程中扩展实现指南。”一个特别值得注意的运行时是公共语言运行时(clr),也称为托管代码或.NET框架。Microsoft建议不要将托管进程内扩展写入Windows资源管理器或Windows Internet Explorer,并且不将其视为受支持的方案。” 出现这个问题是因为只有一个.NET版本可以在应用程序中使用,并且如果使用多个.NET扩展,则无法强制执行该限制。