自動化讓解釋性語言(VBScript、JavaScript)與巨集語言能輕鬆存取 COM 元件。本文深入剖析 IDispatch 介面、調度介面、雙重介面、Invoke 七大參數、屬性與方法對應、類型庫機制與實務呼叫範例。
interface IDispatch : IUnknown {
HRESULT GetTypeInfoCount(UINT *pctinfo);
HRESULT GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
HRESULT GetIDsOfNames(REFIID riid, OLECHAR **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);
};
核心雙函式:GetIDsOfNames(名稱→DISPID)、Invoke(DISPID→執行)。
Invoke 實作的一組函式集合,非 vtable 佈局。IDispatch 的 COM 介面,成員同時可透過 vtable(早期繫結)與 Invoke(晚期繫結)存取。C++ 用 vtable 高效,腳本語言用 Invoke 彈性。IDispatch 介面指標(CoCreateInstance + IID_IDispatch)。GetIDsOfNames 取得目標函式/屬性的 DISPID。DISPPARAMS,呼叫 Invoke 執行。| 參數 | 說明 |
|---|---|
dispIdMember | 目標成員的 DISPID |
riid | 保留,必為 IID_NULL |
lcid | 地區識別碼(GetUserDefaultLCID()) |
wFlags | 調用類型:DISPATCH_METHOD、DISPATCH_PROPERTYGET、DISPATCH_PROPERTYPUT、DISPATCH_PROPERTYPUTREF |
pDispParams | 參數陣列(rgvarg),引數順序反向(最右參數在索引 0) |
pVarResult | 接收回傳值/屬性值的 VARIANT 指標,無回傳可為 NULL |
pExcepInfo | 例外資訊結構(wCode/scode、bstrDescription 等),錯誤時填充 |
puArgErr | 參數錯誤索引(對應 DISP_E_PARAMNOTFOUND/TYPEMISMATCH) |
[propput] HRESULT Visible([in] VARIANT_BOOL bVisible);
[propget] HRESULT Visible([out, retval] VARIANT_BOOL *pbVisible);
put_Visible、get_Visible,同一 DISPID。Invoke 以 wFlags 區分:PROPERTYPUT 呼叫 put、PROPERTYGET 呼叫 get。.tlb),含元件/介面/方法/屬性/參數/結構的完整型別資訊。regtlib 註冊)或嵌入 DLL/EXE 資源。#import "xxx.tlb" no_namespace 產生 .tlh/.tli 標頭,實現早期繫結與智慧提示。dual 介面)。#import),避免手工構造 DISPPARAMS 易錯。