IStream - 複合檔案實作
IStream 介面支援讀取和寫入數據至數據流物件。 在結構化儲存物件中,數據流物件包含資料和記憶體提供結構。 簡單的數據可以直接寫入數據流,但更頻繁的是,數據流是儲存物件內巢狀的元素。 它們類似於標準檔案。
IStream 的規格會定義比 COM 實作支援的更多功能。 例如, IStream 介面會定義長度最多 2⁶⁴ 個字節,需要 64 位搜尋指標。 不過,COM 實作只支援長度上限為2個2Kb個字節的數據流(4 GB),而讀取和寫入作業一次一律限製為2個2個Mb。 COM 實作也不支援串流交易或區域鎖定。
若要根據全域記憶體建立簡單的數據流,請呼叫 API 函式 CreateStreamOnHGlobal 來取得 IStream 指標。 若要取得複合檔案物件內的 IStream 指標,請呼叫 StgCreateDocfile 或 StgOpenStorage。 這些函式會擷取 IStorage 指標,然後您可以針對 IStream 指標呼叫 CreateStream 或 OpenStream。 不論是哪一種情況,都 使用相同的 IStream 實作程序代碼。
使用時機
呼叫 IStream 的方法,以讀取和寫入數據流中的數據。
因為數據流物件可以封送處理至其他進程,因此應用程式可以在記憶體對象中共用數據,而不需要使用全域記憶體。 在數據流物件的 COM 複合檔案實作中,COM 中的自定義封送處理設施會在兩個進程具有共用記憶體存取權時,於新進程中建立原始物件的遠端版本。 因此,遠端版本不需要與原始程序通訊,才能執行其功能。
數據流對象的遠端版本會與原始數據流共用相同的搜尋指標。 如果您不想共用搜尋指標,請使用 IStream::Clone 方法來提供遠端進程的數據流物件複本。
注意
如果建立大於計算機記憶體中堆積的數據流物件,而且您使用的是 全域記憶體物件的 HGLOBAL 句柄,則數據流物件會在需要更多記憶體時於內部呼叫 GlobalRealloc 方法。 因為 GlobalRealloc 一律會將來源的數據複製到目的地,因此將數據流物件從 20 MB 增加到 25 MB,例如需要大量的時間。 這是因為複製的增量大小,而且因為磁碟交換而在計算機上記憶體不足 45 MB,就會惡化。
慣用的解決方案是實作 IStream 方法,該方法會使用 VirtualAlloc 配置的記憶體,而不是 GlobalAlloc。 這可以保留大量的虛擬位址空間,然後視需要認可該位址空間內的記憶體。 不會發生任何數據複製,而且只會視需要認可記憶體。
GlobalRealloc 的替代方法是在數據流物件上呼叫 IStream::SetSize 方法,以事先增加記憶體配置。 不過,這不像使用 VirtualAlloc 一樣有效率,如上所述。
方法
-
從數據流物件讀取指定的位元組數目,從目前搜尋指標開始的記憶體中。 如果讀取期間到達數據流結尾,這個實作會傳回S_OK。 (這與 MS-DOS FAT 檔案系統中找到的「檔尾」行為相同。
-
從位元組寫入資料流物件中的指定數位,從目前的搜尋指標開始。 在此實作中,數據流對象並非疏鬆。 任何填滿位元組最終會配置在磁碟上,並指派給數據流。
-
將搜尋指標變更為相對於數據流開頭、數據流結尾或目前搜尋指標的新位置。
-
變更數據流物件的大小。 在此實作中,不保證配置的空間會連續。
-
將數據流中目前搜尋指標的指定位元元組數目複製到另一個數據流中的目前搜尋指標。
-
IStream 的複合檔案實作僅支援在直接模式中開啟數據流,而不是交易模式。 因此,呼叫 方法時不會有任何作用,除了將所有記憶體緩衝區排清到下一個儲存層級之外。
在此實作中,將變更認可至數據流並不重要,您只需要認可儲存對象的變更。
-
此實作不支援交易數據流,因此對此方法的呼叫沒有作用。
-
此實作不支援範圍鎖定,因此對此方法的呼叫沒有作用。
-
拿掉先前使用 IStream::LockRegion 限制的位元組範圍存取限制。
-
擷取此數據流的 STATSTG 結構
-
使用自己的搜尋指標建立新的數據流物件,以參考與原始數據流相同的位元組。
簡單模式 IStream 受限於下列條件約束。
- 如果串流是從簡單模式儲存區建立或開啟,則為簡單模式。 如果記憶體是以 grfMode 參數中設定的STGM_SIMPLE旗標來建立或開啟,則記憶體是簡單的模式。
- 不支援 Clone 和 CopyTo 方法。
- 支援 Stat 方法,但必須指定STATFLAG_NONAME值。
相關主題