COM(元件物件模型)的結構化存儲機制,又稱永久存儲,是軟體儲存技術的一大突破。它在檔案系統之上建立了一個樹狀的層次結構,讓多個元件程式能夠共享同一個檔案,就像多個應用程式共享磁碟檔案系統一樣。COM 定義了結構化存儲的規範(介面與規則),並提供了預設實現——複合文件技術,這也是 OLE(物件連結與嵌入)的基礎儲存技術。
元件化設計將應用系統拆分為多個獨立元件,這些元件之間需要共享存取同一個檔案。傳統檔案控制碼難以實現多元件共享存取,結構化存儲「借用」檔案系統概念,在檔案內部構建類似檔案系統的樹狀結構,完美解決此問題。樹狀結構的節點分為兩種物件:儲存物件(類似目錄,容納子物件)與流物件(類似檔案,進行實際資料讀寫)。每個元件只操作自己擁有的節點,但在整體上實現了對同一檔案的共享存取。
作業系統引入檔案系統,隔離應用程式與底層儲存裝置,提供抽象的流式儲存結構,讓多應用程式共享儲存裝置且互不干擾。結構化存儲在邏輯上模仿此架構,但在單一檔案內部實現,由 COM 程式庫提供介面與 API,應用程式無需自行實現儲存/流物件,正如無需實現檔案控制碼或目錄物件。
IStream 介面操作。IStorage 介面操作。這些物件可跨進程共享,即使程式運行在不同進程中也能協同工作。
Commit() 才生效,呼叫 Revert() 可回滾至上次提交或開啟時狀態。事務特性可在樹狀結構所有層級嵌套使用,但消耗較多系統資源。根儲存物件名稱即複合文件檔名,遵循檔案系統命名慣例;非根物件由父物件管理,遵循 COM 命名約定。
增量存取減少儲存/開啟大型複合文件的時間與記憶體需求。但頻繁修改會導致檔案體積持續增長(刪除物件僅標記空間為「未用」而不釋放)。解決方案:建立新複合文件,呼叫根儲存物件的 CopyTo() 複製樹狀結構,新檔案將無碎片空間。Microsoft Access、Word 文件常出現此情況。
複合文件透過 LockBytes 物件將根儲存與底層儲存媒介(磁碟檔案、記憶體、自訂虛擬空間)連結。LockBytes 是所有儲存媒介的抽象表達,將其視為一般化位元組序列。COM 提供基於檔案控制碼與記憶體的預設 LockBytes 實現,也允許開發者自訂 LockBytes。
StgCreateDocfile、StgCreateDocfileOnLockBytesStgOpenStorage、StgOpenStorageOnLockBytesCreateILockBytesOnHGlobal、GetHGlobalFromILockBytes、CreateStreamOnHGlobal、GetHGlobalFromStreamStgIsStorageFile、StgSetTimes透過 LockBytes 隔離根儲存與檔案操作,事務模式開啟時 COM 使用三個檔案控制碼:複合文件、暫存檔(記錄修改)、預分配檔(零記憶體儲存時用)。
儲存物件可透過 IStorage::SetClass 設定 CLSID,將儲存物件與可執行程式碼關聯。客戶程式利用 CLSID 呼叫 CoCreateInstance 建立 COM 物件(永久物件),再將儲存物件交由其處理。永久物件通常實現 IPersistFile、IPersistStorage、IPersistStream、IPersistStreamInit 等介面。COM 提供 WriteClassStg/ReadClassStg、WriteClassStm/ReadClassStm、GetClassFile 等 API 簡化 CLSID 操作。Windows 桌面環境利用 GetClassFile 實現資料驅動機制;非複合文件則透過副檔名關聯 ProGID/CLSID 或檔案匹配規則關聯。
結構化存儲是 COM 規範描述的理想儲存機制,複合文件是其在 Windows 平台的實現,利用作業系統特性擴展新功能,同時受限於平台限制。它是目前 Windows 平台的基礎儲存機制,廣泛應用於 OLE、文件儲存、元件間資料共享等場景。