COM原理及代碼實例_第1頁
COM原理及代碼實例_第2頁
COM原理及代碼實例_第3頁
COM原理及代碼實例_第4頁
COM原理及代碼實例_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

COM原理COM基本概念介紹1.什么是COM(ComponentObjectModal)COM(ComponentObjectModal)是Microsoft組件對象模型的簡稱。是一個說明如何建立可動態(tài)交替更新組件的規(guī)范。簡單地說,COM是一種跨應(yīng)用和語言共享二進(jìn)制代碼的方法。與C++不同,它提倡源代碼重用。ATL便是一個很好的例證。源碼級重用雖然好,但只能用于C++。它還帶來了名字沖突的可能性,更不用說不斷拷貝重用代碼而導(dǎo)致工程膨脹和臃腫。2.COM組件COM組件是由以Win32動態(tài)鏈接庫(DLL)或可執(zhí)行文件(EXE)發(fā)布的代碼所組成。3.為什么要學(xué)習(xí)COM傳統(tǒng)的軟件開發(fā)模式:傳統(tǒng)的軟件應(yīng)用程序發(fā)布以后,使用者想得到更完善的軟件或者去掉其中的某些內(nèi)容,只有等軟件提供商發(fā)布新的版本以后,使用者的這一夢想才能得以實現(xiàn)。使用COM組件以后:軟件開發(fā)人員可以在軟件版本發(fā)布以后修改或者去掉軟件某個不需要部分。也及應(yīng)用程序在更高的層次上定制,使得軟件更具靈活性、動態(tài)性。是未來應(yīng)用軟件開發(fā)的趨勢。4.COM的前身是OLE(ObjectLinkingandEmbedding)對象鏈接與嵌入。5.組件:如積木一樣,具有“塊”的概念,可以動態(tài)的將他們插入或卸出應(yīng)用程序。這就需要兩個條件:第一,組件必須動態(tài)鏈接(不因自己的位置改變而改變自身形式);第二,組件必須隱藏內(nèi)部實現(xiàn)細(xì)節(jié)(獨立與具體編程語言,二進(jìn)制形式發(fā)布)。每個組件相當(dāng)于一個黑盒子,對外提供的只是接口(函數(shù))。如果接口沒有發(fā)生任何變化時,對組件的修改幾乎不會影響應(yīng)用程序的其它部分。提供服務(wù)的組件稱為服務(wù)器組件,使用服務(wù)的組件稱為客戶組件。完整的COM組件的接口實現(xiàn)實例#include<iostream>#include<objbase.h>usingnamespacestd;voidtrace(constchar*pMsg){ cout<<pMsg<<endl;}//抽象接口1interfaceInteX{ virtualvoid_stdcallFx1()=0; virtualvoid_stdcallFx2()=0;};//抽象接口2interfaceInteY{ virtualvoid_stdcallFy1()=0; virtualvoid_stdcallFy2()=0;};//抽象接口實現(xiàn)classCompA:publicInteX,publicInteY{public: //實現(xiàn)接口InteX virtualvoid_stdcallFx1() { cout<<"CompA::Fx1"<<endl; } virtualvoid_stdcallFx2() { cout<<"CompA::Fx2"<<endl; } //實現(xiàn)接口InteY virtualvoid_stdcallFy1() { cout<<"CompA::Fy1"<<endl; } virtualvoid_stdcallFy2() { cout<<"CompA::Fy2"<<endl; }};//客戶程序intmain(){ trace("客戶:創(chuàng)建組件的一個實例。"); CompA*pcompa=newCompA; trace("CompA()::QueryInterface:返回指向InteY的指針."); *ppv=static_cast<InteY*>(this); } else { trace("CompA()::QueryInterface:接口不支持."); *ppv=NULL; returnE_NOINTERFACE; } reinterpret_cast<IUnknown*>(*ppv)->AddRef(); returnS_OK;}ULONGSTDMETHODCALLTYPECompA::AddRef(){ cout<<"CompA()::AddRef="<<m_cRef++:增加接口引用計數(shù)<<'.'<<endl; returnm_cRef;}ULONGSTDMETHODCALLTYPECompA::Release(){ cout<<"CompA()::Release="<<m_cRef--減少接口引用計數(shù)<<'.'<<endl; if(0==m_cRef) { deletethis; return0; } returnm_cRef;}//創(chuàng)建實例函數(shù)IUnknown*CreateInstance(){ IUnknown*pinte=static_cast<InteX*>(newCompA); pinte->AddRef(); returnpinte;}//IIDsconstIIDIID_InteX={0x32bb832c,0xb41a,0x11cf,{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}};constIIDIID_InteY={0x32bb832d,0xb41a,0x11cf,{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}};constIIDIID_InteZ={0x32bb832e,0xb41a,0x11cf,{0xa6,0xbb,0x0,0x80,0xc7,0xb2,0xd6,0x82}};//客戶程序intmain(){ HRESULThr; trace("客戶:獲得IUnknown的一個指針"); IUnknown*piunknown=CreateInstance(); trace("客戶:獲得InteX的接口"); InteX*pintex=NULL; hr=piunknown->QueryInterface(IID_InteX,(void**)&pintex); if(SUCCEEDED(hr)) { trace("客戶成功獲得組件InteX"); pintex->Fx(); pintex->Release(); } trace("客戶:獲得InteY的接口"); InteY*pintey=NULL; hr=piunknown->QueryInterface(IID_InteY,(void**)&pintey); if(SUCCEEDED(hr)) { trace("客戶成功獲得組件InteY"); pintey->Fy(); pintey->Release(); } trace("客戶嘗試獲得不支持的InteZ組件接口"); InteZ*pintez=NULL; hr=piunknown->QueryInterface(IID_InteZ,(void**)&pintez); if(SUCCEEDED(hr)) { trace("客戶成功獲得組件InteZ"); pintez->Fz(); pintez->Release(); } else { trace("客戶不能成功獲得組件InteZ"); } trace("客戶釋放IUnknown借口"); piunknown->Release(); return0;}ATL——活動模板庫(TheActiveTemplateLibrary)在ATL產(chǎn)生以前,開發(fā)COM組件的方法主要有兩種:一是使用COMSDK直接開發(fā)COM組件,另一種方式是通過MFC提供的COM支持來實現(xiàn)。使用ATL開發(fā)COM應(yīng)用是一件非常簡單的事情,但是在ATL簡單易用的界面后面卻包含著復(fù)雜的技術(shù)。這些技術(shù)包含以下一些方面:COM技術(shù)C++模板類技術(shù)(Template)C++多繼承技術(shù)(Multi-Inheritance)其中,COM技術(shù)本文開頭有所描述。C++模板類技術(shù)(Template)、C++多繼承技術(shù)(Multi-Inheritance)在C++理論課中已有詳盡描述。這里最主要的是介紹使用ATL怎么生成一個自己的COM組件以及怎么使用該組件。1.建立一個ATL工程:圖11-SEQ圖_11-\*ARABIC12.選擇創(chuàng)建的COM類型:圖11-SEQ圖_11-\*ARABIC2該步驟中的一些選項說明:動態(tài)連接庫(DynamicLinkingLibrary)最終產(chǎn)生一個動態(tài)連接庫(DLL)形式的COM服務(wù)程序;

應(yīng)用程序(Executableapplication)最終產(chǎn)生一個可執(zhí)行程序類型(EXE)的COM服務(wù)程序;

NT服務(wù)(NTService)產(chǎn)生一個以NT服務(wù)方式運行的COM服務(wù)程序。

允許嵌入Proxy/Stub代碼。由Microsoft提供的MIDL編譯IDL文件以后,將產(chǎn)生用于對象調(diào)度(Marshaling)的Proxy/Stub的代碼。在傳統(tǒng)方式下,這部分代碼與COM服務(wù)程序的代碼是分離的,但是由于新的COM標(biāo)準(zhǔn)支持多線程環(huán)境下的COM對象服務(wù),因此在動態(tài)連接庫的COM服務(wù)程序中也要有Proxy/Stub的支持。為了支持在網(wǎng)絡(luò)上的傳輸,ATL允許用戶選擇將Proxy/Stub的代碼包括在生成的DLL代碼中。這個選項在EXE和NT服務(wù)類型的COM應(yīng)用條件下不可選。允許支持MFC。由于ATL對除COM以外的基本的Windows編程方面的支持極為有限,同時許多程序員對MFC又非常熟悉,因此在ATL的工程設(shè)置中允許在ATL工程內(nèi)部支持使用MFC,即可以使用MFC定義的類。這一特點給開發(fā)人員提供了許多方便,特別對于習(xí)慣使用MFC的人來說,能夠使用MFC提供的各種功能強大的類的支持,而不必直接使用WindowsSDK。從另一個方面來看,在ATL工程中使用MFC同時就喪失了ATL代碼輕量級的特點。支持MTS。MTS是MicrosoftTransactionServer的縮寫,它是Microsoft在COM技術(shù)方面的一個新的分支,這里不做詳細(xì)說明。----完成上面的設(shè)置以后,可以選擇Finish完成工程的設(shè)置,ATL將創(chuàng)建相應(yīng)的工程。3.向工程中加入一個新的ATL類:首先通過集成環(huán)境的"Insert"菜單下的"NewATLObject..."命令進(jìn)入"ATLObjectWizard"對話框。如下圖所示:圖11-SEQ圖_11-\*ARABIC3對話框的左邊部分說明了待創(chuàng)建對象的基本類型,這里主要有以下幾種類型:對象(Object)基本的COM對象類型;控制(Control)ActiveXControl類型的ATL對象;其他(Miscellaneous)輔助功能,如對話框的生成等;數(shù)據(jù)訪問(DataAccess)數(shù)據(jù)訪問,支持MTS等。對于一般的COM服務(wù)程序,選擇

對象(Object),點擊下一步繼續(xù):3.輸入引入的類名:圖11-SEQ圖_11-\*ARABIC44.切換到Attributes(屬性)標(biāo)簽頁:圖11-SEQ圖_11-\*ARABIC5對象的屬性設(shè)置是ATL對象創(chuàng)建過程中最復(fù)雜的部分,包括以下幾個主要部分:對象的線程模型(ThreadModel):對象的線程模型是COM對象在多線程環(huán)境下被訪問時對訪問方式的控制,缺省情況下在ATL中采用的是套間模型Apartment,由系統(tǒng)通過消息隊列方式提供并發(fā)控制。對象的接口模型(Interface):COM對象的接口可以是雙接口(DualInterface)。雙接口不同于普通接口(CustomInterface)之處在于雙接口是從Automation基本接口IDispatch繼承的,而普通接口是從IUnknown接口直接繼承來的。缺省的接口模型是雙接口。對象的聚合模型(Aggregate):COM規(guī)范不允許對象的實現(xiàn)繼承,但是可以通過聚合方式重用其他的COM對象。ATL對象屬性設(shè)置中的聚合模型可以指定待創(chuàng)建的COM對象是否支持聚合模型。缺省的選項是支持對象的聚合。對象對錯誤處理的支持(SupportISupportErrorInfo):選取這個選項可以在對象的運行過程中支持錯誤處理。缺省情況下這個選項不被選中。對象對連接點的支持(SupportConnectionPoints):連接點是COM對象的事件機制。選中這個選項可以使待創(chuàng)建的COM對象具有發(fā)出事件的能力。缺省情況下該選項不被選中。對象對自由線程調(diào)度的支持(FreeThreadMarshaller,簡稱FTM):對象的自由線程調(diào)度是對象在處于自由線程模型狀態(tài)下,為了簡化對象的訪問過程而采用的一種優(yōu)化策略。缺省情況下該選項不被選中。5.給引入的類添加方法:圖11-SEQ圖_11-\*ARABIC6圖11-SEQ圖_11-\*ARABIC7給添加的方法加入如下代碼:圖11-SEQ圖_11-\*ARABIC8 CComBSTRstrSource=InData; CComBSTRtempSource=InData; boolbNeedToUpper=true; intj=(int)strSource.Length()-1; //實現(xiàn)字符串到大寫字母的轉(zhuǎn)換并進(jìn)行逆序轉(zhuǎn)換 for(inti=0;i<(int)strSource.Length();i++) { if(strSource[i]>='a'&&strSource[i]<='z'&&bNeedToUpper) { strSource[i]=strSource[i]-32; bNeedToUpper=true; } if(strSource[i]

溫馨提示

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

評論

0/150

提交評論