IStorage 的複合檔案實作可讓您在位於複合檔物件的儲存物件內建立和管理子記憶體和數據流。 若要建立複合檔案物件並取得 IStorage 指標,請呼叫 API 函式 StgCreateStorageEx。 若要開啟現有的複合檔物件,並取得其根 IStorage 指標,請呼叫 StgOpenStorageEx。
使用複合記憶體的應用程式應該在 HKEY_CLASSES_ROOT\SystemFileAssociations 中註冊,並且應該提供自己的屬性處理程式。 如需詳細資訊,請參閱 應用程式註冊的一節。
使用時機
大部分的應用程式都會使用此實作來建立和管理記憶體和數據流。
方法
-
建立並開啟數據流物件,其中包含此記憶體物件中包含的指定名稱。 名稱長度不得超過 31 個字元(不包括字串終止符)。 OLE 會保留 000 到 01f 字元,做為數據流/記憶體名稱的第一個字元。 這是複合檔案限制,而不是結構化儲存限制。 IStorage::CreateStream 方法的 COM 提供的複合檔案實作不支援下列行為:
- 不支援STGM_DELETEONRELEASE旗標。
- 數據流物件不支援交易模式(STGM_TRANSACTED)。
- 不支援從相同記憶體多次開啟相同的數據流。 STGM_SHARE_EXCLUSIVE共用模式旗標必須在 grfMode 參數中指定。
-
使用 grfMode 參數中指定的存取模式,開啟此儲存物件中的現有數據流物件。 OLE 會保留 000 到 01f 字元,做為數據流/記憶體名稱的第一個字元。 這是複合檔案限制,而不是結構化儲存限制。 IStorage::OpenStream 方法的 COM 提供的複合檔案實作不支援下列行為:
- STGM_DELETEONRELEASE旗標。
- 數據流物件的交易模式(STGM_TRANSACTED)。
- 從相同的記憶體多次開啟相同的數據流。 必須指定STGM_SHARE_EXCLUSIVE旗標。
-
在指定的存取模式中,建立並開啟具有指定名稱的新儲存物件。 名稱長度不得超過 31 個字元(不包括字串終止符)。 OLE 會保留 000 到 01f 字元,做為數據流/記憶體名稱的第一個字元。 這是複合檔案限制,而不是結構化儲存限制。 IStorage::CreateStorage 方法的 COM 提供的複合檔案實作不支援下列行為:
- 非根記憶體的STGM_PRIORITY旗標。
- 從相同的父記憶體多次開啟相同的儲存物件。 必須指定STGM_SHARE_EXCLUSIVE旗標。
- STGM_DELETEONRELEASE旗標。 如果指定此旗標,函式會傳回STG_E_INVALIDFLAG。
-
在指定的存取模式中,開啟具有指定名稱的現有記憶體物件。 OLE 會保留 000 到 01f 字元,做為數據流/記憶體名稱的第一個字元。 這是複合檔案限制,而不是結構化儲存限制。 IStorage::OpenStorage 方法的 COM 提供的複合檔案實作不支援下列行為:
- 非根記憶體的STGM_PRIORITY旗標。
- 從相同的父記憶體多次開啟相同的儲存物件。 必須指定STGM_SHARE_EXCLUSIVE旗標。
- STGM_DELETEONRELEASE旗標。 如果指定此旗標,函式會傳回STG_E_INVALIDFUNCTION。
-
只會將這個開啟儲存物件的子記憶體和數據流複製到另一個記憶體物件。 rgiidExclude 參數可以設定為 IID_IStream 只複製子記憶體,或設定為只複製數據流IID_IStorage。
-
將子記憶體或數據流從這個記憶體物件複製到另一個記憶體物件或數據流。
-
確保對以交易模式開啟之記憶體物件所做的任何變更都反映在父記憶體中;針對根記憶體,反映實際裝置中的變更;例如,磁碟上的檔案。 對於以直接模式開啟的根記憶體對象,這個方法除了將所有記憶體緩衝區排清到磁碟之外,沒有作用。 對於直接模式中的非根記憶體對象,這個方法沒有任何作用。
除非在 grfCommitFlags 參數中指定STGC_OVERWRITE,否則 COM 提供的複合文件實作會使用兩階段認可程式。 此雙階段程式可確保數據健全性,以防認可作業失敗。 首先,所有新數據都會寫入基礎檔案中的未使用空間。 如有必要,會將新的空間配置給檔案。 完成此步驟之後,檔案中的數據表會使用單一扇區寫入作業來更新,以指出要用來取代舊數據的新數據。 舊數據會變成在下一個認可作業中使用的可用空間。 因此,舊數據可供使用,而且如果認可變更時發生錯誤,則可以還原。 如果指定了STGC_OVERWRITE,則會使用單一階段認可作業。 如需交易模式旗標的詳細資訊,請參閱 STGC 列舉。
-
捨棄自上次認可作業之後對記憶體物件所做的所有變更。
-
建立及擷取列舉值物件的指標,這個指標可用來列舉此儲存物件中包含的儲存和串流物件。 COM 提供的複合檔案實作會擷取該資訊的快照集。 因此,在取得新的列舉值之前,數據流和記憶體的變更不會反映在列舉值中。
-
從這個儲存物件中移除指定的專案(子記憶體或數據流)。
-
重新命名這個記憶體物件中指定的子記憶體或數據流。 OLE 會保留 000 到 01f 字元,做為數據流/記憶體名稱的第一個字元。 這是複合檔案限制,而不是結構化儲存限制。
-
設定指定之儲存專案的修改、存取和建立時間。 COM 提供的複合文件實作會維護內部儲存物件的修改和變更時間。 根記憶體物件支援基礎文件系統支援的任何專案(或由 ILockBytes支援的任何專案)。 複合檔案實作不會維護內部數據流的任何時間戳。 不支持的時間戳會回報為零,這可讓呼叫端測試支援。
-
將指定的 CLSID 指派給這個記憶體物件。
-
在此記憶體物件中儲存最多 32 位的狀態資訊。 這個方法所設定的狀態僅供外部使用。 COM 提供的複合檔案實作不會根據狀態執行任何動作。
-
擷取這個開啟儲存物件的 STATSTG 結構。
言論
如果記憶體物件是以簡單模式開啟,則會限制使用上述方法。 如果記憶體是以 StgCreateStorageEx 或 StgOpenStorageEx 函式的 grfMode 參數所指定的STGM_SIMPLE項目開啟,則記憶體處於簡單模式。 如需簡單模式記憶體的詳細資訊,請參閱 STGM 常數。 如果從 StgCreateStorageEx 函式取得簡單模式儲存物件,則可以呼叫 CreateStream 方法,但無法呼叫 openStream方法。 如果從 StgOpenStorageEx 函式取得簡單模式儲存物件,則可以呼叫 OpenStream 方法,但無法呼叫 createStream 方法。
使用簡單模式儲存物件來建立數據流時,該數據流的大小下限通常是 4096 個字節。 如果寫入數據流的數據較少,大小會四捨五入為 4096 個字節。
相關主題