COM 技術源於 Microsoft 解決「Word 文件嵌入 Excel 試算表」的儲存難題。將磁碟檔案系統結構 (目錄/檔案) 移植到單一檔案內部,誕生了複合文件 (Compound File)——「檔案中的檔案系統」。本文詳細解析複合文件結構特性、儲存體/串流介面、Win32 API 操作函數,為理解 COM 物件儲存與啟動機制奠基。
Word (.doc) 與 Excel (.xls) 各有專屬儲存格式。欲在 Word 文件內嵌入 Excel 物件,有兩種方案:
| 方案 | 優點 | 缺點 |
|---|---|---|
| 子目錄存放 .doc + .xls | 資料隔離、易擴充 | 結構鬆散、易遺失、難攜帶 |
| 擴展 .doc 格式容納 .xls | 單一檔案、易管理 | Word 需懂 Excel 格式、無擴充性 |
Microsoft 提出第三種方案:複合文件,模擬磁碟檔案系統——儲存體對應目錄,串流對應檔案。
| 函數 | 功能 |
|---|---|
| `StgCreateDocfile` | 建立複合文件,取得根儲存體 `IStorage*` |
| `StgOpenStorage` | 開啟現有複合文件,取得根儲存體 |
| `StgIsStorageFile` | 判斷檔案是否為複合文件 |
| 方法 | 功能 |
|---|---|
| `CreateStorage` | 建立子儲存體 |
| `CreateStream` | 建立串流 |
| `OpenStorage` / `OpenStream` | 開啟現有子儲存體/串流 |
| `CopyTo` | 複製所有物件至目標儲存體 (可整理碎片) |
| `MoveElementTo` | 移動物件至目標儲存體 |
| `DestroyElement` | 刪除物件 |
| `RenameElement` | 重新命名 |
| `EnumElements` | 枚舉所有子物件 |
| `SetElementTimes` | 修改建立/修改/存取時間 |
| `SetClass` / `SetStateBits` / `Stat` | 設定類別 ID、狀態位、取得統計資訊 |
| 方法 | 功能 |
|---|---|
| `Read` / `Write` | 讀寫資料 |
| `Seek` | 移動指標 (支援 64 位元位移) |
| `SetSize` | 設定串流大小 |
| `CopyTo` | 複製至另一串流 |
| `Commit` / `Revert` | 交易式提交/回滾 (需 `STGM_TRANSACTED`) |
| `LockRegion` / `UnlockRegion` | 區域鎖定 |
| `Stat` | 取得統計資訊 (大小、時間、型別) |
| `Clone` | 建立相同存取權的新串流指標 |
下一篇將深入 `IUnknown` 介面、`QueryInterface`/`AddRef`/`Release` 參考計數機制、類別工廠 (`IClassFactory`)、註冊表機制與 `CoCreateInstance` 物件建立全流程。