IPropertyStorage-獨立實作

IPropertySetStorage的系統提供獨立實作包含IPropertyStorage的實作,該介面可讀取和寫入屬性集儲存體中的屬性。 IPropertySetStorage介面會在儲存體中建立並開啟屬性集。 獨立實作中也會提供 IEnumSTATPROPSTGIEnumSTATPROPSETSTG 介面。

若要取得IPropertyStorage獨立實作的指標,請呼叫StgCreatePropStg函式來建立新的屬性集或StgOpenPropStg,以取得現有屬性集上的介面指標 (或呼叫IPropertySetStorage獨立實作的CreateOpen方法) 。

IPropertyStorage的獨立實作會在任何儲存體或資料流程物件上建立屬性集,而不只是在複合檔案儲存體和資料流程上。 獨立實作不相依于複合檔案,並可搭配任何結構化儲存體的實作使用。 如需此介面之複合檔案實作的詳細資訊,請參閱 IPropertyStorage-Compound File 實作

使用時機

使用 IPropertyStorage 來管理單一屬性集內的屬性。 其方法支援讀取、寫入和刪除屬性和可與屬性識別碼相關聯的選擇性字串名稱。 其他方法支援標準認可和還原儲存體作業。 另外還有一個方法可設定與屬性儲存區相關聯的時間,另一個方法允許指派 CLSID 用來將其他程式碼,例如使用者介面程式碼與屬性集產生關聯。 Enum方法提供IEnumSTATPROPSTG獨立實作的指標,它會列舉集合中的屬性。

第 0 版和第 1 版屬性集格式

IPropertyStorage的獨立實作同時支援第 0 版和第 1 版屬性集序列化格式。 如需詳細資訊,請參閱 屬性集序列化。 屬性集是以第 0 版格式建立,除非要求新功能,否則會維持該格式。 此時,格式會更新為第 1 版。

例如,如果使用 PROPSETFLAG_DEFAULT 旗標建立屬性集,則其格式為第 0 版。 只要符合第 0 版格式的屬性類型寫入和讀取該屬性集,屬性集就會維持為第 0 版格式。 如果將第 1 版屬性類型寫入屬性集,則屬性集會自動更新為第 1 版。 之後,只有瞭解第 0 版的實作無法再讀取該屬性集。

IPropertyStorage 和 Variant 類型

IPropertyStorage的獨立實作不支援PROPVARIANT結構vt成員中的 variant 類型VT_UNKNOWN或VT_DISPATCH。

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的獨立實作支援下列方法:

IPropertyStorage::ReadMultiple

讀取rgpspec陣列中指定的屬性,並提供PROPVARIANT元素之 rgvar陣列中所有有效屬性值。

在系統提供的獨立實作中,參考資料流或儲存體類型的重複屬性識別碼會導致多次呼叫 IStorage::OpenStreamIStorage::OpenStorage,ReadMultiple 的成功或失敗取決於基礎儲存體實作共用開啟儲存體的能力。

此外,為了確保透過相同的 IPropertyStorage 指標多次要求相同資料流程或儲存值屬性時,開啟將會成功或失敗,取決於屬性是否已開啟,以及基礎檔案系統是否處理資料流程或儲存體的多個開啟。 因此,資料流程或儲存體值屬性上的ReadMultiple作業一律會導致呼叫 IStorage::OpenStream 或 IStorage::OpenStorage,傳遞存取 (STGM_READWRITE,例如) 和共用值 (STGM_SHARE_EXCLUSIVE,例如,在屬性集最初開啟或建立時指定的) 。

如果方法失敗,則寫入 rgvar[] 的值是未定義的。 如果成功開啟某些資料流程或儲存值屬性,但在執行完成之前發生錯誤,則應該在方法傳回之前釋放這些屬性。

IPropertyStorage::WriteMultiple

寫入 rgpspec[] 陣列中指定的屬性,並指派 PROPVARIANT 標記和 rgvar[] 中指定的值。 已存在的屬性會指派指定的 PROPVARIANT 值,並建立目前不存在的屬性。

IPropertyStorage::D eleteMultiple

刪除 rgpspec[] 中指定的屬性。

IPropertyStorage::ReadPropertyNames

讀取與 rgpropid[] 陣列中指定的屬性識別碼相關聯的現有字串名稱。

IPropertyStorage::WritePropertyNames

rglpwstrName 陣列中指定的字串名稱指派給 rgpropid 陣列中指定的屬性識別碼。

IPropertyStorage::D eletePropertyNames

Null寫入屬性名稱,以刪除rgpropid陣列中指定的屬性識別碼字串名稱。

IPropertyStorage::SetClass

設定屬性集資料流程的 CLSID 。 在獨立實作中,在非簡單屬性集上設定 CLSID (可包含儲存體或資料流程值屬性的屬性,如 IPropertySetStorage::Create) 也會在基礎子儲存體上設定 CLSID,以便透過 呼叫 IStorage::Stat取得它。

IPropertyStorage::Commit

針對簡單和非簡單屬性集,將記憶體映射排清到磁片子系統。 此外,對於非簡單交易模式屬性集,這個方法會在屬性集上呼叫 IStorage::Commit

IPropertyStorage::Revert

若為僅限非簡單屬性集,請呼叫基礎儲存體的 Revert 方法,並重新開啟 'contents' 資料流程。 對於簡單屬性集,只會傳回E_OK。

IPropertyStorage::Enum

建立可實作 IEnumSTATPROPSTG的列舉值物件,其方法可呼叫以列舉 STATPROPSTG 結構,以提供集合中每個屬性的相關資訊。

此實作會建立陣列,此陣列會讀取整個屬性集,並在呼叫 IEnumSTATPROPSTG::Clone 時共用此陣列。

IPropertyStorage::Stat

填入 STATPROPSETSTG 結構的成員,其中包含整體屬性集的相關資訊。 傳回時,提供 結構的指標。

對於非簡單儲存體集,此實作會呼叫 IStorage::Stat (或 IStream::Stat) ,以從基礎儲存體或資料流程取得資訊。

IPropertyStorage::SetTimes

若為僅限非簡單屬性集,請設定基礎儲存體所支援的時間。 這個 SetTimes 實作會呼叫基礎儲存體的 IStorage::SetElementTimes 方法來修改時間。 它支援基礎方法所支援的時間,可以是修改時間、存取時間或建立時間。

IPropertySetStorage-獨立實作

IPropertyStorage

IStorage::SetElementTimes

StgOpenPropStg

StgCreatePropStg

StgCreatePropSetStg