Proxy Stub即代理和存根。
基本介紹
- 外文名:Proxy Stub
- 領域:計算機
- 相關概念:列集(marshalling)
什麼是代理和存根,為什麼要用代理和存根,列集(marshalling),代理和存根dll的建立,怎么使用代理和存根,
什麼是代理和存根
打個比方,你到自動取款機上去取款;你就是客戶,取款機就是你的代理;你不會在乎錢具體放在那裡,你只想看到足夠或更多的錢從出口出來(這就是com的透明性)。你同銀行之間的操作完全是取款機代理實現。 你的取款請求通過取款機,傳到另一頭,銀行的伺服器,他也沒有必要知道你在哪兒取錢,他所關心的是你的身份,和你取款多少。當他確認你的許可權,就進行相應的操作,返回操作結果給取款機,取款機根據伺服器返回結果,從保險柜里取出相應數量的錢給你。你取出卡後,操作完成。 取款機不是直接同伺服器連線的,他們之間還有一個“存根”,取款機與存根通信,伺服器與存根通信。從某種意義上說存根就是伺服器的代理。
為什麼要用代理和存根
客戶為什麼要用代理和存根,而不直接同對象連線呢? 給你一個理由,對客戶來說,他與所有com對象的連線都是通過指針來調用的, 而對服務來說,調用對象的接口函式也是通過指針來完成的,然而,指針只有在同一進程內才會有效。這樣,代理和存根為了完成這個使命也就產生了。
代理和存根的作用不只這些,他還要打包所有的參數(包括接口指針),產生RPC(遠程進程調用),通向另一個進程,或者對象運行所在的另一台機器。
上圖所顯示的代理結構支持參數的標準列集。每個接口的代理實現了IRpcProxyBuffer接口,用於內聚各個部分之間的相互通信。當代理準備把已列集的參數傳遞過進程邊界時,他調用IRpcChannelBuffer接口的方法(該接口由channel實現)。channel調用RPC運行庫使數據傳輸到目的地。
如上圖所示,每個接口的存根被連線到對象的相應接口上。chnnel分發傳入的訊息到適當的接口的存根。所有的組件通過IRpcChannelBuffer接口與chnnel交流,這個接口提供了與RPC運行庫的連線。
列集(marshalling)
說到代理和存根,自然少不了列集,什麼是列集?
列集,對函式參數進行打包處理得過程,因為指針等數據,必須通過一定得轉換,才能被另一組件所理解,列集完成後,RPC調用就會產生。可以說列集是一種數據格式的轉換方法。
列集有3種方式:
1. 類型庫列集
它可以列集與OLEAUTOMATION兼容的任何接口,意思是你的接口的返回值必須是HRESULT,所使用的參數的類型也應該是與C++的VARIANT結構兼容。
2. 通過創建Stub / proxy DLL
這個DLL的源代由MIDL產生。你必須在伺服器和客戶機上都註冊這個DLL(這是標準的marshal 方式)使用此方法時,最好把stub / proxy代碼編譯作為一個獨立的組件。
3. 自定義marshaling
自定義marshal要求在你的組件中必須實現IMarshal接口。當COM需要marchal時,他首先通過QueryInterface看你是否支持IMarshal接口,如果你實現了該接口,也就是說,由你控制了你的COM的所有參數和返回值的打包、解包的方法模式。
代理和存根dll的建立
使用工具MIDL,對一個IDL檔案,MIDL會分析自動產生相應的代理/存根DLL的相關檔案。
怎么使用代理和存根
對於你來說代理和存根的使用是透明的,你根本不用去關心如何使用他們,com庫會知道怎么做。