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

IDispatch 多層自動化接口實現:MFC 與 ATL 打造 LPDispatch 分層屬性

     編輯:關於VC++

腳本中常見 obj.Document.Write(...) 寫法,Document 即為 LPDispatch 型別屬性——一個擁有自身方法/屬性的子自動化物件。本文示範在 MFC 与 ATL 两大框架下實現分層自動化接口,讓組件結構清晰、符合腳本習慣。

MFC 實現 (CCmdTarget 體系)

  1. 建立支持 Automation 的 DLL 專案
  2. 添加 CAAA (可創建) 與 CBBB (僅 Automation) 兩個自動化類
  3. CAAA 內嵌 CBBB m_bbb 成員
  4. 在 IAAA 增加 BBB 屬性,型別 LPDispatch,Get/Set 類型
  5. 實現 Get:return m_bbb.GetIDispatch(TRUE);Set 拋 SetNotSupported()
  6. IBBB 添加業務方法 (如加法),將 CBBB 建構函數改為 public

ATL 實現 (雙介面體系)

  1. 建立 ATL DLL 專案,添加雙介面 IAAA
  2. 手工在 IDL 添加第二介面 IBBB,並在 coclass AAA 宣告雙介面
  3. 類定義多重繼承:IDispatchImpl<IAAA>, IDispatchImpl<IBBB>
  4. COM_MAP 註冊兩介面,關鍵用 COM_INTERFACE_ENTRY2(IDispatch, IAAA) 指定預設 IDispatch
  5. IAAA::get_BBB 實現:QueryInterface(IID_IBBB, (LPVOID*)pVal)
  6. IBBB 添加 Add(long, long, long*) 等業務方法

測試驗證

編譯 Release 版 DLL,regsvr32 註冊,雙擊附帶的 .vbs 腳本即可測試:Set obj = CreateObject("AAA") → obj.BBB.Add 1,2 正確返回 3。兩套方案均在 VC6 驗證通過。

架構對比

MFC 靠 GetIDispatch 獲取內嵌物件介面,適合現有 MFC 專案;ATL 通過 QueryInterface 實現同一物件多介面暴露,結構更輕量、符合 COM 聚合語義。兩者核心均在於:父介面屬性返回子介面指標,實現腳本端的鏈式調用。

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