| 類型 | 用途 | 建立 API |
| File Moniker | 指向檔案/檔案內部物件 | CreateFileMoniker |
| Item Moniker | 容器內項目(需容器實作 IOleItemContainer) | CreateItemMoniker |
| Composite Moniker | 組合多個 Moniker(通用/特定組合) | CreateGenericComposite |
| Anti Moniker | 逆向操作(如 ".."),抵消前一 Moniker | CreateAntiMoniker |
| Pointer Moniker | 封裝介面指標(僅運行狀態,無永久狀態) | CreatePointerMoniker |
| Class Moniker | 封裝 CLSID,可組合形成靈活建立機制 | CreateClassMoniker |
| URL Moniker | 非同步綁定,支援 http/https/ftp/gopher | CreateURLMoniker |
關鍵介面與流程
IMoniker 主要方法
- 名稱管理:
IsEqual、Hash、IsRunning、GetTimeOfLastChange。
- 綁定:
BindToObject、BindToStorage。
- 複合管理:
Reduce、ComposeWith、Enum、Inverse 等。
- 名稱解析:
GetDisplayName、MkParseDisplayName。
綁定上下文
IBindCtx:綁定過程所需環境(執行中物件表 ROT、綁定參數、物件參數傳遞)。
- API
CreateBindCtx 建立。綁定耗時,提供逾時控制。
- 複合 Moniker 綁定時逐層傳遞
IBindCtx,共享 ROT、控制行為。
執行中物件表 (ROT)
- 系統全域表,記錄正在運行且已註冊的 Moniker。
GetRunningObjectTable 取得 IRunningObjectTable 介面。
- 綁定時優先從 ROT 獲取現有物件,避免重複啟動。
File + Item Moniker 組合:文件內物件完整路徑
// 建立檔案 Moniker
IMoniker* pFileMoniker;
CreateFileMoniker(L"C:\\Docs\\Report.doc", &pFileMoniker);
// 建立項目 Moniker(如 "Sheet1")
IMoniker* pItemMoniker;
CreateItemMoniker(L"!", L"Sheet1", &pItemMoniker);
// 組合成複合 Moniker
IMoniker* pComposite;
CreateGenericComposite(pFileMoniker, pItemMoniker, &pComposite);
// 綁定獲取 Sheet1 物件
pComposite->BindToObject(pBindCtx, NULL, IID_IUnknown, (void**)&pUnk);
非同步 Moniker:URL Moniker
- 實作
IAsyncMoniker(標記介面,繼承 IUnknown)。
IsAsyncMoniker API 判斷。
- 綁定過程可獲取進度、支援取消、相容同步綁定。
- 封裝 HTTP/HTTPS/FTP/Gopher 協定,顯示名稱為 URL 路徑。
自訂 Moniker
- 本質:支援
IMoniker 的進程內 COM 物件。
- 實作
IPersistStream 以擁有永久狀態。
- 註冊 CLSID,客戶端透過
MkParseDisplayName 解析顯示名稱建立。
應用範例:OLE 連結物件
OLE 複合文件中的連結物件即採用 Moniker 技術,文件應用為客戶端,連結物件為服務端。MFC 完整封裝此機制。
總結
Moniker 提供符號化、智慧、可組合的物件命名與綁定機制。File/Item/Composite Moniker 覆蓋多數場景;URL Moniker 延伸至網路非同步綁定;自訂 Moniker 支援特定領域命名。核心在於 IMoniker::BindToObject 將永久名稱解析為運行時介面指標。
- 上一篇文章: COM 可連接物件深度解析:事件、連接點、接收器與 IDispatch 實戰
- 下一篇文章: COM 原理與應用:統一資料傳輸 (UDT) 與剪貼簿/拖放
Copyright ©
程式碼之家 All Rights Reserved