儲存屬性集
應用程式可以公開其檔的一些狀態資料,讓其他應用程式可以找出和讀取該資料。 一些範例是屬性集,描述以字處理器建立之檔的作者、標題和關鍵字,或檔中所使用的字型清單。 這項功能不限於檔;它也可用於内嵌物件。 一般而言,屬性集的存取應該透過 IPropertySetStorage 和 IPropertyStorage 介面來存取,但本節說明先前建議的方式。
注意
如果儲存應用程式內部的屬性集,您可能不想使用下列指導方針。 若要將屬性設為其他應用程式,請遵循這些指導方針。
將屬性集儲存在複合檔案中
- 在與資料流程相同的儲存體結構層級中建立 IStorage 或 IStream 實例。 請遵循 IStorage 或 IStream 實例的名稱搭配 「\005」。開頭為 0x05 的資料流程和儲存體名稱會保留給可在應用程式之間共用的通用屬性集。 此外,以該值開頭的資料流程限制為 256 KB。 您可以從已發佈的名稱和格式選取名稱,或指派 屬性設定 FMTID,並根據 儲存體物件命名慣例中所述的慣例,從 FMTID 衍生名稱。
- 屬性集可以儲存在單一 IStream 實例或包含多個資料流程和儲存體的 IStorage 實例中。 在 IStorage 實例的情況下,名為 Contents 的內含資料流程是包含屬性值的主要資料流程,其中某些值可能是此屬性集之儲存體內其他資料流程或儲存體實例的名稱。
- 指定物件類別的 CLSID,這個類別可以顯示或提供屬性值的程式設計存取。 如果沒有這類類別,CLSID 應該設定為屬性集的格式識別碼。 對於使用 IStorage 實例的屬性集,請將 IStorage 實例的 CLSID 設定為與儲存在 Contents 資料流程中的 CLSID 相同,或 設定為CLSID_Null;新建立 之 IStorage 實例中的值。
- 您可以選擇指定可顯示的名稱,以形成字典的內容。
某些應用程式可以唯讀實作儲存為 IStream 實例的屬性集。 應用程式應該寫入預期屬性集可能儲存在 IStorage 或 IStream 實例中,除非屬性集定義另有指示。 例如,Summary Information 屬性集定義指出它只能儲存在具名 IStream 實例中。 如果您要搜尋屬性集,且不知道它是儲存體或資料流程,請先尋找具有屬性集名稱的 IStream 實例。 如果失敗,請尋找 IStorage 實例。
若要進一步瞭解將屬性集儲存在 IStorage 實作 中,假設有一類應用程式可編輯動物的相關資訊。 首先,CLSID (CLSID_AnimalApp) 是針對這組應用程式所定義,因此可以指出他們瞭解屬性集,其中包含動物資訊 (FMTID_AnimalInfo) ,以及其他包含醫療資訊的屬性集 (FMTID_MedicalInfo) 。
IStorage (File): "C:\OLE\REVO.DOC"
IStorage: "\005AnimalInfo", CLSID = CLSID_AnimalApp
IStream: "Contents"
WORD wByteOrder, WORD wFmtVersion, DWORD dwOSVer,
CLSID CLSID_AnimalApp, DWORD cSections...
...
FMTID = FMTID_AnimalInfo
Property: Type = PID_ANIMALTYPE, Type = VT_LPWSTR,
Value = L"Dog"
Property: Type = PID_ANIMALNAME, Type = VT_LPWSTR,
Value = L"Revo"
Property: Type = PID_MEDICALHISTORY, Type = VT_STREAMED_OBJECT,
Value = "MedicalInfo"
...
IStream: "MedicalInfo"
WORD wByteOrder, WORD wFmtVersion, DWORD dwOSVer,
CLSID CLSID_AnimalApp, DWORD cSections...
...
FMTID = CLSID_MedicalInfo
Property: Type = PID_VETNAME, Type = VT_LPWSTR,
Value = L"Dr. Woof"
Property: Type = PID_LASTEXAM, Type = VT_DATE, Value = ...
請注意,IStorage介面和這兩個屬性集的 CLSID CLSID_AnimalApp。 這會識別任何可顯示和/或提供這些屬性集程式設計存取的應用程式。 任何應用程式都可以讀取屬性集內的資料, (屬性集背後的點) ,但只有使用類別識別碼識別的應用程式CLSID_AnimalApp才能瞭解屬性集中資料的意義。