共用方式為


IPropertyStorage-獨立實作

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

若要取得獨立實作 IPropertyStorage的指標,請呼叫 StgCreatePropStg 函式來建立新的屬性集或 StgOpenPropStg 取得現有屬性集上的介面指標(或呼叫 CreateOpen 方法 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 的獨立實作支援下列方法:

IPropertyStorage::ReadMultiple

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

在系統提供的獨立實作中,參考數據流或儲存類型的重複屬性標識碼會導致多次呼叫 IStorage::OpenStreamIStorage::OpenStorage::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 NULL 寫入屬性名稱,以刪除在 rgpropid 陣列中指定的屬性識別符字串名稱。

IPropertyStorage::SetClass

設定屬性集數據流 CLSID。 在獨立實作中,在非simple 屬性集上設定 CLSID(可以包含記憶體或數據流值屬性的集合,如 IPropertySetStorage::Create中所述)也會在基礎子記憶體上設定 CLSID,以便透過呼叫 IStorage::Stat取得它。

IPropertyStorage::Commit

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

IPropertyStorage::Revert

若為非simple 屬性集,請呼叫基礎記憶體的 Revert 方法,並重新開啟「內容」數據流。 針對簡單屬性集,只會傳回E_OK。

IPropertyStorage::Enum

建立列舉值對象,這個物件會實作 IEnumSTATPROPSTG,其方法可以呼叫來列舉 STATPROPSTG 結構,以提供集合中每個屬性的相關信息。

這個實作會建立一個陣列,其中會讀取整個屬性集,並在呼叫 IEnumSTATPROPSTG::Clone時共用該數位。

IPropertyStorage::Stat

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

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

IPropertyStorage::SetTimes

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

IPropertySetStorage-獨立實作

IPropertyStorage

IStorage::SetElementTimes

StgOpenPropStg

StgCreatePropStg

StgCreatePropSetStg