VARIANT)。interface/dispinterface 描述介面,coclass 描述物件,library 定義型別庫資訊 (LIBID、版本、語言)。MIDL / MkTypLib 編譯 ODL 產生 .tlb 型別庫 與 .h 頭檔。IDispatch 實作時利用型別庫避免繁瑣型別處理。interface IDispatch : IUnknown {
HRESULT GetTypeInfoCount(UINT* pctinfo);
HRESULT GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo);
HRESULT GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames,
LCID lcid, DISPID* rgDispId);
HRESULT Invoke(DISPID dispIdMember, REFIID riid, LCID lcid,
WORD wFlags, DISPPARAMS* pDispParams,
VARIANT* pVarResult, EXCEPINFO* pExcepInfo,
UINT* puArgErr);
};
Invoke:關鍵函數,所有屬性/方法存取皆透過它 → 「自動化物件的指令翻譯器」。GetIDsOfNames:名稱 → DISPID (分派識別碼)。GetTypeInfo:提供型別資訊供瀏覽/早期繫結。VARIANT (16 位元組) 封裝所有自動化支援型別:整數、浮點、字串 (BSTR)、布爾、日期、貨幣、陣列 (SAFEARRAY)、物件介面、錯誤碼、空值等。VARIANTARG 用於參數傳遞。IDispatch 型別資訊靜態 (編譯期固定)。IDispatchEx 繼承 IDispatch,支援動態型別資訊。ITypeInfo 實作 Invoke,自動處理參數封送/型別轉換。switch(dispid))或使用 CreateStdDispatch 標準分派器。EXCEPINFO 回傳豐富錯誤資訊。IDispatch::Invoke 間接呼叫、多層處理、效率損失大。IDispatch + 自訂 vtable 介面 暴露同樣方法/屬性。IDispatch(便利)。dual 關鍵字定義。| 繫結方式 | 機制 | 效率 | 適用環境 |
|---|---|---|---|
| 早期繫結 | 編譯期用型別庫檢查型別,直接用 DISPID 呼叫 Invoke | 高 | VB/VBA 專案引用型別庫、C++ 智慧指標 |
| 晚期繫結 | 執行期 GetIDsOfNames 解析名稱 → DISPID → Invoke | 低 | VBScript、JavaScript、動態語言、Run-time 動態載入 |
選擇取決於控制器運行環境,非以效率為唯一判斷。
Count 屬性、Item(index)、Add/Remove、列舉器 (_NewEnum / IEnumVARIANT)。IDispatch,利用 Invoke 統一分派事件,解決動態接收器建立難題。IDispatch Proxy/Stub,支援跨進程事件。COleDispatchDriver:客戶端封裝,簡化 Invoke 參數處理,支援建立/連接自動化物件。CreateObject / GetObject 使用自動化物件。自動化技術以 IDispatch + VARIANT + 型別庫為核心,為弱型別腳本語言與元件互操作提供標準橋樑。雙重介面兼顧效率與便利,早期/晚期繫結適應不同開發環境。MFC/COleDispatchDriver 進一步簡化 C++ 客戶端開發。