• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            萬星星@豌豆莢 歡迎加入我們
            一個(gè)吃軟飯的男人!!!!!我只想寫程序####
            微博:http://weibo.com/wanlianwen
            posts - 172,  comments - 1253,  trackbacks - 0

            學(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)上說的,我沒有防火墻,呵呵)。

            簡(jiǎn)單介紹?

            從這個(gè)圖看看客戶端和服務(wù)器端分別需要什么(由于開始沒有理解,客戶端接口查詢老失敗,花費(fèi)我半天時(shí)間)

            客戶端:客戶程序、代理 / 存根

            服務(wù)器端:服務(wù)器組件、代理 / 存根

            這里可以看出 DOM 是針對(duì) COM 遠(yuǎn)程調(diào)用( RPC )的實(shí)現(xiàn),封裝了底層通信。有些程序開發(fā)就是在使用 Socket DCOM 之間選擇。

            ?

            一個(gè) DCOM 程序?qū)崿F(xiàn)

            實(shí)現(xiàn)一個(gè)簡(jiǎn)單的功能: DCOM 組件提供一個(gè)接口方法獲取歡迎信息,客戶端調(diào)用接口獲取信息并顯示。

            創(chuàng)建 DCOM 組件

            打開 VC6 ,首選創(chuàng)建一個(gè) ATL 工程 DComServer

            選擇完成。

            添加一個(gè) ATL 組件,取名 Server ,添加一個(gè)接口方法:

            實(shí)現(xiàn)方法:

            STDMETHODIMP?CServer::GetInfo(BSTR? * pbstrInfo)
            {
            ???????
            // ?TODO:?Add?your?implementation?code?here
            ??????? if (pbstrInfo)
            ???????
            {
            ??????????????
            * pbstrInfo? = ?SysAllocString(L " 你好,這里是DCOM服務(wù)器! " );
            ???????}

            ???????
            return ?S_OK;
            }

            打開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)連接和獲取消息按鈕事件:

            void ?CDComClientDlg::OnButtonConnect()?
            {
            ????
            // ?TODO:?Add?your?control?notification?handler?code?here
            ????COSERVERINFO????serverInfo;
            ????MULTI_QI????????multiQi????????
            = ? { & IID_IServer,?NULL,?NOERROR} ;
            ????HRESULT????????????hr????????????
            = ?NOERROR;
            ????UpdateData(TRUE);
            ????
            // ?如果已經(jīng)連接上
            ???? if (m_pIServer)
            ????
            {
            ????????m_pIServer
            -> Release();
            ????????m_pIServer?
            = ?NULL;
            ????}

            ????ZeroMemory(
            & serverInfo,? sizeof (COSERVERINFO));
            ????serverInfo.pwszName?
            = ?m_strServer.AllocSysString();
            ????
            // ?創(chuàng)建遠(yuǎn)程組件
            ????hr? = ?CoCreateInstanceEx(
            ????????CLSID_Server,
            ????????NULL,
            ????????CLSCTX_REMOTE_SERVER,
            ????????
            & serverInfo,
            ????????
            1 ,
            ????????
            & multiQi);
            ????
            // ?釋放字符串指針
            ????SysFreeString(serverInfo.pwszName);
            ????
            if (SUCCEEDED(hr))
            ????
            {
            ????????m_pIServer?
            = ?(IServer * )multiQi.pItf;
            ????????AfxMessageBox(_T(
            " 連接成功! " ));
            ????}

            ????
            else
            ????
            {
            ????????AfxMessageBox(_T(
            " 連接失敗! " ));
            ????}

            }


            void ?CDComClientDlg::OnButtonGetmessage()?
            {
            ????
            // ?TODO:?Add?your?control?notification?handler?code?here
            ????BSTR????bstrInfo;
            ????USES_CONVERSION;
            ????
            if (m_pIServer)
            ????
            {
            ????????m_pIServer
            -> GetInfo( & bstrInfo);
            ????????AfxMessageBox(W2A(bstrInfo));
            ????}

            ????
            else
            ????
            {
            ????????AfxMessageBox(_T(
            " 請(qǐng)連接DCOM服務(wù)! " ));
            ????}

            }

            ?

            部署客戶端

            這個(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):

            獲取消息:

            ?
            代碼下載。(里面有說明)

            ?

            posted on 2006-07-10 11:25 萬連文 閱讀(2705) 評(píng)論(8)  編輯 收藏 引用 所屬分類: ATL

            FeedBack:
            # re: 分布式設(shè)計(jì)之DCOM實(shí)現(xiàn)
            2006-07-10 18:58 | LOGOS
            汗.你要用RPC的話,用web service比DCOM好多了.  回復(fù)  更多評(píng)論
              
            # re: 分布式設(shè)計(jì)之DCOM實(shí)現(xiàn)
            2006-07-14 00:07 | hi
            兄弟,dcom微軟已經(jīng)不再進(jìn)行后期研發(fā)維護(hù)了,都改com+,Dot Net呢!  回復(fù)  更多評(píng)論
              
            # re: 分布式設(shè)計(jì)之DCOM實(shí)現(xiàn)
            2006-07-14 10:08 | 萬連文
            謝謝以上兩個(gè)兄弟對(duì)我的友情提示,我知道技術(shù)越用越簡(jiǎn)單,我覺得自己應(yīng)該一步一個(gè)腳印走過去,很難說.NET技術(shù)底層實(shí)現(xiàn)思想很大超越COM。  回復(fù)  更多評(píng)論
              
            # re: 分布式設(shè)計(jì)之DCOM實(shí)現(xiàn)
            2007-03-18 10:58 | 小橋
            .NET本身就是個(gè)COM  回復(fù)  更多評(píng)論
              
            # re: 分布式設(shè)計(jì)之DCOM實(shí)現(xiàn)
            2007-03-18 10:59 | 小橋
            望交流,QQ:2220911  回復(fù)  更多評(píng)論
              
            # re: 分布式設(shè)計(jì)之DCOM實(shí)現(xiàn)
            2008-07-07 12:03 | liyongcheng
            客戶端傳遞給服務(wù)器一個(gè)字符串怎么實(shí)現(xiàn)。


              回復(fù)  更多評(píng)論
              
            # re: 分布式設(shè)計(jì)之DCOM實(shí)現(xiàn)
            2008-07-07 23:07 | lwan
            服務(wù)器添加一個(gè)接口傳遞字符串應(yīng)該就可以了吧  回復(fù)  更多評(píng)論
              
            # re: 分布式設(shè)計(jì)之DCOM實(shí)現(xiàn)
            2011-12-05 12:53 | lhh
            DCOM 跨機(jī)訪問總是出權(quán)限問題, CoCreateInstanceEx返回ACCESSDENIED,請(qǐng)問該如何解決?  回復(fù)  更多評(píng)論
              
            簡(jiǎn)歷下載
            聯(lián)系我

            <2006年7月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊(cè)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            日本加勒比久久精品| 欧美伊人久久大香线蕉综合69| 久久狠狠一本精品综合网| 久久超碰97人人做人人爱| 久久精品国产亚洲AV香蕉| 久久久WWW成人免费毛片| 中文字幕亚洲综合久久2| 久久久久四虎国产精品| 韩国无遮挡三级久久| 久久99热狠狠色精品一区| www.久久热.com| 久久久精品一区二区三区| 久久久久国产一级毛片高清版| av无码久久久久不卡免费网站| 久久香蕉超碰97国产精品| 久久精品亚洲日本波多野结衣| 久久精品中文騷妇女内射| 精品久久久久久无码专区不卡| 97久久香蕉国产线看观看| 久久久综合九色合综国产| 国产999精品久久久久久| 国产午夜福利精品久久| 久久久久九九精品影院| 精品久久久久久无码不卡| 中文字幕日本人妻久久久免费 | 亚洲AⅤ优女AV综合久久久| 欧美麻豆久久久久久中文| 欧美亚洲日本久久精品| 久久婷婷五月综合国产尤物app | 久久久黄色大片| 无码AV波多野结衣久久| 麻豆精品久久精品色综合| 蜜桃麻豆www久久国产精品| 2020久久精品亚洲热综合一本| 久久精品亚洲一区二区三区浴池| 久久99精品国产99久久6男男| 久久久久99精品成人片三人毛片| 国产精品久久新婚兰兰| 国产精品久久网| 久久久久亚洲国产| 亚洲精品高清久久|