shell如何获取文件的属性?
Windows Shell公开了有关shell命名空间中项(例如文件和文件夹)的丰富系统属性。
例如:
为了让shell读取这些属性,显然必须使用很多来源:
IFilter
是否可以从Office文档中检索标题,作者,主题,评论等无论哪种方式,它必须读取文件内容流并对文件的内容执行某些操作以获得所有这些花哨的shell属性。换一种说法:
IStream \
+ |--> [magic] --> IPropertyStore
.ext /
我有不在shell命名空间中的项目;他们在数据存储中。当它执行复制粘贴或拖放时,我确实通过IDataObject
将它们暴露在壳中作为CF_FILEDESCRIPTOR
和IStream
。但除此之外,它们只是数据存储中的可流动blob。
我希望能够利用非常有才华和努力工作的1 shell团队所做的所有现有工作,从“文件”中读取元数据,最终只存在于IStream
。
是否有一个绑定上下文选项,让我可以获得基于IDataObject
而不是IShellItem2
的属性存储?
所以而不是:
IPropertyStore ps = shellItem2.GetPropertyStore();
有没有:
IPropertyStore ps = GetShellPropertiesFromFileStream(stream);
?
shell如何获取文件的所有属性?
该界面通常通过IShellFolder::BindToObject或IShellItem::BindToHandler获得。对于希望避免通过IShellItem2::GetPropertyStore创建属性存储的额外开销的数据源实现者而言,它非常有用。但是,除非您通过Shell文件夹扩展实现数据源,否则IShellItem2 :: GetPropertyStore是获取属性存储的推荐方法。
IPropertyStore ps = CoCreateInstance(CLSID_PropertyStore);
IInitializeWithStream iws = ps.QueryInterface(IID_IInitializeWithStream);
但CLSID_PropertyStore
不支持IInitializeWithStream
。
(在Property Store处理程序方面有一些经验)我如何看待解决方案:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\PropertySystem\PropertyHandlers\.yourext
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\PropertySystem\SystemPropertyHandlers
如果PropertyStore对象支持IInitializeWithStream / IPersistStream:你很幸运 - 只需初始化你的对象并查询你需要的属性。如果没有 - 你仍然有(脏)变体来创建临时文件,然后使用IPersistFile。