




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
15COM提COM什么是 COMCOMCOM展MIDL指向虛函數(shù)表(該函數(shù)表就成了一組函數(shù)指針的集合),每個(gè)函數(shù)指針指向‘'COM的語言,都可以對(duì)接口進(jìn)行描述 分別為AddRef,ReleaseRef年1]QueryInterface,這些方法用于實(shí)現(xiàn)COM對(duì)象計(jì)數(shù)和A接口ACOM接口ACOM接口AoCOMlkl。 —Funb20{j-FunBl(){..Vtable(一FunA20{-FunAl0{..COMVtable(根據(jù)COM規(guī)范所建立的應(yīng)用都是基于/Server模型的。一個(gè)完整的COM應(yīng)用括以下幾個(gè)部分:COMCOMCOM客戶程序:COM客戶程序通知COM庫,向COM庫要調(diào)用的COM對(duì)象的GUID或lIDCOM對(duì)象的DLL(以后客戶就同該DLL交互)客戶程序調(diào)用dll接口方法存根dll接收來自du的數(shù)據(jù)包和散集(Unmarshalling),并發(fā)送給組件程序存根dll列集(marshalling),發(fā)送給DLL能成功能以及可視化支持。由于ATL的內(nèi)容非常多,因此本書只對(duì)ATL進(jìn)行一個(gè)式的介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派生時(shí),此COM組件才可以在不支持指針及語言環(huán)境下使用。CSimple類繼承·COMCOM(QueryInterface)。用戶想多少個(gè)接口,就要寫多少個(gè)COMINTERFACEENTRY宏,ATL會(huì)自動(dòng)用這些生成一個(gè)名為ATLINTMAPENTRY的接口表,然后在CComObjectRootBaseIntemalQueryInterfaceQueryInterface15-2.2ATLCOM在這個(gè)例子里,將使用ATL創(chuàng)建一個(gè)簡單的 提供ISimple接口,并通過 Server,如圖l5—擇“動(dòng)態(tài)庫(DLL)”,附加選項(xiàng)選擇“支持MFC”復(fù)選框項(xiàng)目類型哩 梗扳遼 i!}麓VisuLlC++分布式系統(tǒng)解決方vi=t11Stmdl0 ¨le和苴他基于且D、ref㈣prF¨、 1啞) 1確定ll取捎座甩程序設(shè) 0可執(zhí)行文件旺xE)哩翻辮F座甩程序設(shè) 0可執(zhí)行文件旺xE)哩翻辮F ,j’‘4。動(dòng) 庫鋤工)哩樊別《 模授旺 lli;Vi弭dC++添加簡單韻活動(dòng)橇~鶼n9$tadi*已安羹膩溯麓隰者霄^TLSet~teb服務(wù) 麴ATL雕f生 弱^TL性能監(jiān)視囂對(duì)口ATLOIJzDB提供看 滴ATLActiv…SetrPi‘t蛆件矧ATLCOg+10組件 ?!?={豳墅噍:|二:l廠瓦襯 接口0$教重哩0兩者 一。r》『$㈣ 支持0兩者 一。r》『$㈣ 支持 移是嘿 …mm?!雓。。m 匪三至刁j[耍[][重 windowscEc++——_●-———--——_●I-_-—— — ——屬性l也就是通過我們自身的線程同步來確保組件的安全3COMCOMCOM4ISupportErrorlnf0COM屬性5——是否支持連接點(diǎn)。如果選中此接口,那么向?qū)⑸梢粓Dl5.8就是為接口添加方法的框界面,只需要在MethodName輸入框中輸ShowSvrMs9,ShowSvrMs9方法將簡單地彈出一個(gè)框,該方法的實(shí)現(xiàn)代碼如程序15.1所示/+★★★★★★★★★★★★★★★★★★★★★★★★★★程序l5—STDMETHODIMPCSimple:ShowSvrMsg(){女女//TOD0:Addyourimplemenationcode:MessageBox(NULL圖I5-8編譯此工程并部署到模擬器后,VS2005會(huì)自動(dòng)Server 用程序,編譯環(huán)境設(shè)置為Windows6ProfessionalSDK(ARMV4I),設(shè)擇CHSWindows6ClassicEmulator,把窗口字體改成宋體小五號(hào)將上面創(chuàng)建的Server工程生成的DLL添加到stdAfx.h#import”D:\\refer c++開發(fā)WINDOWS應(yīng)用程 \\\\ Server\\Windows6ProfesSional 以上語句中 Server項(xiàng)目的編 ,讀者應(yīng)該將 修改為自己。碼如程序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如果一個(gè)COM對(duì)象支持一個(gè)和多個(gè)出接口,那么稱這樣的對(duì)象為可連接對(duì)象“出接口”與“入接口”有本質(zhì)的區(qū)別,“入接口”是由COM用此接口指針來與客戶程序進(jìn)行通信在客戶程序方實(shí)現(xiàn)這些接口的對(duì)象稱之“(sink),本身也是一個(gè)COM對(duì)象,但它往往比較簡單,負(fù)責(zé)處理組件接可連接對(duì)象支持多個(gè)出接口,且每個(gè)出接口支持與多個(gè)連接l5.11 WindowsCEC++客戶把的 ,COMCOM收器并不需要CLSID來標(biāo)識(shí)的標(biāo)識(shí)和創(chuàng)建過程完全是客戶程序內(nèi)部的事情。對(duì)于客, er)IConnectionPoinContainer,&pConnectioPointContain 客戶端保存連接標(biāo)識(shí)dw,以便以后斷開連接時(shí)使用。當(dāng)客戶端要取消連接時(shí),需要先調(diào)用pConnectionPointoUnadvise(dw)斷與15.3.2連接點(diǎn)示 使用VS2005IVC++新建一個(gè)智能設(shè)備IATL智能設(shè)備項(xiàng)目 境設(shè)置為Windows6ProfessionalSDK(ARMV4I)設(shè)備環(huán)境選擇CHSWindows6ClassicEmulator,,IAddAdd(LONGa,LONGb)方法。關(guān)于為一個(gè)接口添加方法的操,15-12IAddAdd(inta,intb)備注:在類視圖中,IAddEvents接口 l5.14J圖 為一IAddEvents接口添加ExecutionOver(LONGLresult)方表中單“完成按鈕便實(shí)現(xiàn)了連接點(diǎn)此時(shí)C類被生成并EventsFireExecutionOver(LONGIResult)COM口。現(xiàn)在來實(shí)現(xiàn)原始IAdd接口中的Add方法。Add方法實(shí)現(xiàn)如程序15.3所示/+★★★★★★★★★★★★★★★★★★★★★★★★★+程序清單l5—CAdd:Add(LONG{AFXMANAGESTATE(AfxGetStaticModuleState())jreturnS——0K;}/至此,帶連接點(diǎn)的ATLCOM組件就實(shí)現(xiàn)完畢了。讀者最后可以編譯本項(xiàng)目并部署到模擬器中,VS2005的部署工具將自動(dòng).dll組件。2.編寫客戶端,調(diào)用帶連接點(diǎn)的COM使用VS20051VC++1智能設(shè)備IMFC智能設(shè)備應(yīng)用程序向?qū)?chuàng)建一個(gè)基于框的應(yīng)用程序Connection編譯環(huán)境設(shè)置為Windows6ProfessionalSDK(ARMV4I),備選擇CHSWindows6ClassicEmulator,把窗口字體改成宋體小五號(hào)設(shè)計(jì)框,界面如圖l5一l6所示表 框上的主要控件及其屬性IDC——EDT——輸入框,用于輸入數(shù)字l,對(duì)應(yīng)成員變量m_numberl,類型IDC—輸入框,用于輸入數(shù)字2,對(duì)應(yīng)成員變量m—number2,類型IDC——BTN——按鈕,標(biāo)題設(shè)為“執(zhí)行”。用于調(diào)用上面創(chuàng)建 中的 WindowsCEc++實(shí)翌三———————— .h文件。代碼如下:onC0對(duì)m象,h"mdwRefCount M的計(jì)數(shù),接著在Csink類中定義一個(gè)私有變量一 ,用十cu 凋r豕剴々I川‘l鰍’DwORDmdwRefCount;//計(jì)數(shù)變。(4)添加。衄 組件的相關(guān)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個(gè)函數(shù)的具體實(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í)行”按鈕添加單擊代碼。單擊此按鈕,將實(shí)現(xiàn)執(zhí)行加法操作的功能,單擊的實(shí)現(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接口是否有連接點(diǎn),并得到連接點(diǎn)容器對(duì)hr=pCPC一>FindConnectionPoint(DIID //從CSink類創(chuàng)建接點(diǎn)通知對(duì)象psink=newCSink()j一hr=pCP-IAddAddpAdd->Add(mnumberl,m—number2)jpCPUnadvise(dwAdvise)jpCPRelease();)/此外,還需要在ConnectionDl9.cpp文件中CSink的定義文件。 //forourCSinkclass至此,連接點(diǎn)客戶端測(cè)試程序就編寫完成了。在運(yùn)行客戶端測(cè)試程序之前,應(yīng)確保對(duì)象已經(jīng)被成功到模擬器上在運(yùn)行客戶端程序時(shí)分別輸入數(shù)字 ActiveX 技vC++通常提供MFC和ATL(ActiveXTemteLibrary)兩個(gè)途徑來開發(fā)ActiveX控件使但是生成的控件將比較大。而且,客戶端如果要運(yùn)行此ActiveXMFCMFCCOMOLEMFCActiveXMFCActiveXMFCActiveXControlWizardCMyNameCtrl WindowsCEc++控件后,將使用VC++編寫一個(gè)客戶端程序,來演示如何在WindowsCE下ActiveX控稱設(shè)為MyCEActiveX,然后按照默認(rèn)設(shè)置完成向?qū)?。將編譯環(huán)境設(shè)置為Windows6ProfessionalSDK(ARMV4I),設(shè)備環(huán)境選擇CHSWindows6ClassicEmulator。ActiveXl5.18圖15.I8MFCClassWizard圖15-19“添加屬性向?qū)А眑5.20 CString修改屬性實(shí)現(xiàn)代碼,代碼如程序l5—6所示/★★★★★★★★★★★★★★★★★★★★★★★★★★★程序l5—BSTRCMyCEActiveXCtr:GetMsgConte×t(void)freturnMsgContextCMyCEctiveXCtrl:SetMsgContext(LPCTSR{{mMsgContext2newValj1/添加ShowMessage方法實(shí)現(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)境設(shè)置為TestWindows6Professional設(shè)備環(huán)境選擇CHSWindows6ClassicEmulator,把窗口字體改成宋體小五號(hào)。注意:在向?qū)Э蛑?,一定要選中“ActiveX控件”復(fù)選框,表示應(yīng)用程序支持MyCEActiveX從以下來嘏添加婁 keti0表哩)$文件哩) A’eti 類G)tCD_虻Ektlve肛yent |}l}
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 品牌租賃合同范本
- 后補(bǔ)合同范本范文
- 合同范本 兩甲方
- 變更房屋合同范本
- 合伙合同范本在
- 吉利汽車訂購合同范本
- 加工洗沙合同范本
- 公司司機(jī)簡易合同范例
- 合同范本購貨合
- 賣車合同范本
- 期末測(cè)試模擬卷(試題)-2023-2024學(xué)年五年級(jí)下冊(cè)數(shù)學(xué)人教版
- 用藥安全課件教學(xué)課件
- 2024智能家居行業(yè)創(chuàng)新發(fā)展與前景展望研究報(bào)告
- (人教PEP2024版)英語一年級(jí)上冊(cè)Unit 5 教學(xué)課件(新教材)
- 腰椎術(shù)后失敗綜合征
- 廣告學(xué)概論課件
- 可上傳班級(jí)管理(一到三章)李學(xué)農(nóng)主編
- 貴州人民版五年級(jí)勞動(dòng)下冊(cè)全冊(cè)教案
- 2024年高考英語易錯(cuò)題 閱讀理解:推理判斷題4大陷阱(教師版新高考專用)
- 醫(yī)院環(huán)境衛(wèi)生學(xué)監(jiān)測(cè)和院感控制課件
- 《力與形變》教學(xué)課件(一)
評(píng)論
0/150
提交評(píng)論