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