系統提供的獨立實作 IPropertySetStorage 包含 IPropertyStorage的實作,該介面會讀取和寫入屬性集記憶體中的屬性。 IPropertySetStorage 介面會在記憶體中建立和開啟屬性集。 獨立實作中也會提供 IEnumSTATPROPSTG 和 IEnumSTATPROPSETSTG 介面。
若要取得獨立實作 IPropertyStorage的指標,請呼叫 StgCreatePropStg 函式來建立新的屬性集或 StgOpenPropStg 取得現有屬性集上的介面指標(或呼叫 Create 或 Open 方法 IPropertySetStorage 獨立實作)。
IPropertyStorage 的獨立實作 會在任何記憶體或數據流物件上建立屬性集,而不只是在複合檔案記憶體和數據流上。 獨立實作不相依於複合檔案,並可搭配任何結構化記憶體實作使用。 如需這個介面之複合檔案實作的詳細資訊,請參閱 IPropertyStorage-Compound 檔案實作。
使用時機
使用 IPropertyStorage 來管理單一屬性集內的屬性。 其方法支援讀取、寫入和刪除屬性,以及可與屬性標識符相關聯的選擇性字串名稱。 其他方法支持標準認可和還原記憶體作業。 另外還有一種方法可以設定與屬性記憶體相關聯的時間,另一個方法允許指派 CLSID 用來將其他程式碼,例如使用者介面程式代碼與屬性集產生關聯。 Enum 方法會提供獨立實作 IEnumSTATPROPSTG的指標,其會列舉集合中的屬性。
第 0 版和第 1 版屬性集格式
IPropertyStorage 的獨立實作同時支援版本 0 和第 1 版屬性集串行化格式。 如需詳細資訊,請參閱 屬性集串行化。 屬性集會以版本 0 格式建立,除非要求新功能,否則會維持該格式。 屆時,格式會更新為第1版。
例如,如果使用 PROPSETFLAG_DEFAULT 旗標建立屬性集,則其格式為版本 0。 只要符合第 0 版格式的屬性類型會寫入該屬性集並從該屬性集讀取,屬性集會維持為第 0 版格式。 如果第 1 版屬性類型寫入屬性集,則屬性集會自動更新為第 1 版。 之後,只有瞭解版本 0 的實作無法再讀取該屬性集。
IPropertyStorage 和 Variant 類型
IPropertyStorage 的獨立實作不支援VT_UNKNOWN或VT_DISPATCH PROPVARIANT 結構之 vt 成員中的變體類型。
SafeArray 內支援下列變體類型:也就是說,這些值可以與 PROPVARIANT 結構 vt 成員中的VT_ARRAY結合。
IPropertyStorage 的複合檔案實作,在 SafeArray 內支援的變體類型
VT_I1
VT_UI1
VT_I2
VT_UI2
VT_I4
VT_UI4
VT_INT
VT_UINT
VT_R4
VT_R8
VT_CY
VT_DATE
VT_BSTR
VT_BOOL
VT_DECIMAL
VT_ERROR
VT_VARIANT
當VT_VARIANT與VT_ARRAY結合時,SafeArray 本身會保存 PROPVARIANT 結構。 不過,必須從上述清單中擷取這些項目的類型,不能VT_VARIANT,而且不能包含VT_VECTOR、VT_ARRAY或VT_BYREF指標。
IPropertyStorage 方法
IPropertyStorage 的獨立實作支援下列方法:
-
讀取 rgpspec 陣列中指定的屬性,並提供 PROPVARIANT 元素之 rgvar 陣列中所有有效屬性值。
在系統提供的獨立實作中,參考數據流或儲存類型的重複屬性標識碼會導致多次呼叫 IStorage::OpenStream 或 IStorage::OpenStorage::OpenStorage,以及 ReadMultiple 的成功或失敗,取決於基礎儲存器實作共用開啟記憶體的能力。
此外,若要確保線程安全作業,如果相同的數據流或記憶體值屬性透過相同的 IPropertyStorage 指標多次要求,開啟將會成功或失敗,視屬性是否已開啟,以及基礎文件系統是否處理數據流或記憶體的多個開啟。 因此,ReadMultiple 數據流或記憶體值屬性上的作業一律會導致呼叫 IStorage::OpenStream,或 IStorage::OpenStorage,傳遞存取權(例如STGM_READWRITE,例如)和共用值(例如,例如,在屬性集最初開啟或建立時指定的STGM_SHARE_EXCLUSIVE)。
如果方法失敗,則寫入至 rgvar[] 的值是未定義的。 如果成功開啟某些數據流或記憶體值屬性,但在執行完成之前發生錯誤,則應該在方法傳回之前釋放這些屬性。
-
寫入 rgpspec[] 陣列中指定的屬性,並將它們指派 PROPVARIANT 標記和 rgvar[] 中指定的值。 已經存在的屬性會指派指定的 PROPVARIANT 值,而目前不存在的屬性則會建立。
-
刪除 rgpspec[] 中指定的屬性。
-
讀取與 rgpropid[] 陣列中指定的屬性識別符相關聯的現有字串名稱。
-
將 rglpwstrName 陣列中指定的字串名稱指派給 rgpropid 陣列中指定的屬性識別符。
-
藉由將 null NULL 寫入屬性名稱,以刪除在 rgpropid 陣列中指定的屬性識別符字串名稱。
-
設定屬性集數據流 CLSID。 在獨立實作中,在非simple 屬性集上設定 CLSID(可以包含記憶體或數據流值屬性的集合,如 IPropertySetStorage::Create中所述)也會在基礎子記憶體上設定 CLSID,以便透過呼叫 IStorage::Stat取得它。
-
針對簡單和非簡單屬性集,請將記憶體映像排清到磁碟子系統。 此外,對於非簡單交易模式屬性集,此方法會在屬性集上呼叫 IStorage::Commit。
-
若為非simple 屬性集,請呼叫基礎記憶體的 Revert 方法,並重新開啟「內容」數據流。 針對簡單屬性集,只會傳回E_OK。
-
建立列舉值對象,這個物件會實作 IEnumSTATPROPSTG,其方法可以呼叫來列舉 STATPROPSTG 結構,以提供集合中每個屬性的相關信息。
-
填入 STATPROPSETSTG 結構的成員,其中包含整個屬性集的相關信息。 傳回時,提供 結構的指標。
對於非簡單儲存集,此實作會呼叫 IStorage::Stat (或 IStream::Stat),以從基礎記憶體或數據流取得資訊。
-
若為僅限非Simple 屬性集,請設定基礎記憶體所支持的時間。 這個 setTimes 實作 會呼叫基礎記憶體的 IStorage::SetElementTimes 方法來修改時間。 它支援基礎方法所支持的時間,可以是修改時間、存取時間或建立時間。
相關主題