首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

COM 結構化存儲:原理、實現與應用全解析

     編輯:關於C++

什麼是結構化存儲?

COM(元件物件模型)的結構化存儲機制,又稱永久存儲,是軟體儲存技術的一大突破。它在檔案系統之上建立了一個樹狀的層次結構,讓多個元件程式能夠共享同一個檔案,就像多個應用程式共享磁碟檔案系統一樣。COM 定義了結構化存儲的規範(介面與規則),並提供了預設實現——複合文件技術,這也是 OLE(物件連結與嵌入)的基礎儲存技術。

為什麼需要結構化存儲?

元件化設計將應用系統拆分為多個獨立元件,這些元件之間需要共享存取同一個檔案。傳統檔案控制碼難以實現多元件共享存取,結構化存儲「借用」檔案系統概念,在檔案內部構建類似檔案系統的樹狀結構,完美解決此問題。樹狀結構的節點分為兩種物件:儲存物件(類似目錄,容納子物件)與流物件(類似檔案,進行實際資料讀寫)。每個元件只操作自己擁有的節點,但在整體上實現了對同一檔案的共享存取。

檔案系統與結構化存儲的對比

作業系統引入檔案系統,隔離應用程式與底層儲存裝置,提供抽象的流式儲存結構,讓多應用程式共享儲存裝置且互不干擾。結構化存儲在邏輯上模仿此架構,但在單一檔案內部實現,由 COM 程式庫提供介面與 API,應用程式無需自行實現儲存/流物件,正如無需實現檔案控制碼或目錄物件。

核心物件:儲存物件與流物件

  • 流物件:類比獨立磁碟檔案,是資料讀寫的基本單位,支援各類資料類型,擁有獨立存取權限與搜尋指標,透過 IStream 介面操作。
  • 儲存物件:類比目錄,本身不存儲資料,作為子儲存物件與子流物件的容器,記錄子物件資訊,透過 IStorage 介面操作。

這些物件可跨進程共享,即使程式運行在不同進程中也能協同工作。

關鍵特性

存取模式:直接 vs 事務

  • 直接模式:修改立即生效。
  • 事務模式:修改先緩存,呼叫 Commit() 才生效,呼叫 Revert() 可回滾至上次提交或開啟時狀態。事務特性可在樹狀結構所有層級嵌套使用,但消耗較多系統資源。

命名規則

根儲存物件名稱即複合文件檔名,遵循檔案系統命名慣例;非根物件由父物件管理,遵循 COM 命名約定。

增量存取與空間回收

增量存取減少儲存/開啟大型複合文件的時間與記憶體需求。但頻繁修改會導致檔案體積持續增長(刪除物件僅標記空間為「未用」而不釋放)。解決方案:建立新複合文件,呼叫根儲存物件的 CopyTo() 複製樹狀結構,新檔案將無碎片空間。Microsoft Access、Word 文件常出現此情況。

實現核心:複合文件與 LockBytes

複合文件透過 LockBytes 物件將根儲存與底層儲存媒介(磁碟檔案、記憶體、自訂虛擬空間)連結。LockBytes 是所有儲存媒介的抽象表達,將其視為一般化位元組序列。COM 提供基於檔案控制碼與記憶體的預設 LockBytes 實現,也允許開發者自訂 LockBytes。

常用 API 函數

  • 建立:StgCreateDocfile、StgCreateDocfileOnLockBytes
  • 開啟:StgOpenStorage、StgOpenStorageOnLockBytes
  • 記憶體基礎:CreateILockBytesOnHGlobal、GetHGlobalFromILockBytes、CreateStreamOnHGlobal、GetHGlobalFromStream
  • 其他:StgIsStorageFile、StgSetTimes

零記憶體儲存與 IRootStorage

透過 LockBytes 隔離根儲存與檔案操作,事務模式開啟時 COM 使用三個檔案控制碼:複合文件、暫存檔(記錄修改)、預分配檔(零記憶體儲存時用)。

CLSID 與永久介面

儲存物件可透過 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、文件儲存、元件間資料共享等場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved