• <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)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            人妻无码αv中文字幕久久琪琪布| 久久久青草久久久青草| 国产精品成人精品久久久| 久久亚洲中文字幕精品有坂深雪| 亚洲中文字幕伊人久久无码| 一级做a爰片久久毛片毛片| 久久精品国产亚洲AV忘忧草18| 久久天天躁夜夜躁狠狠| 精品久久无码中文字幕| 久久成人永久免费播放| 久久久久亚洲AV无码麻豆| 99久久亚洲综合精品成人| 国产A三级久久精品| 久久精品亚洲欧美日韩久久| 久久久久亚洲AV片无码下载蜜桃| 久久亚洲精品无码播放| 人妻无码久久一区二区三区免费| 久久亚洲国产成人精品无码区| 亚洲中文字幕伊人久久无码 | 99久久国产热无码精品免费| 久久996热精品xxxx| 久久成人国产精品| 伊人久久精品无码二区麻豆| 国产AⅤ精品一区二区三区久久| 久久99九九国产免费看小说| 久久精品夜夜夜夜夜久久| 久久涩综合| 国产成人无码精品久久久免费| 亚洲精品无码久久久久久| 久久中文精品无码中文字幕| 91视频国产91久久久| 2021少妇久久久久久久久久| 精品无码久久久久国产动漫3d| 一本色综合久久| 亚洲午夜无码久久久久小说| 婷婷久久精品国产| 一级女性全黄久久生活片免费| 久久青青草原精品国产不卡| 99热都是精品久久久久久| 日本久久久精品中文字幕| 久久国产精品成人免费|