2013-03-13 26 views
1

有人可以解釋一下PROPERTYKEY結構中的pid字段是什麼嗎?微軟說,只是不使用01,你很好,但是當我需要在我的代碼中實現IPropertyStore時,這沒有幫助。 pid是否應該是密鑰的一部分,因此可能存在具有相同fmtid但不同pid的多個值?或者應該忽略,所以GetValue應返回任何值與匹配fmtid,忽略pidPROPERTYKEY :: pid含義

回答

3

此fmtid + pid組合歷史上與OLE相關(是的,這很舊)。

那時,fmtid(格式ID)就像一個類別,pid(屬性ID)是類別中的屬性標識符。例如,您在此處定義了第一個FMTID:Predefined Property Set Format Identifiers。這些屬性仍然用於Office文檔(作者,關鍵字等)。因此,每個類別有很多屬性(對於很多屬性只有很少的屬性),但fmtid和pid的組合總是使屬性在整個空間中唯一星系。

其他FMTID因爲出現了,你可以在Windows SDK的propkey.h在看看:FMTID_AudioSummaryInformation,FMTID_Volume,FMTID_ShellDetails等..

今天,對於一些新的特性,在FMTID並不意味着什麼了。例如,System.Contact.Birthday具有1 76DC63C-2688-4E89-8143-A347800F25E9的fmtid和47的id,但fmtid沒有特別的含義,並且沒有具體定義,所以它實際上可以僅用於密鑰。因此,對於一個給定的屬性,你必須考慮到鍵仍然是兩者的結合(因此結構名稱:PROPERTYKEY),但是你可以用pid定義你自己的屬性大於或等於2(如官方文檔指定)和fmtid作爲新的guid,如果你願意。我個人仍然傾向於爲一組屬性定義一個共同的FMTID。

+0

不要使用pid零或一個,即使對於自定義fmtids。 – 2013-03-13 15:04:11

+1

@RaymondChen - PROPERTYKEY參考文檔確實規定了值必須大於或等於2.這些是PID_DICTIONARY和PID_CODEPAGE對不對?我知道這些對於OLE複合存儲有特殊意義,但即使不用於複合文件,它仍然被禁止? – 2013-03-13 15:11:53

+0

保留的pid是保留的。 – 2013-03-13 15:20:09