天天看點

COM程式設計精彩執行個體--COM通信

COM是如何進行通信的: //

COM程式設計精彩執行個體--COM通信
COM程式設計精彩執行個體--COM通信

①代理/樁子或COM DLL将方法的調用參數轉化成NDR格式; ②COM調用RPC将格式化的資料傳遞給伺服器端的COM代理/樁子或COM DLL; ③伺服器端的COM代理/樁子或COM DLL将資料還原成參數表,放到調用堆棧和/為指針參數開辟的記憶體中; ④伺服器的COM代理/樁子或COM DLL,然後調用COM伺服器的方法 ⑤傳回參數的處理過程同上

當你調用一個方法時,參數都會被轉化成标準通信協定所定義的傳輸格式,這個協定叫做網絡資料表示(NDR)。

基本的IDL檔案格式: 早綁定接口: //

COM程式設計精彩執行個體--COM通信
COM程式設計精彩執行個體--COM通信

1)使用的術語是接口而不是類 2)所有的COM類都是繼承自同一個基類IUnknown。 3)類、方法、方法的參數都用括号内的關鍵字進一步加以定義。 晚綁定接口: IDispatch提供了三個查詢對象方法的函數和一個調用方法的函數。 1)GetTypeInfo()和GetTypeInfoCount()。 客戶程式用這兩個函數來标底一個支援晚綁定的COM對象的所有方法和函數。這兩個方法客允許客戶程式以程式設計的形式來檢視對象的類型庫,并傳回調用方法的ID所需參數表。 2)GetIDsOfNames()。 給定方法名的清單,尋找與之比對的ID。 3)Invoke()。 給定方法ID和參數表,實作方法的真正調用。 二進制接口: 一個二進制接口的IDL檔案如下:

COM程式設計精彩執行個體--COM通信
COM程式設計精彩執行個體--COM通信

特點: 1)有早綁定的接口ID和接口設計; 2)有晚綁定的方法ID,它派生自IDispatch。

類型庫聲明: 在IDL檔案的最後部分是一個庫聲明,MIDL用它來生成類型庫。 //

COM程式設計精彩執行個體--COM通信
COM程式設計精彩執行個體--COM通信

簡單參數類型: //

COM程式設計精彩執行個體--COM通信
COM程式設計精彩執行個體--COM通信

①雖然IDL可能會允許你定義特殊的參數類型,但VB和VJ++仍要靠COM DLL才能知道如何傳送這個參數。在這種情況下,OLE32.DLL不知道如何處理,而VB和VJ++支援的晚綁定接口又不允許程式員自己寫代理/樁子DLL,是以COM不支援這種類型。當COM發現需要一個代理/樁子DLL,又不能找到并裝載時,該怎麼辦呢?它不會打報錯,隻是盡可能地将資料傳出去,剩下的就不管了,比如你要傳一個數組,COM就隻把數組的第一個元素傳出去。 ②如果你要在參數清單中使用枚舉類型,那麼必須在IDL檔案的開頭、任何其他聲明之前定義這個類型。

變量的屬性: 1)[in]:通知COM隻将該參數從用戶端傳往伺服器端。 2)[out]:通知COM該參數不需要傳往伺服器,但伺服器有東西要回傳給用戶端。是以客戶程式在調用方法前必須把該參數指派為一個有效指針或NULL。 3)[in,out]:通知COM該參數不僅要傳往伺服器,結束調用時伺服器還要回傳給用戶端。是以客戶程式在調用方法前必須把該參數指派為一個有效指針或NULL。 4)[out,retval]:通知用戶端,該參數必須作為方法調用的傳回值被傳回。

COM

繼續閱讀