解讀:傳統應用需經編譯器編譯才能執行,現在用腳本語言操作自動化介面,可動態完成相同應用(實為解譯執行)。
例子:你沒有 Word 原始碼,想定製針對政府公文的 Word 應用,只能找有原始碼的公司修改(微軟會聽你的嗎?)。但用自動化介面配合 VBA 腳本控制 Word 即可完成。雖解譯執行較慢,但免改原始碼、免重測,豈不更好?
解讀:vtbl 通常由編譯器生成,但若你瞭解其構造過程,可自行仿製。建議閱讀《COM 本質論》+《Inside C++ Object Model》,做好啃硬骨頭的心理準備。
CoInitialize/CoInitializeEx:初始化 COM 執行環境,如練武前劃圈擺兵器。OleInitialize:初始化 OLE 執行環境,OLE 是 COM 基礎上的擴展,是 ActiveX 運作基石,如在圈內撐鋼絲表演高難度動作。回答:別名應指 MIDL 中的 typedef(歉意,我對 COM 調度部分關注較少,僅能簡略回答,請你確認後告知)。
解讀:COM 借鑑大量 C++ 實現方式(如 vtbl)。嚴格說 FooBar 非 COM 介面(缺 IUnknown 三方法),但廣義上因使用 vtbl 可勉強視為 COM 介面(若作者堅持)。
解讀:分發介面可是 COM 介面也可不是,僅是實現方式不同。概念上應包含兩個陣列:dispid 與方法名對應、dispid 與方法指標對應。只要有這兩部分即為分發介面。Invoke 時提供 dispid 及參數,利用分發介面機制取得函數指標進行呼叫。
Invoke 運行流程:
dispid(不只 GetIDsOfNames,我曾在組件依狀態動態傳出可執行 dispid,再提供 ExecuteCmd(dispid) 讓客戶動態執行)。dispid 為索引(僅實作 IDispatch 才有)。指定索引取得函數指標,用 (*funcPtr)(params...) 呼叫。參數陣列轉呼叫列表難題:參數以陣列傳入,但函數指標呼叫需參數列表。解法:用 MS API DispCallFunc 或 DispInvoke,或 MFC/ATL 封裝(MFC 用 helper,ATL 用 IDispatchImpl 模板)。
分發介面本質:邏輯概念,存放方法名與函數指標,透過指定方法名檢索函數指標,最大用處是提供給腳本解譯器使用。