windows ce嵌入式高級編程及其實例詳解_第1頁
windows ce嵌入式高級編程及其實例詳解_第2頁
windows ce嵌入式高級編程及其實例詳解_第3頁
windows ce嵌入式高級編程及其實例詳解_第4頁
windows ce嵌入式高級編程及其實例詳解_第5頁
已閱讀5頁,還剩39頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

15COM提COM什么是 COMCOMCOM展MIDL指向虛函數(shù)表(該函數(shù)表就成了一組函數(shù)指針的集合),每個函數(shù)指針指向‘'COM的語言,都可以對接口進行描述 分別為AddRef,ReleaseRef年1]QueryInterface,這些方法用于實現(xiàn)COM對象計數(shù)和A接口ACOM接口ACOM接口AoCOMlkl。 —Funb20{j-FunBl(){..Vtable(一FunA20{-FunAl0{..COMVtable(根據(jù)COM規(guī)范所建立的應用都是基于/Server模型的。一個完整的COM應用括以下幾個部分:COMCOMCOM客戶程序:COM客戶程序通知COM庫,向COM庫要調(diào)用的COM對象的GUID或lIDCOM對象的DLL(以后客戶就同該DLL交互)客戶程序調(diào)用dll接口方法存根dll接收來自du的數(shù)據(jù)包和散集(Unmarshalling),并發(fā)送給組件程序存根dll列集(marshalling),發(fā)送給DLL能成功能以及可視化支持。由于ATL的內(nèi)容非常多,因此本書只對ATL進行一個式的介ATLCOMMFCCOM,MFCclasSATL—N0—VTABLEpublicCComObjectRootEx<ccomMultiThreadModel>,publiCCComCOClass<CSimple,&CLSID_Simple>,publicIDispatch工mpl<工Simple,&IID—ISimple, {{}DECLARE—REGISTRY—RESOURCEID(IDR—SIMPLE)DECLARE—PROTECT—FINAL—BEGIlUOM_MISimple13CSimple·CComObjectRootExCComCoClassWindowsCECComMultiThreadModeltemte<classconstCLSID+pclsid2&CLSID—Class參數(shù)TCOMpclsidCOM·IDispatchlmpl為了在語言環(huán)境中使用COM組件,COM規(guī)范規(guī)定:需要在語言環(huán)境中使用的COMIDispatchCOMCOMIDispatchIDispatchIUnknown13派生時,此COM組件才可以在不支持指針及語言環(huán)境下使用。CSimple類繼承·COMCOM(QueryInterface)。用戶想多少個接口,就要寫多少個COMINTERFACEENTRY宏,ATL會自動用這些生成一個名為ATLINTMAPENTRY的接口表,然后在CComObjectRootBaseIntemalQueryInterfaceQueryInterface15-2.2ATLCOM在這個例子里,將使用ATL創(chuàng)建一個簡單的 提供ISimple接口,并通過 Server,如圖l5—擇“動態(tài)庫(DLL)”,附加選項選擇“支持MFC”復選框項目類型哩 梗扳遼 i!}麓VisuLlC++分布式系統(tǒng)解決方vi=t11Stmdl0 ¨le和苴他基于且D、ref㈣prF¨、 1啞) 1確定ll取捎座甩程序設 0可執(zhí)行文件旺xE)哩翻辮F座甩程序設 0可執(zhí)行文件旺xE)哩翻辮F ,j’‘4。動 庫鋤工)哩樊別《 模授旺 lli;Vi弭dC++添加簡單韻活動橇~鶼n9$tadi*已安羹膩溯麓隰者霄^TLSet~teb服務 麴ATL雕f生 弱^TL性能監(jiān)視囂對口ATLOIJzDB提供看 滴ATLActiv…SetrPi‘t蛆件矧ATLCOg+10組件 ?!?={豳墅噍:|二:l廠瓦襯 接口0$教重哩0兩者 一。r》『$㈣ 支持0兩者 一。r》『$㈣ 支持 移是嘿 …mm?!雓。。m 匪三至刁j[耍[][重 windowscEc++——_●-———--——_●I-_-—— — ——屬性l也就是通過我們自身的線程同步來確保組件的安全3COMCOMCOM4ISupportErrorlnf0COM屬性5——是否支持連接點。如果選中此接口,那么向?qū)⑸梢粓Dl5.8就是為接口添加方法的框界面,只需要在MethodName輸入框中輸ShowSvrMs9,ShowSvrMs9方法將簡單地彈出一個框,該方法的實現(xiàn)代碼如程序15.1所示/+★★★★★★★★★★★★★★★★★★★★★★★★★★程序l5—STDMETHODIMPCSimple:ShowSvrMsg(){女女//TOD0:Addyourimplemenationcode:MessageBox(NULL圖I5-8編譯此工程并部署到模擬器后,VS2005會自動Server 用程序,編譯環(huán)境設置為Windows6ProfessionalSDK(ARMV4I),設擇CHSWindows6ClassicEmulator,把窗口字體改成宋體小五號將上面創(chuàng)建的Server工程生成的DLL添加到stdAfx.h#import”D:\\refer c++開發(fā)WINDOWS應用程 \\\\ Server\\Windows6ProfesSional 以上語句中 Server項目的編 ,讀者應該將 修改為自己。碼如程序l5.2所示。/+*++**++***++**+***+*+*+***程序l5- Dl9:0nBnClickedBtnCall(){HRESULThr;CLSID★*★★★*★★★★★★K★0★—★S★★n★r★U★t★e★r★女WindowsCEc+ hr=CoInitializeEx(NULL,COINIT {gotO)ISimpleCOMCoCreateInstance(clSid,NULL,CLSCTXINPROCSERVER, {gotoerrorjISimplee{}}/至此,客戶端調(diào)用WindowsCEComserver示例就編寫完成了。編譯到模擬器中,15—915-9COM15。3.1COMCOM 接口”(outgoinginterface如果一個COM對象支持一個和多個出接口,那么稱這樣的對象為可連接對象“出接口”與“入接口”有本質(zhì)的區(qū)別,“入接口”是由COM用此接口指針來與客戶程序進行通信在客戶程序方實現(xiàn)這些接口的對象稱之“(sink),本身也是一個COM對象,但它往往比較簡單,負責處理組件接可連接對象支持多個出接口,且每個出接口支持與多個連接l5.11 WindowsCEC++客戶把的 ,COMCOM收器并不需要CLSID來標識的標識和創(chuàng)建過程完全是客戶程序內(nèi)部的事情。對于客, er)IConnectionPoinContainer,&pConnectioPointContain 客戶端保存連接標識dw,以便以后斷開連接時使用。當客戶端要取消連接時,需要先調(diào)用pConnectionPointoUnadvise(dw)斷與15.3.2連接點示 使用VS2005IVC++新建一個智能設備IATL智能設備項目 境設置為Windows6ProfessionalSDK(ARMV4I)設備環(huán)境選擇CHSWindows6ClassicEmulator,,IAddAdd(LONGa,LONGb)方法。關于為一個接口添加方法的操,15-12IAddAdd(inta,intb)備注:在類視圖中,IAddEvents接口 l5.14J圖 為一IAddEvents接口添加ExecutionOver(LONGLresult)方表中單“完成按鈕便實現(xiàn)了連接點此時C類被生成并EventsFireExecutionOver(LONGIResult)COM口?,F(xiàn)在來實現(xiàn)原始IAdd接口中的Add方法。Add方法實現(xiàn)如程序15.3所示/+★★★★★★★★★★★★★★★★★★★★★★★★★+程序清單l5—CAdd:Add(LONG{AFXMANAGESTATE(AfxGetStaticModuleState())jreturnS——0K;}/至此,帶連接點的ATLCOM組件就實現(xiàn)完畢了。讀者最后可以編譯本項目并部署到模擬器中,VS2005的部署工具將自動.dll組件。2.編寫客戶端,調(diào)用帶連接點的COM使用VS20051VC++1智能設備IMFC智能設備應用程序向?qū)?chuàng)建一個基于框的應用程序Connection編譯環(huán)境設置為Windows6ProfessionalSDK(ARMV4I),備選擇CHSWindows6ClassicEmulator,把窗口字體改成宋體小五號設計框,界面如圖l5一l6所示表 框上的主要控件及其屬性IDC——EDT——輸入框,用于輸入數(shù)字l,對應成員變量m_numberl,類型IDC—輸入框,用于輸入數(shù)字2,對應成員變量m—number2,類型IDC——BTN——按鈕,標題設為“執(zhí)行”。用于調(diào)用上面創(chuàng)建 中的 WindowsCEc++實翌三———————— .h文件。代碼如下:onC0對m象,h"mdwRefCount M的計數(shù),接著在Csink類中定義一個私有變量一 ,用十cu 凋r豕剴々I川‘l鰍’DwORDmdwRefCount;//計數(shù)變。(4)添加。衄 組件的相關GUID定義。打開conilectionC。m工程中的ox7C20780D0x056A0x484C,c。 tuxHu’uxLD7u^帥玼HRESULT p+/DISPID+/REFIID+/LCID+/WORDwFlags, RPC RPC RPCFAR+—FAR+pDispParams,116.IAddEventsGetTypeInfoCountHRESULTSTDMETHODCALLTYPEGetTypeInfoCountHRESULTSTDMETHODCALLTYPEGetTypeInfof卜in]+/UINTiTInf0,in]+/LCIDicid, HRESULTSTDMETHODCALLTYPEGetIDsOfNameS/+【in]+/REFIID/+[Size RPC/+[in】+/UINT/+【in】+/LCID/+【SizeiS][out]+/DISPIDRPC此8個函數(shù)的具體實現(xiàn)代碼如程序15.4所示/★★★★★★★★★★★★★★★★★★★★★★★★★★★程序l5—CSink:ExecutionOver(LONG{CStringreturnS_OKCSink.QueryInterface(REFIID m windowscEc++——————————————————————————————————————returnS—OK;)iffiid==IID{mreturnS—OK;}returnENOINTERFACE}//3.IAddEventsAddRefULONGSTDMETHODCALl.TYPECSink:AddRef(){mreturnmdwRe}//4.IAddEventsReleaseULONGSTDMETHODCALLTYPECSink:Release(){-ULONG1=mdwRefCountjif(0==mdwRefCount)deletethiS;return//5.InvokeHRESULTSTDMETHODCALLTYPECSink:Invoke(+/DISPID+/REFIID+/LCID+/WORD RPC+/VARIANTRPC RPC RPCFAR+rgErrl{//ExecutionOvercase{LONGiResult=(pDispParamsrgvarg)一>iValj}returnDISPE}HRESULTSTDMETHODCALLTYPECSink:GetTypeInfoCount({returnS}HRESULTSTDMETHODCALLTYPECSink:GetTypeInfo(/+[in]+/UINT/+[in]+/LCID/+【 (retUrnS)pCSikGetIDsOfNameS(in]+/REFIIDriid,sizeiS【in】+/LPOLESTR RPCFAR+rgszNames, in]+/uINTcNames,in】+/LCIDicid,/+【Sizeis】 RPC{returnS——}/(6)為框上的“執(zhí)行”按鈕添加單擊代碼。單擊此按鈕,將實現(xiàn)執(zhí)行加法操作的功能,單擊的實現(xiàn)代碼如程序l5.5所示。/+★★★★★★★★★★★★★★★★★★★★★★★★★★程序l5—//執(zhí)行按鈕單擊,調(diào)用IAdd的Add方VOidCConnectionDl9:0nBnClickedBtnExeC(){HRESULThrj DWORDdwAdvise;hr=CoInitializeEx(NULL,COINITIAddCOMhr=pAdd.CoCreateInstance(CLSIDAdd);ASSERT(hr==SOK);//判斷IAdd接口是否有連接點,并得到連接點容器對hr=pCPC一>FindConnectionPoint(DIID //從CSink類創(chuàng)建接點通知對象psink=newCSink()j一hr=pCP-IAddAddpAdd->Add(mnumberl,m—number2)jpCPUnadvise(dwAdvise)jpCPRelease();)/此外,還需要在ConnectionDl9.cpp文件中CSink的定義文件。 //forourCSinkclass至此,連接點客戶端測試程序就編寫完成了。在運行客戶端測試程序之前,應確保對象已經(jīng)被成功到模擬器上在運行客戶端程序時分別輸入數(shù)字 ActiveX 技vC++通常提供MFC和ATL(ActiveXTemteLibrary)兩個途徑來開發(fā)ActiveX控件使但是生成的控件將比較大。而且,客戶端如果要運行此ActiveXMFCMFCCOMOLEMFCActiveXMFCActiveXMFCActiveXControlWizardCMyNameCtrl WindowsCEc++控件后,將使用VC++編寫一個客戶端程序,來演示如何在WindowsCE下ActiveX控稱設為MyCEActiveX,然后按照默認設置完成向?qū)?。將編譯環(huán)境設置為Windows6ProfessionalSDK(ARMV4I),設備環(huán)境選擇CHSWindows6ClassicEmulator。ActiveXl5.18圖15.I8MFCClassWizard圖15-19“添加屬性向?qū)А眑5.20 CString修改屬性實現(xiàn)代碼,代碼如程序l5—6所示/★★★★★★★★★★★★★★★★★★★★★★★★★★★程序l5—BSTRCMyCEActiveXCtr:GetMsgConte×t(void)freturnMsgContextCMyCEctiveXCtrl:SetMsgContext(LPCTSR{{mMsgContext2newValj1/添加ShowMessage方法實現(xiàn)代碼,代碼片段如程序l5-7所示 /+★★★★★★★★★★★★★★★★★★★★★★★★★+程序清單l5—voidCMyCEActiveXtrlShowMessage(){)/IDCEDTMSGm_Ms9,CStrin9。這里還需要修改CMyCEActiveXPropPage:DoDataExchangecMycEActivexPopPage:DDataExchangeCMyCEActiveXropPageDoDa DDX—Text(pDX,IDC—EDT_MSG,m_Msg);DDP—}MsgContext加MsgContext的值發(fā)生變化而觸發(fā)OnMsgChange,其代碼如程序l5-8所示/+★★★★★★★★★★★★★★★★★★★★★★★★★★程序l5—Ili2置MsgContext屬 CMyCEActiveXCtrlSetMsgCon1AFX_MANAGE—if(m{m }}礦 歡迎使用器加向/名稱妲 婁墨內(nèi)部名稱0胡;西h啦 常用0圳:西h姐ts參數(shù)糞擻哩 參數(shù)名嘿) 蜮。圖l5.22“添加向?qū)А苯鏏ctiveXWindowsCEActiveX用程序MyCEActiveX編譯環(huán)境設置為TestWindows6Professional設備環(huán)境選擇CHSWindows6ClassicEmulator,把窗口字體改成宋體小五號。注意:在向?qū)Э蛑?,一定要選中“ActiveX控件”復選框,表示應用程序支持MyCEActiveX從以下來嘏添加婁 keti0表哩)$文件哩) A’eti 類G)tCD_虻Ektlve肛yent |}l}

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論