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

COM 原理與應用:命名與綁定技術 (Moniker)

     編輯:關於C++

COM 物件建立的兩種方式

  1. 類別工廠建立:CoCreateInstance,需知 CLSID/ProgID。
  2. Moniker 建立:利用命名與綁定技術,以符號化名稱(如檔案路徑、URL)建立物件,更靈活。

Moniker 核心概念

  • Moniker (名字物件):本身是 COM 物件,實作 IMoniker。封裝物件的永久狀態與啟動邏輯,能將被動物件自動轉為運行狀態 → 「永久智慧名稱」。
  • 客戶端兩步驟:
    1. 取得 Moniker (API 或傳遞)。
    2. 呼叫 IMoniker::BindToObject 綁定獲取介面指標。

Moniker 分類

關鍵介面與流程

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 將永久名稱解析為運行時介面指標。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
類型用途建立 API
File Moniker指向檔案/檔案內部物件CreateFileMoniker
Item Moniker容器內項目(需容器實作 IOleItemContainer)CreateItemMoniker
Composite Moniker組合多個 Moniker(通用/特定組合)CreateGenericComposite
Anti Moniker逆向操作(如 ".."),抵消前一 MonikerCreateAntiMoniker
Pointer Moniker封裝介面指標(僅運行狀態,無永久狀態)CreatePointerMoniker
Class Moniker封裝 CLSID,可組合形成靈活建立機制CreateClassMoniker
URL Moniker非同步綁定,支援 http/https/ftp/gopherCreateURLMoniker