• <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
            總愛嘮叨幾句(只關(guān)心技術(shù)的人可以跳過,^_^)
            來北京前,在武漢做開發(fā),那里全部用VC,并且采用比較傳統(tǒng)的方法解決問題。漸漸的,我感覺到自己的知識體系很不完善,做事情總是想采取簡潔通用完美的方案,然而認識有限總是無功而返,回到傳統(tǒng)解決途徑上去。那個地方?jīng)]有人可以教我,可能由于大家專注不同。一個人苦心鉆研技術(shù),顯得煢煢孑立,很多時候我都在懷疑為什么別人可以查閱到那么多資料,他們到底有什么秘訣?我看到我的研究生同學(xué),他們都在公司做技術(shù),應(yīng)該很有朝氣活力,敢于研究技術(shù)的。可是我為他們擔(dān)心,他們逐漸淪為代碼機器,不敢于改革自己現(xiàn)有的編程模式,把思維禁錮在一個很小的范圍。我的一個同學(xué)給我發(fā)牢騷,說頭又給他一個MIS項目維護代碼,抱怨里面代碼如何亂,風(fēng)格如何糟糕,動不動就死機。他總問我某個控件實現(xiàn)特定功能怎么做,我很抱歉,因為有的我也不知道。我想起2年前的自己,熱衷于駕馭控件的技巧,機器上的各類控件琳瑯滿目,每發(fā)現(xiàn)一個好控件,如獲珍寶收藏起來,然而大多都沒有派上用場。學(xué)習(xí)的過程讓我明白一個道理:應(yīng)該形成解決問題的方案,學(xué)會解決問題才是王道。
            大三開的COM課程,我剛一接觸,就深深愛上這個東西,當(dāng)時幾個班就我最用心學(xué),可能大家覺得很難沒有認真學(xué)。我想說的是要感謝COM,它應(yīng)該是C++開發(fā)從編碼到設(shè)計的轉(zhuǎn)折點,給我最深的感覺就是它是一種框架行為。
            來到北京,我的視野開闊很多,在一個技術(shù)遠遠超過自己的人的指點下,我如沐春風(fēng)。我從一個不怕coding的人成長成一個不怕設(shè)計的人,自然心高氣爽許多。

            框架技術(shù)體系

            一直喜歡講體系,學(xué)習(xí)技術(shù),總是想把握住整個體系,有利有弊。利就是眼界開闊,增加底氣;弊就是戰(zhàn)線太長,自己很疲憊。非常贊成中國的中庸思想,對于我來說,COM就是中庸,上下開壑,開辟.NET和OLE學(xué)習(xí)之路。
            Automation作為COM之前的一種老技術(shù),翻譯過來叫自動化。由于一開始接觸的就是COM,習(xí)慣COM和MFC分離開發(fā),因此一直沒有很好理解Automation技術(shù),只知道它集成在MFC應(yīng)用中,以類型庫方式提供服務(wù)。
            昨天寫完MFC和VBA集成后,突然感覺到MFC應(yīng)用和VBE集成之間的牽連,能感覺到VBE就像一個提供Automation的Server。于是我花了一些事件研究Automation,不知為何,我總懷戀老技術(shù),喜歡琢磨“過時”的東西。
            總感嘆Office系列軟件,如此無縫集成,毫無疑問,它的模型是非常清晰的,框架架構(gòu)出來的應(yīng)該就是模型,這種架構(gòu)技巧需要技術(shù)的積累。我曾經(jīng)下決心學(xué)習(xí)設(shè)計模式,每每都沉不住氣。當(dāng)我深入學(xué)習(xí)MFC各種應(yīng)用開發(fā)模型的時候,我明白了高人思維為何深邃,源于他們對MFC的深入探索。MFC在許多人眼里過時了,我談過的很多技術(shù)也有人指出落后了,我喜歡深入研究MFC,因為它里面有許多思想值得學(xué)習(xí)。

            Automation開發(fā)
            這里我以對話框應(yīng)用程序討論自動化,當(dāng)然象office那樣的大型軟件在app,mainframe,doc層面上都有。
            建立一個基于對話框的MFC應(yīng)用程序,注意選擇automation支持。簡單來說實現(xiàn)了IDispatch接口的類支持自動化。
            生成一個對話框類和一個對話框代理類,VBA里面也存在這種思想。一個C++類對象是死的,接口是活得,所以要是的應(yīng)用靈活,就必須為對象配備一個組件對象,外界可以通過組件接口操縱C++對象。
            Dlg類中有成員
            CAutomationServerDlgAutoProxy*?m_pAutoProxy;
            代理類中有成員
            CAutomationServerDlg*?m_pDialog;
            這個就稱為“對偶”設(shè)計模式吧!
            這個程序可以作為獨立程序啟動,也可以作為自動化服務(wù)啟動。
            為自動化接口添加屬性,為自動化控制(客戶程序)提供服務(wù):

            自動化屬性實現(xiàn):
            BOOL?CAutomationServerDlgAutoProxy::GetVisible()?
            {
            ????
            //?TODO:?Add?your?property?handler?here
            ????
            ????
            return?(m_pDialog!=NULL?&&?(m_pDialog->GetStyle()&WS_VISIBLE)!=0);
            }


            void?CAutomationServerDlgAutoProxy::SetVisible(BOOL?bNewValue)?
            {
            ????
            //?TODO:?Add?your?property?handler?here
            ????if(bNewValue?=?GetVisible())
            ????
            {
            ????????
            return;
            ????}

            ????
            //?visiable
            ????if(bNewValue)
            ????
            {
            ????????
            //?embed?start
            ????????if(m_pDialog?==?NULL)
            ????????
            {
            ????????????
            if(AfxGetThread()->m_pMainWnd?==?NULL)
            ????????????
            {
            ????????????????m_pDialog?
            =?new?CAutomationServerDlg();
            ????????????????AfxGetThread()
            ->m_pMainWnd?=?m_pDialog;
            ????????????}

            ????????????
            //?show?it
            ????????????m_pDialog->ShowWindow(SW_SHOWNORMAL);
            ????????}

            ????}

            ????
            else
            ????
            {
            ????????m_pDialog
            ->ShowWindow(SW_HIDE);
            ????}

            }

            BSTR?CAutomationServerDlgAutoProxy::GetWindowText()?
            {
            ????CString?strResult;
            ????
            //?TODO:?Add?your?property?handler?here
            ????m_pDialog->GetWindowText(strResult);
            ????
            return?strResult.AllocSysString();
            }


            void?CAutomationServerDlgAutoProxy::SetWindowText(LPCTSTR?lpszNewValue)?
            {
            ????
            //?TODO:?Add?your?property?handler?here
            ????m_pDialog->SetWindowText(lpszNewValue);
            }

            自動化注冊機制
            在自動化代理類里面有這樣一個宏聲明:
            ?
            IMPLEMENT_OLECREATE2(CAutomationServer2DlgAutoProxy,?"AutomationServer2.Application",?0xaa98c00e,?0xd46f,?0x4e9e,?0xaf,?0x97,?0xc8,?0x24,?0xa0,?0x29,?0xe4,?0xa4)
            看看IMPLEMENT_OLECREATE2的定義:
            #ifndef?IMPLEMENT_OLECREATE2
            #define?IMPLEMENT_OLECREATE2(class_name,?external_name,?l,?w1,?w2,?b1,?b2,?b3,?b4,?b5,?b6,?b7,?b8)?\
            ????AFX_DATADEF?COleObjectFactory?class_name::factory(class_name::guid,?\
            ????????RUNTIME_CLASS(class_name),?FALSE,?_T(external_name));?\
            ????
            const?AFX_DATADEF?GUID?class_name::guid?=?\
            ????????
            {?l,?w1,?w2,?{?b1,?b2,?b3,?b4,?b5,?b6,?b7,?b8?}?};
            #endif?//?IMPLEMENT_OLECREATE2
            具體注冊代碼是:
            COleObjectFactory::UpdateRegistryAll();
            但是這個函數(shù)似乎與上面的宏定義沒有關(guān)系,為了找到關(guān)系我進入UpdateRegistryAll函數(shù)內(nèi)部,發(fā)現(xiàn):
            for?(COleObjectFactory*?pFactory?=?pModuleState->m_factoryList;
            ????????pFactory?
            !=?NULL;?pFactory?=?pFactory->m_pNextFactory)
            ????
            {
            ????????
            if?(!pFactory->UpdateRegistry(bRegister))
            ????????
            {
            ????????????AfxUnlockGlobals(CRIT_OBJECTFACTORYLIST);
            ????????????
            return?FALSE;
            ????????}

            ????}
            原來模塊狀態(tài)記錄了所有類廠列表,為了找到類廠列表加入類廠位置,我搜索了mfc源碼,發(fā)現(xiàn)OLEFACT.cpp里面有這樣的代碼:
            COleObjectFactory::COleObjectFactory(REFCLSID?clsid,
            ????CRuntimeClass
            *?pRuntimeClass,?BOOL?bMultiInstance,?LPCTSTR?lpszProgID)
            {
            ????ASSERT(pRuntimeClass?
            ==?NULL?||
            ????????pRuntimeClass
            ->IsDerivedFrom(RUNTIME_CLASS(CCmdTarget)));
            ????ASSERT(AfxIsValidAddress(
            &clsid,?sizeof(CLSID),?FALSE));
            ????ASSERT(lpszProgID?
            ==?NULL?||?AfxIsValidString(lpszProgID));

            ????
            //?initialize?to?unregistered?state
            ????m_dwRegister?=?0;???//?not?registered?yet
            ????m_bRegistered?=?FALSE;
            ????m_clsid?
            =?clsid;
            ????m_pRuntimeClass?
            =?pRuntimeClass;
            ????m_bMultiInstance?
            =?bMultiInstance;
            ????m_lpszProgID?
            =?lpszProgID;
            ????m_bOAT?
            =?(BYTE)?OAT_UNKNOWN;

            ????
            //?licensing?information
            ????m_bLicenseChecked?=?FALSE;
            ????m_bLicenseValid?
            =?FALSE;

            ????
            //?add?this?factory?to?the?list?of?factories
            ????m_pNextFactory?=?NULL;
            ????AFX_MODULE_STATE
            *?pModuleState?=?_AFX_CMDTARGET_GETSTATE();
            ????AfxLockGlobals(CRIT_OBJECTFACTORYLIST);
            ????pModuleState
            ->m_factoryList.AddHead(this);
            ????AfxUnlockGlobals(CRIT_OBJECTFACTORYLIST);

            ????ASSERT_VALID(
            this);
            }
            原來類廠構(gòu)造函數(shù)里面把自己加入到模塊狀態(tài)的列表里面。
            現(xiàn)在總結(jié)一下:IMPLEMENT_OLECREATE2宏定義了一個類廠實例,在構(gòu)造的時候加入模塊狀態(tài)的類廠列表,然后在模塊初始化的時候,調(diào)用類廠的UpdateRegistry函數(shù)更新注冊表,實現(xiàn)注冊。

            Automation調(diào)用
            下面生成一個客戶程序控制AutomationServer,基于MFC對話框應(yīng)用程序。
            添加自動化程序產(chǎn)生的類型庫:添加類->從類型庫導(dǎo)入剛生成的tlb文件,向?qū)烧{(diào)用類。
            創(chuàng)建自動化組件,顯示自動化服務(wù)程序:
            if(m_ias.CreateDispatch("AutomationServer.Application"))
            {
            ????m_ias.SetVisible(TRUE);
            }

            通過按鈕事件設(shè)置服務(wù)器窗口標(biāo)題,演示調(diào)用服務(wù):
            void?CAutomationControlDlg::OnButtonSettext()?
            {
            ????
            //?TODO:?Add?your?control?notification?handler?code?here
            ????UpdateData();
            ????
            if(m_ias.m_lpDispatch)
            ????
            {
            ????????m_ias.SetWindowText(m_strText);
            ????}

            }


            void?CAutomationControlDlg::OnButtonGettext()?
            {
            ????
            //?TODO:?Add?your?control?notification?handler?code?here
            ????if(m_ias.m_lpDispatch)
            ????
            {
            ????????m_strText?
            =?m_ias.GetWindowText();
            ????????UpdateData(FALSE);
            ????}

            }

            下面是截圖
            控制啟動激活自動化服務(wù)程序:

            調(diào)用自動化服務(wù)功能


            代碼下載
            posted on 2006-08-31 20:33 萬連文 閱讀(4354) 評論(7)  編輯 收藏 引用 所屬分類: MFC

            FeedBack:
            # re: MFC應(yīng)用集成老技術(shù)自動化(Automation)
            2006-08-31 20:57 | 漂舟
            好文 ,
            “一直喜歡講體系,學(xué)習(xí)技術(shù),總是想把握住整個體系”,
            支持這一點,這段時間沒做項目,
            潛心在做研究 ?
            程序我沒看,只看你文字介紹就相當(dāng)不錯了,
            今天從辦公室才回來一會,
            邊吃方便面邊看,  回復(fù)  更多評論
              
            # re: MFC應(yīng)用集成老技術(shù)自動化(Automation)
            2006-08-31 21:01 | 漂舟
            “逐漸淪為代碼機器,
            不敢于改革自己現(xiàn)有的編程模式,
            把思維禁錮在一個很小的范圍”
            偶深有感觸,差點就變成這種類型的Coder了,
            每天為了快速完成特定的業(yè)務(wù),沒精力研究其它更多的東西,
            只有在晚上下班后,疲倦了都還要強堅持看書,
            羨慕你,經(jīng)常做做研究,學(xué)學(xué)宏觀的東西,
            真爽
              回復(fù)  更多評論
              
            # re: MFC應(yīng)用集成老技術(shù)自動化(Automation)
            2006-08-31 21:29 | 萬連文
            現(xiàn)在不知道是工作還是學(xué)習(xí),可能都算,在北京遇到一個編程前輩,指點我,現(xiàn)在主要做MFC/ATL/.NET/ActiveX混合編程框架,有時間我就搞點古老玩意。  回復(fù)  更多評論
              
            # re: MFC應(yīng)用集成老技術(shù)自動化(Automation)
            2006-08-31 21:58 | 漂舟
            得到"編程前輩“的指點,
            這一點太好了啊,
            可以在宏觀上、大的策略上,或者編程之路上少走點彎路,
            或走上條”捷徑“,
            我一直想找機會擺脫當(dāng)前環(huán)境,
            想找個有能人的地方,好好學(xué)學(xué),
            我們公司是私人性質(zhì)的小公司,
            我在里面都還算是軟件項目"帶頭大哥",真慚愧,
            你機遇比較好,再加上勤奮,
            前途無量,
            女朋友也會有更好的 :)

            我喜歡看MFC源碼 ,這段時間比較多的在研究C++各項技術(shù)  回復(fù)  更多評論
              
            # re: MFC應(yīng)用集成老技術(shù)自動化(Automation)
            2006-08-31 22:14 | 萬連文
            注意利用MFC、.NET等向?qū)W(xué)習(xí)技術(shù),注意學(xué)會利用MSDN學(xué)習(xí)技術(shù)、注意向身邊有思想的人學(xué)習(xí)技術(shù)是我總結(jié)的學(xué)習(xí)技術(shù)的方法。2004年10月8日進入公司做項目,掐指一算快2年,對自己技術(shù)的提高還算滿意。深刻體會到一句話:編程不扎實做上十年根本無法談上技術(shù)大師。MFC的Frame框架、文檔視圖、控制條等源碼部分都值得反復(fù)學(xué)習(xí)。  回復(fù)  更多評論
              
            # re: MFC應(yīng)用集成老技術(shù)自動化(Automation)
            2006-08-31 23:27 | 漂舟
            ”注意向身邊有思想的人學(xué)習(xí)技術(shù)“,
            同感,特別是那些經(jīng)驗老道的程序員,
            或系統(tǒng)分析員,項目開發(fā)總設(shè)計師,
            只是我周圍的生活圈,
            像這類的長者太少了。  回復(fù)  更多評論
              
            # re: MFC應(yīng)用集成老技術(shù)自動化(Automation)
            2008-12-24 11:04 | lijinyan3000
            好,寫的相當(dāng)好!!!  回復(fù)  更多評論
              
            簡歷下載
            聯(lián)系我

            <2011年5月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久久噜噜噜久久中文福利| 无码伊人66久久大杳蕉网站谷歌 | 久久精品国产亚洲AV蜜臀色欲 | 很黄很污的网站久久mimi色| 久久久久亚洲精品中文字幕| 成人久久免费网站| 国产精品天天影视久久综合网| 久久精品国产72国产精福利| 狠狠综合久久综合88亚洲| 亚洲国产精品久久久久婷婷软件| 久久久久久久免费视频| 久久亚洲国产中v天仙www| 久久婷婷午色综合夜啪| 91精品国产综合久久四虎久久无码一级| 久久久久18| 爱做久久久久久| www久久久天天com| 午夜精品久久久久久毛片| 一级做a爰片久久毛片看看 | 久久久久国产精品三级网| 久久久久久亚洲精品成人| 一97日本道伊人久久综合影院| 久久精品国产秦先生| 久久综合综合久久综合| 日本WV一本一道久久香蕉| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 久久一区二区免费播放| 91精品国产91久久久久久蜜臀| 久久精品国产久精国产果冻传媒| 久久国产精品波多野结衣AV | 久久国产精品一区二区| 久久精品中文无码资源站| 色播久久人人爽人人爽人人片AV| 久久亚洲av无码精品浪潮| 久久久久噜噜噜亚洲熟女综合| 国产成人久久精品麻豆一区| 91久久香蕉国产熟女线看| 国产精品永久久久久久久久久| 一级做a爰片久久毛片人呢| 日本精品久久久中文字幕| 亚洲国产成人久久精品影视|