Windows如何将图标关联到资源管理器shell中的文件?

Windows如何将图标关联到资源管理器shell中的文件?

问题描述:

我安装了InDesign CS2和CS3。两者都使用.indd扩展名的文件。 Windows如何知道使用哪个图标?它使用正确的图标,即CS2文件有CS2图标和CS3文件有CS3图标。Windows如何将图标关联到资源管理器shell中的文件?

怎样的Windows知道如何做到这一点?

我怎样才能提取或以我的程序使用此版本检测系统?

编辑:

谢谢您的外壳扩展图标处理程序的答案。对我来说是新的东西。但是,有什么方法可以连接到InDesign提供的IconHandler并使用它来检测InDesign文件的版本?

+0

您不可能从InDesign的处理程序获取该信息。但是,值得一提的是,是否有任何其他shell扩展注册为该文件类型,例如它可能会实现可以为您提供该值的属性界面。尝试右键单击以获取文件属性并检查“详细信息”选项卡。 我会尝试加载cs2和cs3文件到十六进制编辑器,并看看前20个字节左右。在许多文件格式中,标题是通用的,并且包含版本号(不一定是2或3),因此您可以从中识别出来。 – 2010-02-25 22:38:34

+0

@the_mandrill这就是我正在读第一个字节。但版本信息不固定,有时会浮动。这就是为什么我正在寻找更可靠的方法,如果有的话。 – Kugel 2010-02-26 07:32:02

+0

在这种情况下,除非文件格式已发布或反向工程,否则您可能无法执行此操作。一种可能是调用Adobe的图标处理程序,然后检测哪个图标已被使用,但这可能是不可靠的,并且当然要求处理程序已安装在系统上(您可能无法保证,而且您不会能够重新分配它)。 – 2010-02-27 22:20:51

你需要写一个图标处理程序外壳扩展。请参阅IExtractIconMSDN文档。基本的机制是你创建一个shell扩展并为你想要的文件类型注册图标处理程序(查看HKEY_CLASSES_ROOT/.indd),然后shell加载你的处理程序,传递文件信息并请求一个图标作为回报。如果您想提供缩略图位图而不仅仅是图标,还有IExtractImage方法。

请注意,你必须要特别小心写作外壳扩展名处理任何内存泄漏或崩溃可以攻击的Explorer和显示打开的文件的任何其他应用程序/保存对话框。

+0

好的,你回答了我的问题的第一部分。另一部分可能是不可能的。 – Kugel 2010-02-26 08:54:03

它几乎肯定会安装一个shell icon extension handler。编写你自己的知道如何检测文件格式的文件格式没有很好地记录或根本没有记录是非常棘手的。

+0

你可以提供一个支持Windows 7的项目的链接,而不仅仅是XP? – Beno 2013-08-18 06:37:52

对于某些文件是HKEY_CLASSES_ROOT\<file extension here>\DefaultIcon注册表项,但大多数文件映射到一个更友好的名称,例如.pdf\(Default) - >AcroExch.Document(如果安装了Adobe Reader)。

在你必须沿着注册表去AcroExch.Document看看,要么

  • DefaultIcon就在那里
  • AcroExch.Document\CLSID\(Default)一些GUID这种情况下。然后,按照HKEY_CLASSES_ROOT\CLSID\<insert that guid here>,你会发现,这个键包含DefaultIcon

...和DefaultIcon是其中的图标从加载。

希望已经足够清楚了;)。我不知道你的特例,但是在注册表中应该有所区别。

+0

固定图标就是这种情况,但OP在询问如何以编程方式切换图标类型,这是因为您有两个版本的文件但扩展名相同。 +1,但提到必须在GUID上进行第二级间接寻址 – 2010-02-25 22:30:33