首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

《COM 技術內幕》讀書筆記:七大常見問題深度解析

     編輯:關於VC++

問題一:自動化如何以開發人員代碼取代編譯器生成代碼? (P231)

解讀:傳統應用需經編譯器編譯才能執行,現在用腳本語言操作自動化介面,可動態完成相同應用(實為解譯執行)。

例子:你沒有 Word 原始碼,想定製針對政府公文的 Word 應用,只能找有原始碼的公司修改(微軟會聽你的嗎?)。但用自動化介面配合 VBA 腳本控制 Word 即可完成。雖解譯執行較慢,但免改原始碼、免重測,豈不更好?

問題二:C++ 程式設計師若想在執行時從頭構造 vtbl 怎麼理解? (P234)

解讀:vtbl 通常由編譯器生成,但若你瞭解其構造過程,可自行仿製。建議閱讀《COM 本質論》+《Inside C++ Object Model》,做好啃硬骨頭的心理準備。

問題三:OleInitialize 與 CoInitialize(Ex) 差異? (P236)

  • CoInitialize/CoInitializeEx:初始化 COM 執行環境,如練武前劃圈擺兵器。
  • OleInitialize:初始化 OLE 執行環境,OLE 是 COM 基礎上的擴展,是 ActiveX 運作基石,如在圈內撐鋼絲表演高難度動作。

問題四:point_default 關鍵字解釋難懂 (P208)

  1. 「其它屬性」指何?
  2. 「函數內部不能指定別名」,別名為何?

回答:別名應指 MIDL 中的 typedef(歉意,我對 COM 調度部分關注較少,僅能簡略回答,請你確認後告知)。

問題五:用 COM 介面實現 IDispatch::Invoke 如何理解?FooBar 不是 COM 介面吧? (P234)

解讀:COM 借鑑大量 C++ 實現方式(如 vtbl)。嚴格說 FooBar 非 COM 介面(缺 IUnknown 三方法),但廣義上因使用 vtbl 可勉強視為 COM 介面(若作者堅持)。

問題六:分發介面是 COM 介面嗎?與 Invoke 關係?

解讀:分發介面可是 COM 介面也可不是,僅是實現方式不同。概念上應包含兩個陣列:dispid 與方法名對應、dispid 與方法指標對應。只要有這兩部分即為分發介面。Invoke 時提供 dispid 及參數,利用分發介面機制取得函數指標進行呼叫。

問題七:IDispatch::Invoke 如何實現「函數集」?關係為何? (P234)

Invoke 運行流程:

  1. 透過各種方式取得 dispid(不只 GetIDsOfNames,我曾在組件依狀態動態傳出可執行 dispid,再提供 ExecuteCmd(dispid) 讓客戶動態執行)。
  2. 介面本質為函數指標陣列,dispid 為索引(僅實作 IDispatch 才有)。指定索引取得函數指標,用 (*funcPtr)(params...) 呼叫。

參數陣列轉呼叫列表難題:參數以陣列傳入,但函數指標呼叫需參數列表。解法:用 MS API DispCallFunc 或 DispInvoke,或 MFC/ATL 封裝(MFC 用 helper,ATL 用 IDispatchImpl 模板)。

分發介面本質:邏輯概念,存放方法名與函數指標,透過指定方法名檢索函數指標,最大用處是提供給腳本解譯器使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved