• <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>
            萬星星@豌豆莢 歡迎加入我們
            一個吃軟飯的男人!!!!!我只想寫程序####
            微博:http://weibo.com/wanlianwen
            posts - 172,  comments - 1253,  trackbacks - 0

            學習 COM 的時候,一直強調 COM 的位置透明,但是始終感覺不到透明,組件都是本機注冊的。知道分布式 COM 其實就是 DCOM 可以實現遠程調用組件,但是一直懶于看,遲遲沒有很好理解。眼看著分布式軟件設計這么流行, .NET 、 J2EE 大行其道,橫下心先把 DCOM 拿下。至于 DCOM 好處我不多說,上網 google 一下,最大的缺點是配置麻煩,尤其是存在防火墻的時候更麻煩(網上說的,我沒有防火墻,呵呵)。

            簡單介紹?

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

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

            服務器端:服務器組件、代理 / 存根

            這里可以看出 DOM 是針對 COM 遠程調用( RPC )的實現,封裝了底層通信。有些程序開發就是在使用 Socket DCOM 之間選擇。

            ?

            一個 DCOM 程序實現

            實現一個簡單的功能: DCOM 組件提供一個接口方法獲取歡迎信息,客戶端調用接口獲取信息并顯示。

            創建 DCOM 組件

            打開 VC6 ,首選創建一個 ATL 工程 DComServer

            選擇完成。

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

            實現方法:

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

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

            打開Settings,進行工程設置:

            編譯可以發現項目目錄下面生成了 DComServerps.dll ,這個就是代理存根,需要在客戶和服務器注冊。

            創建客戶端調用(一個基于對話框的 MFC 程序) (記的要初始化 COM 庫)

            實現連接和獲取消息按鈕事件:

            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);
            ????
            // ?如果已經連接上
            ???? if (m_pIServer)
            ????
            {
            ????????m_pIServer
            -> Release();
            ????????m_pIServer?
            = ?NULL;
            ????}

            ????ZeroMemory(
            & serverInfo,? sizeof (COSERVERINFO));
            ????serverInfo.pwszName?
            = ?m_strServer.AllocSysString();
            ????
            // ?創建遠程組件
            ????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(
            " 請連接DCOM服務! " ));
            ????}

            }

            ?

            部署客戶端

            這個地方有網上說很麻煩,需要關閉防火墻、需要用戶名一致等,不過我還好,服務器是 Win2k sp4 administrator 帳戶,客戶端是 Win2k3 sp1 administrator 帳戶,一次性就可以創建遠程組件,就是查詢接口時候老是失敗。花了半天時間上網才發現需要注冊代理存根 dll ,就是編譯 DComServer 之前需要設置的。

            拷貝 DComServer 下的 DComServerps.dll DComClient Debug 里面的 DComClient.exe 到客戶端,使用 regsvr32 注冊 DComServerps.dll ,運行 DComClient.exe

            連接 DCOM 服務:

            服務器進程自動啟動:

            獲取消息:

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

            ?

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

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


              回復  更多評論
              
            # re: 分布式設計之DCOM實現
            2008-07-07 23:07 | lwan
            服務器添加一個接口傳遞字符串應該就可以了吧  回復  更多評論
              
            # re: 分布式設計之DCOM實現
            2011-12-05 12:53 | lhh
            DCOM 跨機訪問總是出權限問題, CoCreateInstanceEx返回ACCESSDENIED,請問該如何解決?  回復  更多評論
              
            簡歷下載
            聯系我

            <2008年12月>
            30123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            一本一本久久A久久综合精品| 伊人久久大香线蕉精品| 亚洲伊人久久综合影院| 精产国品久久一二三产区区别| 精品久久久久久亚洲精品| a级毛片无码兔费真人久久| 久久人做人爽一区二区三区| 久久综合九色综合精品| 中文字幕无码精品亚洲资源网久久 | 91久久精品无码一区二区毛片| 久久亚洲AV成人无码| 国产精品99久久精品爆乳| 午夜精品久久久久久毛片| 亚洲精品无码久久久| 99久久精品国产毛片| 国产精品久久久久影视不卡| 2021国产精品久久精品| 人人狠狠综合久久亚洲| 91精品国产色综久久| 国产亚洲欧美成人久久片| 色欲av伊人久久大香线蕉影院| 一级a性色生活片久久无| 国产呻吟久久久久久久92| 青青青青久久精品国产 | 亚洲综合久久综合激情久久 | 99久久超碰中文字幕伊人| 久久国产欧美日韩精品免费| 久久亚洲天堂| 精品国产青草久久久久福利| 国产福利电影一区二区三区久久老子无码午夜伦不 | 精品伊人久久大线蕉色首页| 亚洲国产精品综合久久一线| 日本加勒比久久精品| 久久99这里只有精品国产| 2021国产精品久久精品| 一本一本久久A久久综合精品| 狠狠色丁香久久婷婷综合蜜芽五月| 久久天天婷婷五月俺也去| 亚洲精品乱码久久久久久自慰 | 国产亚洲成人久久| 精品人妻伦一二三区久久|