是否可以获取不在shell命名空间中的项的shell属性?

问题描述 投票:3回答:1

精简版

shell如何获取文件的属性?

长版

Windows Shell公开了有关shell命名空间中项(例如文件和文件夹)的丰富系统属性。

例如:

  • System.Title:SQL Server Native Client OLE DB到ODBC转换的快速指南
  • System.Author:George Yan(KW)
  • System.Document.LastAuthor:rohanl
  • System.Comment:要了解有关此演讲者的更多信息,请查找其他TEDTalks,并订阅此Podcast系列,请访问www.TED.com反馈:[email protected]
  • System.ItemParticipants:George Yan(KW)
  • System.Company:Contoso
  • System.Language:英语(美国)
  • System.Document.DateCreated:6/10/2014 5:16:30ᴘᴍ
  • System.Image.Horizo​​ntalSize:1845像素
  • System.Image.VerticalSize:4695像素
  • System.Image.Horizo​​ntalResolution:71 dpi
  • System.Image.VerticalResolution:71 dpi

为了让shell读取这些属性,显然必须使用很多来源:

  • Windows Media Foundation IMFMetadata非常适合图像和电影
  • Windows Imaging Component(WIC)可能有很多用于读取元数据的API
  • 我不确定IFilter是否可以从Office文档中检索标题,作者,主题,评论等

无论哪种方式,它必须读取文件内容流并对文件的内容执行某些操作以获得所有这些花哨的shell属性。换一种说法:

IStream  \
   +      |--> [magic] --> IPropertyStore
 .ext    /

可以用我自己的流吗?

我有不在shell命名空间中的项目;他们在数据存储中。当它执行复制粘贴或拖放时,我确实通过IDataObject将它们暴露在壳中作为CF_FILEDESCRIPTORIStream。但除此之外,它们只是数据存储中的可流动blob。

我希望能够利用非常有才华和努力工作的1 shell团队所做的所有现有工作,从“文件”中读取元数据,最终只存在于IStream

是否有一个绑定上下文选项,让我可以获得基于IDataObject而不是IShellItem2的属性存储?

所以而不是:

IPropertyStore ps = shellItem2.GetPropertyStore();

有没有:

IPropertyStore ps = GetShellPropertiesFromFileStream(stream);

?

shell如何获取文件的所有属性?

奖金Chatter - IPropertyStoreFactory

该界面通常通过IShellFolder::BindToObjectIShellItem::BindToHandler获得。对于希望避免通过IShellItem2::GetPropertyStore创建属性存储的额外开销的数据源实现者而言,它非常有用。但是,除非您通过Shell文件夹扩展实现数据源,否则IShellItem2 :: GetPropertyStore是获取属性存储的推荐方法。

试着

IPropertyStore ps = CoCreateInstance(CLSID_PropertyStore);
IInitializeWithStream iws = ps.QueryInterface(IID_IInitializeWithStream);

CLSID_PropertyStore不支持IInitializeWithStream

奖金阅读

  • MSDN:Initializing Property Handlers 物业处理人员是物业系统的重要组成部分。它们由索引器在进程中调用以读取和索引属性值,并且还由Windows资源管理器在进程中调用,以直接在文件中读取和写入属性值。
  • MSDN:Registering and Distributing Property Handlers(为了娱乐而阅读注册表以及从另一方阅读合同)
powershell winapi ipropertystorage
1个回答
2
投票

(在Property Store处理程序方面有一些经验)我如何看待解决方案:

  1. 获取PropertyStore处理程序CLSID作为您的文件扩展名。你应该使用2个regkeys键: HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\PropertySystem\PropertyHandlers\.yourext HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\PropertySystem\SystemPropertyHandlers
  2. 使用CoCreateInstance创建两个对象
  3. 如果你有2个对象,你可以将它们组合成PSCreateMultiplexPropertyStore的单个对象
  4. 查询IInitializeWithStream(您也可以尝试查询IPersistStream)。

如果PropertyStore对象支持IInitializeWithStream / IPersistStream:你很幸运 - 只需初始化你的对象并查询你需要的属性。如果没有 - 你仍然有(脏)变体来创建临时文件,然后使用IPersistFile

© www.soinside.com 2019 - 2024. All rights reserved.