【问题标题】:PROPERTYKEY::pid MeaningPROPERTYKEY::pid 含义
【发布时间】:2013-03-13 14:31:07
【问题描述】:

有人能解释一下PROPERTYKEY 结构中的pid 字段是什么吗?微软说不要使用01,你很好,但是当我需要在我的代码中实现IPropertyStore 时,这并没有帮助。 pid 是否应该是键的一部分,因此可能存在具有相同 fmtid 但不同 pid 的多个值?还是应该忽略它,所以GetValue 应该返回任何与fmtid 匹配的值,而忽略pid

【问题讨论】:

    标签: winapi windows-7 ipropertystorage


    【解决方案1】:

    这个 fmtid+pid 组合在历史上与 OLE 相关(是的,这很古老)。

    当时fmtid(格式id)就像一个类别,pid(属性id)是类别中的属性标识符。例如,您在此处定义了第一个 FMTID:Predefined Property Set Format Identifiers。这些属性仍然用于 Office 文档(作者、关键字等)所以每个类别都有很多属性(对于很多属性来说 fmtid 很少),但是 fmtid 和 pid 的组合总是使属性在空间和星系。

    其他 FMTID 出现以来,你可以在 Windows SDK 的 propkey.h 中查看:FMTID_AudioSummaryInformation、FMTID_Volume、FMTID_ShellDetails 等...

    今天,对于一些新属性,FMTID 不再具有任何意义。例如System.Contact.Birthday的fmtid为176DC63C-2688-4E89-8143-A347800F25E9,id为47,但fmtid没有特殊含义,也没有具体定义,所以实际上可以单独作为key使用。

    因此,对于给定的属性,您必须考虑键仍然是两者的组合(因此结构名称:PROPERTYKEY),但您可以使用 pid 将自己的属性定义为大于或等于 2 的值(作为官方doc 指定)和 fmtid 作为新的 guid(如果您愿意)。我个人还是更喜欢为一组属性定义一个通用的 FMTID。

    【讨论】:

    • 不要使用 pid 零或 1,甚至对于自定义 fmtid。
    • @RaymondChen - PROPERTYKEY 参考文档确实规定该值必须大于或等于 2。这些是 PID_DICTIONARY 和 PID_CODEPAGE 对吗?我知道这些对于 OLE 复合存储有特殊意义,但是即使不用于复合文件,它仍然被禁止吗?
    • 保留的 pid 被保留。
    • 感谢@Simon,特别是关于您对保留 PID 的想法非常有趣!!!
    猜你喜欢
    • 2023-04-03
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多