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

COM 元件設計與應用(一):起源與複合文件 (Compound File) 深度解析

     編輯:關於C語言

COM 技術源於 Microsoft 解決「Word 文件嵌入 Excel 試算表」的儲存難題。將磁碟檔案系統結構 (目錄/檔案) 移植到單一檔案內部,誕生了複合文件 (Compound File)——「檔案中的檔案系統」。本文詳細解析複合文件結構特性、儲存體/串流介面、Win32 API 操作函數,為理解 COM 物件儲存與啟動機制奠基。

歷史背景:為何需要複合文件

Word (.doc) 與 Excel (.xls) 各有專屬儲存格式。欲在 Word 文件內嵌入 Excel 物件,有兩種方案:

方案優點缺點
子目錄存放 .doc + .xls資料隔離、易擴充結構鬆散、易遺失、難攜帶
擴展 .doc 格式容納 .xls單一檔案、易管理Word 需懂 Excel 格式、無擴充性

Microsoft 提出第三種方案:複合文件,模擬磁碟檔案系統——儲存體對應目錄,串流對應檔案。

複合文件結構特性

  1. 樹狀結構:單向指標管理,向後定位 (深度優先) 快於向前
  2. 串流儲存單位 512 位元組:即使 1 位元組資料也佔 512 位元組 (類比磁碟叢集)
  3. 多執行緒/進程並存存取:不同部分可同時讀寫互不干擾
  4. 增量存取:插入/刪除資料無須重寫整個檔案
  5. 碎片整理:頻繁操作產生碎片,呼叫 `IStorage::CopyTo` 可整理釋放空間

核心介面與函數對照表

Win32 API 全域函數

函數功能
`StgCreateDocfile`建立複合文件,取得根儲存體 `IStorage*`
`StgOpenStorage`開啟現有複合文件,取得根儲存體
`StgIsStorageFile`判斷檔案是否為複合文件

IStorage 介面 (儲存體/目錄)

方法功能
`CreateStorage`建立子儲存體
`CreateStream`建立串流
`OpenStorage` / `OpenStream`開啟現有子儲存體/串流
`CopyTo`複製所有物件至目標儲存體 (可整理碎片)
`MoveElementTo`移動物件至目標儲存體
`DestroyElement`刪除物件
`RenameElement`重新命名
`EnumElements`枚舉所有子物件
`SetElementTimes`修改建立/修改/存取時間
`SetClass` / `SetStateBits` / `Stat`設定類別 ID、狀態位、取得統計資訊

IStream 介面 (串流/檔案)

方法功能
`Read` / `Write`讀寫資料
`Seek`移動指標 (支援 64 位元位移)
`SetSize`設定串流大小
`CopyTo`複製至另一串流
`Commit` / `Revert`交易式提交/回滾 (需 `STGM_TRANSACTED`)
`LockRegion` / `UnlockRegion`區域鎖定
`Stat`取得統計資訊 (大小、時間、型別)
`Clone`建立相同存取權的新串流指標

工具:複合文件瀏覽器

  • VC6.0 附帶 `DFView.exe` (Common\Tools\),可視覺化瀏覽儲存體/串流樹狀結構
  • VS.NET 2003 後移除,建議自行開發瀏覽器練習 `IStorage`/`IStream` API

與 COM 的關聯

  • COM 物件持久化介面 `IPersistStorage` / `IPersistStream` 直接操作 `IStorage`/`IStream`
  • OLE 複合文件 (`.doc`、`.xls`、`.ppt`) 即為複合文件容器
  • 結構化儲存技術是 COM 物件嵌入、連結、拖放、剪貼簿的基礎設施

下集預告

下一篇將深入 `IUnknown` 介面、`QueryInterface`/`AddRef`/`Release` 參考計數機制、類別工廠 (`IClassFactory`)、註冊表機制與 `CoCreateInstance` 物件建立全流程。

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