腳本中常見 obj.Document.Write(...) 寫法,Document 即為 LPDispatch 型別屬性——一個擁有自身方法/屬性的子自動化物件。本文示範在 MFC 与 ATL 两大框架下實現分層自動化接口,讓組件結構清晰、符合腳本習慣。
CAAA (可創建) 與 CBBB (僅 Automation) 兩個自動化類CAAA 內嵌 CBBB m_bbb 成員IAAA 增加 BBB 屬性,型別 LPDispatch,Get/Set 類型return m_bbb.GetIDispatch(TRUE);Set 拋 SetNotSupported()IBBB 添加業務方法 (如加法),將 CBBB 建構函數改為 publicIAAAIBBB,並在 coclass AAA 宣告雙介面IDispatchImpl<IAAA>, IDispatchImpl<IBBB>COM_INTERFACE_ENTRY2(IDispatch, IAAA) 指定預設 IDispatchIAAA::get_BBB 實現:QueryInterface(IID_IBBB, (LPVOID*)pVal)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 聚合語義。兩者核心均在於:父介面屬性返回子介面指標,實現腳本端的鏈式調用。