shell如何获取文件的属性?
Windows Shell在Shell名称空间中公开了有关项目(例如文件和文件夹)的丰富属性系统。
例如:
要使外壳读取这些属性,显然它必须使用许多资源:
IFilter
是否可以检索标题,作者,主题, Office文档中的评论等无论哪种方式,它都必须读取文件内容流并对文件的内容进行处理,以获取所有这些精美的shell属性。换句话说:
IStream \
+ |--> [magic] --> IPropertyStore
.ext /
我有一些不在shell名称空间中的项目;它们在数据存储区中。当确实需要执行复制粘贴或拖放操作时,我确实通过CF_FILEDESCRIPTOR
通过IDataObject
以1的形式将它们公开给了shell。但除此之外,它们只是数据存储中的可流blob。
我希望能够利用非常有才干且努力工作的所有现有工作 IPropertyStoreFactory Shell团队从“文件”中读取元数据,最后仅以IStream
的形式存在。
也许有一个绑定上下文选项可以让我基于IStream
而不是IDataObject
获取属性存储?
因此,而不是:
IShellItem2
是否有一个
IPropertyStore ps = shellItem2.GetPropertyStore();
?
shell如何获取文件的所有属性?
通常通过IShellItem::BindToHandler或IShellItem2::GetPropertyStore获得此接口。 它对于希望避免通过Initializing Property Handlers创建属性存储的额外开销的数据源实现者有用。但是,除非您通过Shell文件夹扩展名实现数据源,否则建议使用 IShellItem2 :: GetPropertyStore 获取属性存储。
IPropertyStore ps = GetShellPropertiesFromFileStream(stream);
但是IPropertyStore ps = CoCreateInstance(CLSID_PropertyStore);
IInitializeWithStream iws = ps.QueryInterface(IID_IInitializeWithStream);
不支持CLSID_PropertyStore
。
属性处理程序是属性系统的关键部分。 索引器在过程中调用它们以读取和索引属性值,并且Windows资源管理器也在过程中调用它们以直接在文件中读取和写入属性值。
答案 0 :(得分:2)
(在Property Store处理程序中有一些经验)我如何看待解决方案:
获取文件扩展名的PropertyStore处理程序CLSID。您应该使用2个regkey键:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\PropertySystem\PropertyHandlers\.yourext
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\PropertySystem\SystemPropertyHandlers
使用CoCreateInstance创建两个对象
如果您有2个对象,则可以使用 PSCreateMultiplexPropertyStore
查询 IInitializeWithStream (也可以尝试查询 IPersistStream )。
如果PropertyStore对象支持 IInitializeWithStream / IPersistStream :您很幸运-只需初始化您的对象并查询所需的属性即可。如果不是,则-您仍然具有(脏)变体来创建临时文件,然后使用 IPersistFile 。