IStream - 複合檔案實作

IStream介面支援讀取和寫入資料流程物件的資料。 在結構化儲存物件中,資料流程物件包含資料和儲存體提供 結構。 簡單的資料可以直接寫入資料流程,但更頻繁地,資料流程是儲存物件內巢狀的專案。 它們類似于標準檔案。

IStream的規格會定義比 COM 實作支援的更多功能。 例如, IStream 介面會定義長度上限為 2⁶⁴ 個位元組的資料流程,需要 64 位搜尋指標。 不過,COM 實作只支援長度上限為 2ーー 位元組的資料流程, (4 GB) ,而且讀取和寫入作業一次一律限制為 2 個 Http 個位元組。 COM 實作也不支援串流交易或區域鎖定。

若要根據全域記憶體建立簡單的資料流程,請呼叫 API 函式CreateStreamOnHGlobal來取得IStream指標。 若要取得複合檔案物件內的 IStream 指標,請呼叫 StgCreateDocfileStgOpenStorage。 這些函式會擷取IStorage指標,然後您可以呼叫IStream 指標的 CreateStreamOpenStream 不論是哪一種情況,都使用相同的 IStream 實作程式碼。

注意

結構化儲存體的複合檔案實作在ISequentialStreamQueryInterface方法上不成功,但它會透過IStream介面指標包含讀取寫入方法。

 

使用時機

呼叫 IStream 的方法,以讀取和寫入資料流程的資料。

由於資料流程物件可以封送處理至其他進程,因此應用程式可以在儲存體物件中共用資料,而不需要使用全域記憶體。 在資料流程物件的 COM 複合檔案實作中,COM 中的自訂封送處理設備會在兩個進程具有共用記憶體存取權時,在新進程中建立原始物件的遠端版本。 因此,遠端版本不需要與原始進程通訊,才能執行其函式。

資料流程物件的遠端版本會共用與原始資料流程相同的搜尋指標。 如果您不想共用搜尋指標,請使用 IStream::Clone 方法來提供遠端進程的資料流程物件複本。

注意

如果建立大於電腦記憶體中堆積的資料流程物件,而且您使用的是全域記憶體物件的 HGLOBAL 控制碼,則資料流程物件會在內部呼叫 GlobalRealloc 方法,這需要更多記憶體。 因為 GlobalRealloc 一律會將來源的資料複製到目的地,因此將資料流程物件從 20 MB 增加到 25 MB,例如,需要大量的時間。 這是因為複製的遞增大小,而且因為磁片交換而在電腦上記憶體少於 45 MB,就會變差。

慣用的解決方案是實作 IStream 方法,該方法會使用 VirtualAlloc 配置的記憶體,而不是 GlobalAlloc。 這可以保留大量的虛擬位址空間,然後視需要認可該位址空間內的記憶體。 不會複製任何資料,而且只會視需要認可記憶體。

GlobalRealloc的替代方法是在資料流程物件上呼叫IStream::SetSize方法,以事先增加記憶體配置。 不過,這與使用 VirtualAlloc一樣有效率,如上所述。

 

方法

ISequentialStream::Read

從資料流物件中將指定的位元組數目讀入記憶體中目前搜尋指標開始處。 如果讀取期間到達資料流程結尾,此實作會傳回S_OK。 (這與 MS-DOS FAT 檔案系統中找到的「檔案結尾」行為相同。)

ISequentialStream::Write

從位元組寫入指定的數位到從目前搜尋指標開始的資料流程物件。 在此實作中,資料流程物件不是疏鬆的。 任何填滿位元組最終會在磁片上配置,並指派給資料流程。

IStream::Seek

將搜尋指標變更為相對於資料流開頭、資料流結尾或目前搜尋指標的新位置。

IStream::SetSize

變更資料流物件的大小。 在此實作中,不保證配置的空間會連續。

IStream::CopyTo

從資料流中目前的搜尋指標將指定的位元組數目複製到另一個資料流中目前的搜尋指標。

IStream::Commit

IStream的複合檔案實作僅支援在直接模式中開啟資料流程,而不是交易模式。 因此,呼叫 方法時,除了將所有記憶體緩衝區排清到下一個儲存層級之外,方法也不會有任何作用。

在此實作中,如果您認可資料流程的變更,您只需要認可儲存體物件的變更就不重要。

IStream::Revert

此實作不支援交易資料流程,因此對此方法的呼叫沒有任何作用。

IStream::LockRegion

此實作不支援範圍鎖定,因此對此方法的呼叫沒有任何作用。

IStream::UnlockRegion

移除先前使用 IStream::LockRegion限制的位元組範圍存取限制。

IStream::Stat

擷取此資料流程的 STATSTG 結構

IStream::Clone

建立新的資料流物件,其搜尋指標會參考與原始資料流相同的位元組。

簡單模式 IStream 受限於下列條件約束。

  • 如果資料流程是從簡單模式儲存區建立或開啟,則為簡單模式。 如果儲存體是以 grfMode 參數中設定的STGM_SIMPLE旗標來建立或開啟,則儲存體是簡單的模式。
  • 不支援 CloneCopyTo 方法。
  • 支援 Stat 方法,但必須指定STATFLAG_NONAME值。

IStream

IStorage

CreateStreamOnHGlobal

StgCreateDocfile

StgOpenStorage