共用方式為


屬性系統概觀

Windows 屬性系統是一種可延伸的資料定義讀取/寫入系統,可提供一種統一的方式來表示有關 Shell 專案的中繼資料。 Windows Vista 和更新版本中的 Windows 屬性系統可讓您儲存和擷取 Shell 專案的中繼資料。 Shell 專案是任何單一內容片段,例如檔案、資料夾、電子郵件或連絡人。 屬性是與 Shell 專案相關聯的個別中繼資料片段。 屬性值會以 PROPVARIANT 結構表示。

本主題的組織方式如下:

簡介

屬性會以其標準名稱 (唯一識別,例如 System.Document.LastAuthor) 和屬性索引鍵 (,例如 PKEY_Document_LastAuthor) 。 PKEY (屬性索引鍵) 是名稱/值組的名稱部分,由 PKEY/PROPVARIANT 或字串/PROPVARIANT 所組成,其中字串是 PKEY (標準名稱,例如 System.Document.LastAuthor) 。 PKEY 是一個定義,會告訴屬性系統它需要知道屬性的所有專案,而值則是屬性的實際實例。 PKEY 在內部包含 formatID 和 propID。

個別屬性包含下列三個部分:

  • 標準名稱,例如 System.Music.Artist
  • 架構描述,以 .propdesc XML 檔案格式指定,並以程式設計方式透過 IPropertyDescription來表示。
  • 值,例如擷取的名稱。

架構描述包含屬性的相關資訊,例如屬性名稱、資料類型、條件約束、屬性如何與檢視和搜尋系統互動等資訊。 名稱和架構描述會全域定義,而且所有專案和類型都相同。 值專屬於個別專案。 也就是說, System.Music.Artist 屬性一律定義為多重值字串,但每個專案) 可能有不同的值 (或完全沒有值。

屬性處理常式會將儲存在檔案中的資料轉譯為可辨識且可由 Windows 檔案總管、Windows 搜尋和其他應用程式存取的結構化架構。 然後,這些系統就可以與屬性處理常式互動,以在檔案中寫入和讀取屬性。 翻譯的資料會以程式設計方式公開,並在各種內容中透過 Windows 檔案總管向使用者顯示,包括詳細資料檢視、資訊提示、詳細資料窗格、屬性頁等等。 每個屬性處理常式都會與副檔名所識別的特定檔案類型相關聯。 開發人員應該實作產生和使用其檔案類型原生格式的屬性處理常式,例如.jpg或.png,或使用產生和使用 MS-PROPSTORE 二進位格式的 In-Memory Property Store。

Windows 屬性系統會建立抽象資料模型,以提供來自個別檔案格式的抽象層級。 Windows 屬性系統所提供的抽象資料模型是一種方法,可用來讀取和寫入與 Shell 專案相關聯的可延伸命名值集。 值運算式具有彈性,支援許多資料類型,而且可延伸,讓任意資料 (VT_BLOB) 和 物件以值表示。

由於抽象概念,您可以查詢任何專案的屬性或中繼資料。 可以抽象化的專案範例包括 Microsoft Office 檔、ID3 標記,以及AutoCAD和其他協力廠商專屬軟體。 同樣地,如果您有 .jpeg 檔案,您可以使用 .jpeg 和 EXIF 編解碼器來讀取檔案的位元組,以探索影像的維度。 如果您有.png檔案,則需要不同的編解碼器和不同的程式碼來執行此動作。 使用 Windows 屬性系統可避免這種問題。 如果您實作新的檔案類型,您可以選擇插入 Windows 屬性系統所提供的統一抽象概念,並指定如何讓您的中繼資料取用。 基於這些原因,最好是使用 Windows 屬性系統所提供的通用平臺。

開發案例

屬性是由生產者和取用者表示。 在此內容中,產生者是 Windows 屬性系統中屬性的擷取者,而取用者是應用程式 (,而其開發人員) 從這個系統取用屬性資訊。 下表會識別 Windows 屬性系統的 用法和參與者。

使用 Windows 屬性系統 參與者
建置組塊,提供屬性描述的可延伸登錄、記憶體內部屬性存放區實作,以及系結至屬性處理常式、轉換類型,以及序列化屬性存放區的服務。 消費者
想要以抽象方式讀取和寫入屬性的應用程式。 消費者
屬性會藉由定義自訂屬性架構和開發自己的屬性處理常式,來定義屬性系統的新屬性。 產生器 (producer)
想要存取其自訂檔案格式中儲存之屬性的檔案格式擁有者。 產生器 (producer)

 

取用者會取用現有的屬性、架構和屬性處理常式。 可供取用的屬性包括支援檔案類型之屬性處理常式的讀取/寫入屬性,也可能包含一些自訂屬性。 可用的架構至少包含系統架構,有時也會包含其他架構。 取用者可以建立應用程式來取用中繼資料,並根據作者建立檢視,而不論專案儲存在哪個資料夾。 檔案資料夾階層無關。 例如,您可以指定特定音樂專案的所有歌曲專案,而不需擔心這類專案的位置。 這個複雜的端對端案例不限於 Windows 屬性系統,但牽涉到數個不同的元件,例如編制索引和搜尋資料夾。

屬性存放區或協力廠商開發人員是 Windows 屬性系統中的產生者。 準備定義新的屬性時,請先檢查 Windows 所定義的屬性集。 如果您發現符合您需求的類型與語意,其類型與語意相符,請使用該屬性,且不會發明新的屬性。 如果您要定義新的自訂屬性,請嘗試與其他想要使用它的開發人員取得合約,併發布該合約的結果,讓他們可以加入該屬性的使用者社群。

製作者可以利用 Windows 檔案總管功能。 例如,如果您要撰寫新的影像格式,並實作屬性處理常式,新的檔案格式就會在 Windows 檔案總管中使用。 接著,使用者可以標記其相片,並根據 Windows 屬性系統中的任何屬性來樞紐其相片集合。 事實上,Shell 對屬性執行的任何動作,協力廠商開發人員可以在自己的應用程式中執行。 這包括群組、排序、查詢和顯示完整屬性。 Windows 檔案總管所提供的使用者體驗,主要是由具有公開可用 API 的協力廠商實作。 您可以使用這些 API 來取代或擴充 Windows 檔案總管。

從使用 Shell 資料模型之應用程式的觀點來看,有許多案例牽涉到使用 Windows 屬性系統。 媒體管理應用程式是一個顯著的範例。 核心屬性系統案例包括讀取相片的關鍵字屬性或設定 datetaken 屬性等案例。 Windows 屬性系統啟用的端對端整合案例範例,但需要數個其他元件才能運作,包括顯示所有圖片,或尋找包含關鍵字的檔。

當產生者和取用者與 Windows 搜尋和編制索引介面時,屬性會同時為生產者和取用者提供服務。 Windows 搜尋服務具有屬性值的快取,用於 Windows 搜尋服務實作 (WSS) 。 您可以使用 Windows Search OLE DB 提供者,或透過 ISearchFolderItemFactory,以程式設計方式查詢這些屬性值,代表搜尋結果和查詢型檢視中的專案。 當Word檔之類的專案編制索引時,Windows 搜尋接著會收集並儲存篩選處理常式或屬性處理常式所發出的屬性。 重建索引時,會捨棄並重建此存放區。

注意

請記住,當您重新註冊架構時,索引子可能不會遵守對先前定義屬性的屬性所做的變更。 解決方案是重建索引,或引進反映變更的新屬性,而不是更新舊屬性, (不建議) 。 For more information, see Note to Implementers later in this topic.

 

例如,建立媒體應用程式的開發人員想要顯示應用程式的使用者,特定藝術師的所有可用音樂。 應用程式會為使用者提供可用的藝術師清單,然後由使用者選取的藝術師產生所有可用音樂的清單。 或者,使用者可能想要查詢 ?artist:Beethoven?,並在搜尋過程中公開至可用屬性的完整清單。 此範例牽涉到使用 Shell 命名空間、屬性處理常式和/或透過下列其中一項查詢索引:

  • Shell 資料來源。
  • OLE DB 提供者。
  • 儲存的搜尋檔案 (.search-ms) ,用來在 Windows 檔案總管中巡覽至搜尋檔案或以程式設計方式系結至 IShellFolder 來起始查詢。

注意

System.Kind雖然 屬性未參與此媒體應用程式案例,但可用來建置查詢,以傳回特定範圍中的所有 .search-ms 檔案。

 

存取搜尋 API 並建立 Windows 搜尋應用程式的慣用方式是透過 Shell 資料來源。 ISearchFolderItemFactory 是一個元件,可建立 Search 資料夾資料來源的實例,這是 Shell 所提供的一種「虛擬」資料來源,可對 Shell 命名空間中的其他資料來源執行查詢,並列舉結果。 它可以使用索引子,或手動列舉和檢查指定範圍中的專案來執行此動作。

協力廠商開發人員可以透過程式設計查詢建立索引中取用資料的應用程式,並可擴充自訂檔案和專案類型的索引中的資料,以供 Windows 搜尋編制索引。 如果您想要在 Windows 檔案總管中顯示查詢結果,您必須先實作 Shell 資料來源,才能建立通訊協定處理常式來擴充索引。 不過,如果所有查詢都會透過 OLE DB 進行程式設計 (,例如應用程式程式碼) 和解譯,而不是 Shell,則仍偏好使用 Shell 命名空間,但並非必要。 Windows 需要通訊協定處理常式,才能取得檔案內容的相關資訊,例如資料庫或自訂檔案類型中的專案。 雖然 Windows 搜尋服務可以為檔案的名稱和屬性編制索引,但 Windows 沒有檔案內容的相關資訊。 因此,這類專案無法在 Windows Shell 中編制索引或公開。 藉由實作自訂通訊協定處理常式,您可以公開這些專案。 如需您嘗試達成之開發人員案例所識別的處理常式清單,請參閱 Windows 搜尋中的「處理常式概觀」 作為開發平臺

注意

Shell 資料來源有時稱為 Shell 命名空間延伸模組。 處理常式有時稱為殼層延伸模組或 Shell 延伸模組處理常式。

 

實作者注意事項

由於索引子在取用屬性系統的架構時可能會有的潛在困難,因此請務必謹慎且策略地為架構的第一個版本定義屬性。 屬性的任何變更都會 (類型、資料行寬度,不論可編制索引) 在註冊架構之後,都不會反映在資料庫中。 在系統上註冊架構之後,可辨識這些變更的唯一方式是重建索引,然後註冊新的架構,或註冊架構,然後為每個後續版本建立新的屬性;例如 PKEY_GroupName_PropertyNameV2PKEY_GroupName_PropertyNameV3 等。 我們不建議以這種方式建立新的屬性,因為多個多餘的資料行可能會影響系統效能。

Windows 屬性系統檔

本檔的其餘部分包含下列各節:

其他資源

Windows 屬性系統開發人員指南

屬性系統參考

屬性系統程式碼範例