IPropertyStorage-Compound檔案實作

結構化儲存體架構的 COM 實作稱為 複合檔案。 複合檔案中實作的儲存體物件包括 IPropertyStorage、管理單一永續性屬性集的介面,以及 IPropertySetStorage,這是管理永續性屬性集群組的介面。 如需 IPropertyStorage 介面的詳細資訊,請參閱 IPropertyStorage屬性儲存體考慮

若要取得 IPropertyStorage複合檔案實作的指標,請呼叫 StgCreateStorageEx 來建立新的複合檔案物件或 StgOpenStorageEx 以開啟先前建立的複合檔案物件。 在 StgCreateStorageEx的情況下, stgfmt 參數應該設定為 STGFMT_STORAGE。 在 StgOpenStorageEx的情況下, stgfmt 參數應該設定為 STGFMT_STORAGE 或 STGFMT_ANY。 在這兩種情況下, riid 參數應該設定為 IID_IPropertySetStorage。 這兩個函式都會提供物件 IPropertySetStorage 介面的指標。 藉由呼叫該介面的 CreateOpen 方法,您將取得 IPropertyStorage 介面的指標,您可以使用這個介面來呼叫任何方法。

取得IPropertySetStorage複合檔案實作指標的替代方式,就是呼叫較舊的StgCreateDocfileStgOpenStorage函式,或指定stgCreateStorageEx 或StgOpenStorageEx函式IID_IStorage的riid參數。 不論是哪一種情況,會傳回物件的 IStorage 介面指標。 使用持續性屬性集,針對IPropertySetStorage介面呼叫QueryInterface,並指定介面識別碼的標頭定義名稱 (IID) IID_IPropertySetStorage。

使用時機

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

注意

如果您在簡單模式屬性集儲存區上呼叫StgCreateDocfileStgCreateStorageEx、StgOpenStorageStgOpenStorageEx來取得IPropertyStorage的指標,IPropertyStorage方法會遵守簡單模式資料流程的規則。 如果針對使用 STGM_SIMPLE 旗標建立或開啟的檔案,則屬性集儲存區是簡單模式。 在此情況下,不一定可以讓基礎資料流程變大,而且無法以較大的屬性取代現有的屬性。 如需詳細資訊,請參閱 IPropertySetStorage-Compound File 實作

 

IPropertyStorage 和快取

IPropertyStorage的複合檔案實作會快取記憶體中開啟的屬性集,以改善效能。 因此,除非呼叫 CommitRelease (最後一個參考) 方法,否則不會將屬性集的變更寫入複合檔案。

簡單模式屬性集

如果從簡單模式屬性集儲存物件建立屬性儲存物件,則屬性儲存物件會處於簡單模式。 例如,如果屬性集儲存物件是從 StgOpenStorageEx 函式取得,而 grfMode 參數中設定的STGM_SIMPLE旗標,則會處於簡單模式。 請注意,「簡單模式」與「簡單屬性集」無關。 如果屬性集是藉由呼叫 IPropertySetStorage::Create 來建立屬性集,並在 grfFlags 參數中設定PROPSETFLAG_NONSIMPLE旗標,則屬性集很簡單。 如需簡單和非簡單屬性集的詳細資訊,請參閱 屬性集的儲存和資料流程物件

建立簡單模式屬性儲存物件時,其使用沒有任何限制。 開啟現有的簡單模式屬性儲存物件時,無法成長儲存屬性集的基礎資料流程物件。 因此,如果變更需要較大的資料流程,則不一定可以修改這類屬性儲存物件。

屬性集格式

IPropertyStorage的複合檔案實作同時支援第 0 版和第 1 版屬性集序列化格式。 Windows 2000 上執行的電腦支援第 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 陣列中指定的屬性,並提供 PROPVULT 之 rgvar 陣列中所有有效屬性值。 在 COM 複合檔案實作中,參考資料流或儲存體類型的重複屬性識別碼會導致多次呼叫IStorage::OpenStreamIStorage::OpenStorage,而 ReadMultiple的成功或失敗取決於基礎儲存體實作共用開啟作業的能力。 因為在複合檔案中強制STGM_SHARE_EXCLUSIVE,所以多個開啟嘗試將會失敗。 不支援從同一個父儲存體多次開啟相同的儲存物件。 必須指定STGM_SHARE_EXCLUSIVE旗標。

此外,為了確保在 COM 複合檔案實作中透過相同 IPropertyStorage 指標要求相同資料流程或儲存值屬性時,開啟作業會成功或失敗,取決於屬性是否已開啟,以及基礎檔案系統是否處理資料流程或儲存體的多個開啟。 因此,資料流程或儲存體值屬性上的 ReadMultiple 作業一律會產生 IStorage::OpenStreamIStorage::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

刪除 rgpropid[] 陣列中所指定屬性的屬性名稱。

IPropertyStorage::SetClass

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

IPropertyStorage::Commit

針對簡單和非簡單屬性集,將屬性集記憶體映射排清到基礎儲存體。 此外,對於非簡單交易模式屬性集,這個方法會在包含屬性集的儲存體上執行認可 (,如同 IStorage::Commit) 。

IPropertyStorage::Revert

若為僅限非簡單屬性集,請呼叫基礎儲存體的 Revert 方法,並重新開啟 'contents' 資料流程。 對於簡單屬性集,此介面一律會傳回S_OK。 非simple 屬性集是使用 IPropertySetStorage::Create 方法中的 PROPSETFLAG_NONSIMPLE 旗標所建立的屬性集。 如需詳細資訊,請參閱 屬性集 的儲存和資料流程物件

IPropertyStorage::Enum

建構 IEnumSTATPROPSTG的實例,您可以呼叫其方法來列舉 STATPROPSTG 結構,以提供集合中每個屬性的相關資訊。 此實作會建立陣列,此陣列會讀取整個屬性集,並在呼叫 IEnumSTATPROPSTG::Clone 時共用此陣列。 屬性集的變更不會反映在開啟的 IEnumSTATPROPSTG 實例中。 若要查看這類變更,必須建構這個列舉值的新實例。

IPropertyStorage::Stat

填入 STATPROPSETSTG 結構的成員,其中包含整個屬性集的相關資料。 傳回時,提供 結構的指標。 對於非簡單儲存集,此實作會呼叫 IStorage::Stat (或 IStream::Stat) ,以從基礎儲存體或資料流程取得時間。 針對簡單的儲存集,不會維護任何時間。

IPropertyStorage::SetTimes

若為僅限非簡單屬性集,請設定基礎儲存體所支援的時間。 複合檔案儲存實作支援這三項:修改、存取和建立。 這個 SetTimes 實作會呼叫基礎儲存體的 IStorage::SetElementTimes 方法來擷取這些時間。

IPropertyStorage

IStorage::SetElementTimes