My friends, my life, my style - James S.F. Hsieh

8/22/2009

COM IDispatchEx and .NET IExpando

IDispatchEx Interface 用於 Dynamic run-time models, 因為原本的 IDsipatch 只能靜態的 Dispatch 固定的行為, 舉個例子, 某個 COM 定義了數個 Method 與 數個 Property 並且實做 IDsipatch, 而Dispatch 的過程必須透由 IDispatch::GetTypeInfo 取得對應的 ITypeInfo 查詢 dispID, 然後在使用 IDispatch::Invoke 產生呼叫的行為, 重點在於 TypeInfo 通常是固定的, 實做上, 同常是使用LoadTypeLib API 去載入對應的 TLB (TypeLib 由 IDL 產生) 產生出對應的 ITypeInfo, 而 Dispatch 在經由相同的 ITypeInfo 來得到 Invoke 所需要的引數資訊與 VTable offset, 進而造出對應的 callstack. 對 Callee 而言整個 Dispatch 行為都是由 compile time 所完整定義, Caller 只是在執行時期動態的找出需要呼叫的 method 然後 dispatch . 有興趣可以參考 Creation of Dispatch API Functions
而IDispatchEx 是建立在 ITypeInfo 能夠在執行時期動態改變的概念上去設計的, 所以我們可以看到 IDispatchEx 是沒有接露 GetTypeInfo 這種 method 的, 而是利用 IDispatchEx::GetDispID 即時的去查詢對應的 dispID, 因此, IDispatchEx 就有能力用任何方式組裝或 binding 新的 member function 或是 property 並且讓 caller 去呼叫. IExpando 是相對應 .NET 版本的介面, 有趣吧 :)