




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1313TL(TheActiveemplateLibrary的縮寫,其設計旨在讓人C++方便靈活地開發(fā)COM對象。TL本身相當小巧靈活,這是它最大的優(yōu)點。用它可以創(chuàng)建輕量級的,自包含的,可復用的二進制代碼,不用任何附DLLs支持。ATL1.0版本提供了用于實現(xiàn)IUnknown、IClassFactory、IDispatch、IConnectionPointContainerCOM2.0ActiveX支持、WinSockWin32API的完整包裝(ATL2.0的控件實現(xiàn)提供了WndProc的支持。ATLMFC的文檔-視圖模型,它假定用戶將使用可以升級和更加靈活的COM方式(如ActiveX控件)來與基于UIATLVC++13.113.1ATL的優(yōu)ATL是在單層(single-tier)應用逐漸過時,分布式應用逐漸成為主流的環(huán)境中誕生的,它所形成的出色的構架專門用于開發(fā)現(xiàn)代分布式應用所需的輕量級COM組件。ATLCOMCOMSDKCOMMFCCOMCOMSDKCOM組件是最基本也是最靈活的方式。通過使用微軟公司COM程序。但是,這種開發(fā)方式的難度和工作量都很大,COMCOMSDK要求開發(fā)人員自己去實現(xiàn)COM應用的每一個細節(jié),完成大量的重復性工作。這不僅降低了工作效率,同時也使開發(fā)人員不得不把許多精力投入到與應用需求本身無關的技術細節(jié)中。MFCCOM的支持比手工編寫COM程序有了很大的進步。MFC采用面向對象的方COMMFCC++COM支持功能。為了使派生類方便地獲得COM對象的各種特性,MFC中有許多預定義宏,這些宏COM接口的定義和對象的注冊等常用功能,開發(fā)者可以使用這些宏來定COMMFCActiveX控件的支持,VisualC++也提供了相應的應用程序向導支持,這種可視化的工具更加方便了COM應用的開發(fā)。MFCCOMMFCCOMIDLMFC設計的基本出發(fā)點決定的。MFCWindows平臺編程開發(fā)的面向對象的封裝,涉及到了Windows編程的各個方面,COMWindows平臺編程開發(fā)的一個部分也得到MFC的支持,但是MFCCOM的支持是以其全局目標為出發(fā)點的,因COMMFCCOM的支持并不能夠很好的滿使用MFC開發(fā)的ActiveX控件的代碼冗余量大,而且必須要依賴于MFC的運行MFCCOMMFC的繼承實現(xiàn)的本質,使得ActiveX控件必須承擔運行時間庫的冗余部分。如果采用靜態(tài)連接MFC運行時刻庫的方式,這將使ActiveX控件代碼過于龐大,不適合在Internet網上傳輸;如果采用使得MFC對COM技術的支持在網絡應用的環(huán)境下也顯得很不靈活。作為一個模塊化的標準組件,ATLMFCATL庫使得實現(xiàn)IUnknown和IClassFactory十分輕松。ATL因其采用了特定的基本實現(xiàn)技術,擺脫了大量冗余代碼,使用ATL開發(fā)出來的COM應用的代碼簡練高效(即所謂的SlimCode。ATL在實現(xiàn)上盡可能采用優(yōu)化技術,甚至在其內部提供了所有C/C++開發(fā)的程序所必須具有的CATL產生的代碼在運行時不需要依賴于類MFC程序所需要的龐大的代碼模塊,包含ATLCOMATLCOM(包括ActiveX控件)對COM開發(fā)的任何一個環(huán)節(jié)和過程,ATL都提供支持,并將與COM開發(fā)相關的眾COM/ActiveX的各種應用,ATL也都提供了完ATLCOM組件的另一VisualStudio集成開發(fā)環(huán)ATL的高度支持。微軟VisualC5.0ATL所要用到的接口定義語言(IDL)集成到C++編輯器中。ATL的對象向導產生大量基于ATL模板類缺省的對象實現(xiàn)代碼(即框架代碼。ATL對象向導允許用戶快速建立并且運行COMCOMATL的細節(jié)問題。對于大型的對象類,只要在ATL對象向導所產生的缺省實現(xiàn)(框架代碼)中加入方法實現(xiàn)來輸出COM13.2ATLCOM的支ATLC++中的模板技術(Template)和多重繼承技術(Multi-Inheritance)來實COM13.2.1ATL最核心的實現(xiàn)技術的模板是對標準C++語言的擴展。所謂模板類簡單地說是對類的抽象。在C++語言中用類定義了構造C++對象的方式,對象是類的實例,而模板類在C++template<classT>classMyTemplate{MyTemplate<T>(~MyTemplate<T>(voidFunc(intp)}…template<classT>{…}template<classT>{…}template<classT>voidMyTemplate<T>::Func(…}template<classT>voidMyTemplate<T>::Func(int{…}首先使用C++的關鍵字“template”來聲明一個模板類的定義。在關鍵字后面是用尖括號括起來的類型參數(shù)。正是根據這個類型參數(shù),編譯器才能在編譯過程中將模板類的具體定義轉化為一個實際的類的定義,即生成一個新的類。接下來的定義方式與普通的類定義十分相似,只是在類的函數(shù)定義中都要帶有類型參數(shù)的說明。模板類是對標準C++語言的最新擴展,它的功能很強大,ATL的核心就是由幾十個模板類構成的,盡管模板在內部得到廣泛的使用,但是在用ATL技術時,用戶不用輸入那些模板中的尖括弧,這是因為ATL本身帶有ATL對象向導。ATL中,C++類通過繼承CComObjectRootEx,指定它們想用的組件模型CComObjectRootEx類是一個基于模板的類,將線性模型作為其唯一參數(shù)。ATL有兩個處理引CComSingleThreadModel和CComMultiThreadModel。這些類每個都有一個遞增和一個遞減函數(shù),它們之間的區(qū)別是CComSingleThreadModel用標準C++操作符(++和--)實現(xiàn)遞增和遞減;而CComMultiThreadModel使用線程安全的InterlockedIncrementInterlockedDecrement函數(shù)來實現(xiàn)這兩個功能。利用用來實例化CComObjectRootEx的模板參數(shù),它能正確運行給定的組件類型。與MFC類似,ATL使用基于映射表的查找機制實現(xiàn)QueryInterface。CComObjectRootBase類通過一個接口映射處理類的QueryInterface函數(shù)。BEGIN_COM_MAP和END_COM_MAP宏定義了一個接口映射的開始和結束。然而,與MFC不同的是,ATL提供17種途徑來組成一個接口映射,例如使ATL的基于模板的接口實現(xiàn)類如IOleObjectImpl來的vptrs。這包括了那些從tear-off的類或者由聚合提供的類來的vptrs。ATL對類對象(以及IClassFactory)的支持也來自模板,而MFC的類對象支過和一些宏實現(xiàn)。 的類對象支持來CComCoClass/CcomClassFactory類家族和CComCreator類家族CComCoClass包含了類的GUID,定義了COM類的錯誤處理設施。CComCreator類提供了CreateInstance的實現(xiàn),供CComClassFactory使用。ATL包括DECLARE_CLASS_FACTORYFACTORY2、CLARE_CLASS_FACTORY_AUTO_THREADDECLARE_CLASS_FACTORY_SINGLETON等宏用來使各種具體的類工廠支持有IDispatch支持來,ATLIDispatch的支持更加是COM中心的。MFC使用了一種hand-rolledIDispatch實現(xiàn)ATL使用更加標準的方法來加載一個接口的類型信息并代表標準的類型庫編譯器13.2.2CO13.2.2COM這樣一個復雜的技術體系在實現(xiàn)效率上得到了很大的提高。通過使用模板類,用戶可以把精力集中在自己開發(fā)的類的基本邏輯上,在完成了自己的類的設計以后,通過繼承不同的類,生成COM的功能,同時又避免了采用單繼承結構造成的大量功能冗余。多繼承技術同模板一樣,是C++語言中極具爭議性的技術。使用多繼承技術可以使程序的設計和實現(xiàn)更加靈活,但是,由于多繼承的復雜性和自身概念上的一些問題,使多繼承在各種面向對象的語言環(huán)境中得到的支持都非常有限。例如MFC就不支持多繼承技術。多繼class{voidclassB:public{voidvoidclassC:public{voidvoidclassD:publicB,{}DD*d=newAB(A*)d-//類D通過類B與類C分別繼承A,因此不知道執(zhí)行哪個f函ATL使用了C++最新規(guī)范中加入的兩個運算符static_cast、dynamic_castD*d=newstatic_cast<A*>(static_cast<C*>(pD))-D*d=newstatic_cast<A*>(static_cast<C*>(pD))-13.3ATL編程實例―獲取操作系統(tǒng)VisualC++ATL的基本使用方法。本實例先創(chuàng)建一個進程內COM組件,利用組件的接口可以查詢本機的操作系統(tǒng)版本。接著創(chuàng)建一個COM13.3.1ATLATLCOMATLATLCOMATL類加入新的接口定義,并實現(xiàn)相應的COM1.創(chuàng)建話框,在“模板”中選擇“ATLCOM程序向導”,在“名稱”文本框中輸入項目名稱ATL_Sample,單擊“確定”按鈕進入“ATL項目向導對話框”,如圖13-1圖13- ATL項目向13-1序”設置界面中可以指定項目的應用程序類型和功能支持。對此界面設置如圖13-213-ATL項目向13-ATL項目向導對話框“應用程序設置”界動態(tài)鏈接庫:產生動態(tài)鏈接庫類型(DLL)的COM可執(zhí)行文件:產生可執(zhí)行程序類型(EXE)的COMNTCOM服務程序。允許合并proxy/stub代碼:Microsoft提供MIDLIDL文件以后,將產生用于對象調度(Marshaling)由Proxy/Stub的代碼。傳統(tǒng)地,這部分代碼與COM服務程序的代碼是分離的,但是由于新COMCOMCOM服務程序中Proxy/Stub的支持。為了支持在網絡上的傳輸,ATLProxy/Stub的代碼包括在生成DLL代碼中。這個選項EXENTCOM應用條件下不可MFCATLCOMWindows編程方面的支持很有限,同時許多程序員對MFC又非常熟悉,因此在ATL的工程設置中允許ATL工程內部支持MFC,即可以使用MFC定義的類。這在一方面來看是非常方便MFCMFC提供的各種功能強大的WindowsSDKATLMFC同時就喪失了ATL代碼輕量級的特點。COM+1.0COM+1.0界面設置完畢后,單擊“完成”按鈕,ATLATL項目的框架。向導創(chuàng)建的文件ATL_Sample.cpp中包含進程內部服務器的DLL出口的實現(xiàn)以及本地服務器中的DllMainDllCanUnloadNowDllGetClassObjectDllRegisterServer和ATL_Sample.def中包含DLLATL_Sample.idlMIDLATL_Sample.idlMIDLATL_Sample.tlbmarshaling2.ATLATL,將出現(xiàn)“ATL13-3圖13- 添加ATL對在向導中的“簡稱”文本框中輸入Version,ATL對象向導將同步地根據用戶輸入的對象標識設定該對象的C++標識和COM標識。對象的C++標識包括對象的類名,cpp文件COM標識包括對象在類型庫中的CoClassProgID13-4圖13- ATLATL和.cppIDL文件。有了這些文件以后,接著就可以為接口和.cppIDL文件。有了這些文件以后,接著就可以為接口3.在“類視圖”窗口中用鼠標右鍵單擊新增的接口IVersion,在彈出的快捷菜單中選擇框的設置如圖13-6所示,設置完成后單擊“完成”按鈕完成方法的添加。13-在本例中添加函GetOsVersion,用來取得本機的操作系統(tǒng)版本。添加方法為ATL所做的工作。ATL在接口的定且在類對應的.cpp文件中,加入了此方法的實現(xiàn)框架如下:STDMETHODIMPCVersion::GetOsVersion(BSTR*{//TODO:return}基本完成了。依照這種方式,用戶可以完成整個COM對象的定義和實現(xiàn)。Version.cpp//Version.cpp:CVersion#include#include//#include//加入comutil#include#pragmacomment(lib,"comsupp.lib"http://STDMETHODIMPCVersion::GetOsVersion(BSTR*{//TODO:charOSVERSIONINFOVersionInformation;//版本信息VersionInformation.dwOSVersionInfoSizesizeof(OSVERSIONINFO);//使用GetVersionEx{{casestrcpy(szOSVersion"WIN32S復制字符串casestrcpy(szOSVersion,"WIN95/98");casestrcpy(szOSVersion,"WINNT");strcpy(szOSVersion,"UnKnown");}}{strcpy(szOSVersion,}*bstrVersion=return}4.生成VisualC++return}4.生成VisualC++DLL對ATL項目的編譯連接過程包括下面的幾個步驟編譯工程的.cpp文件形成目標文件。COMScript簡稱RGS)是ATL提供的文本方式的注冊輔助文件。此項目中的注冊腳本文件Version.rgs如下:{//對象的ATL_Sample.Version.1=s'Version{CLSID=s'{430EFA89-3AD0-4F6E-A581-}ATL_Sample.VersionsVersionClass'{CLSID=s'{430EFA89-3AD0-4F6E-A581-CurVer=s}NoRemove{//對象的CLSIDForceRemove{430EFA89-3AD0-4F6E-A581-C32FF8ABC30A}=s'Version{ProgID=s'ATL_Sample.Version.1'VersionIndependentProgID=s'ATL_Sample.Version'ForceRemoveInprocServer32=s ForceRemoveInprocServer32=s {valThreadingModelsApartment'}valAppID=s'TypeLib'=s'{DA511C5D-2213-4E1A-9B7F-}}}RGSCOMRGS文件,但是必要時也可以手工修改RGS文件來定制模塊的注冊過程。用ATL編程使得COM組件的開發(fā)不再變得繁瑣和重復大量的工作,同時與使用MFC編程相比它的代碼體積要小得多,這是因為ATL使用了模板類技術。ATL使我們可以很容易創(chuàng)建COM對象、自動化服務器和ActiveX控件,ATL為許多基本的COM接口都13.3.2COM創(chuàng)建COM對象的實例。這可以通過調用Windows系統(tǒng)的API函數(shù)CoCreateInstanceIUnknown::ReleaseCOM1.13-713-設置“Win322.添13-設置“Win322.添加在菜單欄選擇“文件”→“新建”將打開“新建”對話框,在其中選擇模板為“C++CPP文件名ClientClient.cpp。修改此文件如下:#include#include//加入comutil#include#pragmacomment(lib,"comsupp.lib" #include"..\ATL_Sample\ATL_Sample.h"#include"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論