學習 COM 的時候,一直強調 COM 的位置透明,但是始終感覺不到透明,組件都是本機注冊的。知道分布式 COM 其實就是 DCOM 可以實現遠程調用組件,但是一直懶于看,遲遲沒有很好理解。眼看著分布式軟件設計這么流行, .NET 、 J2EE 大行其道,橫下心先把 DCOM 拿下。至于 DCOM 好處我不多說,上網 google 一下,最大的缺點是配置麻煩,尤其是存在防火墻的時候更麻煩(網上說的,我沒有防火墻,呵呵)。
從這個圖看看客戶端和服務器端分別需要什么(由于開始沒有理解,客戶端接口查詢老失敗,花費我半天時間)
客戶端:客戶程序、代理 / 存根
服務器端:服務器組件、代理 / 存根
這里可以看出 DOM 是針對 COM 遠程調用( RPC )的實現,封裝了底層通信。有些程序開發就是在使用 Socket 或 DCOM 之間選擇。
?
實現一個簡單的功能: DCOM 組件提供一個接口方法獲取歡迎信息,客戶端調用接口獲取信息并顯示。
打開 VC6 ,首選創建一個 ATL 工程 DComServer
選擇完成。
添加一個 ATL 組件,取名 Server ,添加一個接口方法:
實現方法:
打開Settings,進行工程設置:
編譯可以發現項目目錄下面生成了 DComServerps.dll ,這個就是代理存根,需要在客戶和服務器注冊。
創建客戶端調用(一個基于對話框的 MFC 程序) (記的要初始化 COM 庫)
實現連接和獲取消息按鈕事件:
這個地方有網上說很麻煩,需要關閉防火墻、需要用戶名一致等,不過我還好,服務器是 Win2k sp4 administrator 帳戶,客戶端是 Win2k3 sp1 administrator 帳戶,一次性就可以創建遠程組件,就是查詢接口時候老是失敗。花了半天時間上網才發現需要注冊代理存根 dll ,就是編譯 DComServer 之前需要設置的。
拷貝 DComServer 下的 DComServerps.dll 和 DComClient 下 Debug 里面的 DComClient.exe 到客戶端,使用 regsvr32 注冊 DComServerps.dll ,運行 DComClient.exe 。
連接 DCOM 服務:
服務器進程自動啟動: 獲取消息:
?代碼下載。(里面有說明)