共用方式為


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 函式, 或 指定 IID_IStorage IID_IStorage StgCreateStorageExStgOpenStorageEx 函式的 riid 参数。 在這兩種情況下,會傳回物件 IStorage 介面的指標。 使用永續性屬性集,針對 IPropertySetStorage 介面呼叫 QueryInterface,並指定介面標識符 (IID) IID_IPropertySetStorage的標頭定義名稱。

使用時機

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

注意

如果您 藉由在簡單模式屬性集記憶體上呼叫 StgCreateDocfileStgCreateStorageExStgOpenStorageStgOpenStorageEx 來取得 IPropertyStorage 指標, IPropertyStorage 方法會遵循簡單模式數據流的規則。 如果針對使用 STGM_SIMPLE 旗標建立或開啟的檔案取得屬性集記憶體,則為簡單模式。 在此情況下,不一定能讓基礎數據流變大,而且無法以較大的屬性取代現有的屬性。 如需詳細資訊,請參閱 IPropertySetStorage-Compound 檔案實作

 

IPropertyStorage 和快取

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

簡單模式屬性集

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

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

屬性集格式

IPropertyStorage 的複合檔案實作同時支援版本 0 和第 1 版屬性集串行化格式。 Windows 2000 上執行的電腦支援版本 1 格式。 如需詳細資訊,請參閱 屬性集串行化。 屬性集會以版本 0 格式建立,除非要求新功能,否則會維持該格式。 發生這種情況時,格式會更新為第 1 版。

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

IPropertyStorage 和 Variant 類型

IPropertyStorage 的複合檔案實作不支援 PROPVARIANT 結構之 vt 成員中的變體類型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 陣列中所有有效屬性值。 在 COM 複合檔案實作中,參考數據流或儲存類型的重複屬性標識碼會導致多次呼叫 IStorage::OpenStreamIStorage::OpenStorageReadMultiple 的成功或失敗取決於基礎記憶體實作共用開啟作業的能力。 因為複合檔案STGM_SHARE_EXCLUSIVE強制,因此多個開啟嘗試將會失敗。 不支援從相同父記憶體多次開啟相同的儲存物件。 必須指定STGM_SHARE_EXCLUSIVE旗標。

此外,若要確保線程安全作業,如果相同的數據流或記憶體值屬性是透過相同 IPropertyStorage COM 複合檔實作中的指標要求數次,開啟作業將會成功或失敗,視屬性是否已開啟,以及基礎文件系統是否處理數據流或記憶體的多個開啟。 因此,數據流或記憶體值屬性上的 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

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

IPropertyStorage::SetClass

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

IPropertyStorage::Commit

針對簡單和非簡單屬性集,請將屬性集記憶體映像排清到基礎記憶體。 此外,對於非簡單交易模式屬性集,此方法會在包含屬性集的記憶體上執行認可(如 IStorage::Commit中所示。

IPropertyStorage::Revert

若為非simple 屬性集,請呼叫基礎記憶體的 Revert 方法,並重新開啟「內容」數據流。 對於簡單屬性集,這個介面一律會傳回S_OK。 非simple 屬性集是 PROPSETFLAG_NONSIMPLE使用 IPropertySetStorage::Create方法旗標所建立的屬性集。 如需詳細資訊,請參閱 屬性集 的儲存和數據流物件。

IPropertyStorage::Enum

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

IPropertyStorage::Stat

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

IPropertyStorage::SetTimes

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

IPropertyStorage

IStorage::SetElementTimes