應用程式可以公開其檔的某些狀態數據,讓其他應用程式可以找出並讀取該數據。 某些範例是一個屬性集,描述以字處理器建立之檔的作者、標題和關鍵詞,或檔中所使用的字型清單。 這項設施不限於檔;它也可用於內嵌物件。 一般而言,對屬性集的存取應該透過 IPropertySetStorage 和 IPropertyStorage 介面,但本節說明先前建議的方式。
注意
如果儲存應用程式內部的屬性集,您可能不想使用下列指導方針。 若要將您的屬性集合公開給其他的應用程式,請遵循這些指導方針。
將屬性集儲存在複合檔案中
- 在與數據流相同的記憶體結構層級中,建立 IStorage 或 IStream 實例。 請在您的 IStorage 或 IStream 實例名稱後附加“\005”。開頭為 0x05 的串流和存儲名稱保留給可在應用程式之間共用的通用屬性集。 此外,以該值開頭的數據流限製為256 KB。 您可以從已發布的名稱和格式中選取名稱,或為屬性集指派 FMTID,並根據 儲存器物件命名慣例中所述慣例,從 FMTID 衍生名稱。
- 屬性集可以儲存在單一 IStream 實例或包含多個數據流和記憶體的 IStorage 實例中。 在 IStorage 實例的情況下,名為 Contents 的自主數據流是包含屬性值的主要數據流,其中某些值可能是此屬性集記憶體內其他數據流或記憶體實例的名稱。
- 指定具有顯示或程式化存取屬性值能力的物件類別 CLSID。 如果沒有這類類別,CLSID 應該設定為屬性集的格式識別碼。 對於屬性集中使用 IStorage 實例,請將 IStorage 實例的 CLSID 設定為與存儲於 Contents 數據流中的相同,或設定為 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 都是 CLSID_AnimalApp。 這會識別任何可顯示和/或提供對這些屬性集的程序設計存取的應用程式。 任何應用程式都可以讀取屬性集內的數據(屬性集後置點),但只有以類別標識元識別的應用程式CLSID_AnimalApp可以了解屬性集中數據的意義。