首頁 > 百科 > 品牌百科 > 服務(wù)品牌 >ATL(新能源科技有限公司) 友情提示:投資有風(fēng)險 加盟需謹(jǐn)慎!

ATL

新能源科技有限公司 在線咨詢 了解詳情

  ATL,Active Template Library活動模板庫,是一種微軟程序庫,支持利用C++語言編寫ASP代碼以及其它ActiveX程序?;顒幽0鍘?,可以建立COM組件,然后ASP頁面中的腳本對COM對象進(jìn)行調(diào)用。這種COM組件可以包含屬性頁、對話框等控件。



ATL圖片

ATL介紹

  自從1993年Microsoft公布了COM技術(shù)以后,Windows平臺上的開發(fā)模式發(fā)生了巨大的變化,以COM為基礎(chǔ)的一系列軟件組件化技術(shù)將Windows編程帶入了組件化時代。廣大的開發(fā)人員在為COM帶來的軟件組件化趨勢歡欣鼓舞的同時,對于COM開發(fā)技術(shù)的難度和煩瑣的細(xì)節(jié)也感到極其的不便。COM編程一度被視為一種高不可攀的技術(shù),令人望而卻步。開發(fā)人員希望能夠有一種方便快捷的COM開發(fā)工具,提高開發(fā)效率,更好地利用這項技術(shù)。


  針對這種情況,Microsoft公司在推出COM SDK以后,為簡化COM編程,提高開發(fā)效率,采取了許多方案,特別是在MFC(Microsoft Foundation Class)中加入了對COM和OLE的支持。但是隨著Internet的發(fā)展,分布式的組件技術(shù)要求COM組件能夠在網(wǎng)絡(luò)上傳輸,而又盡量節(jié)約寶貴的網(wǎng)絡(luò)帶寬資源。采用MFC開發(fā)的COM組件由于種種限制不能很好地滿足這種需求,因此Microsoft在1995年又推出了一種全新的COM開發(fā)工具ATL。


  ATL是ActiveX Template Library 的縮寫,它是一套C++模板庫。使用ATL能夠快速地開發(fā)出高效、簡潔的代碼(Effective and Slim code),同時對COM組件的開發(fā)提供較大限度的代碼自動生成以及可視化支持。為了方便使用,從MicrosoftVisual C++5.0版本開始,Microsoft把ATL集成到Visual C++開發(fā)環(huán)境中。1998年9月推出的Visual Studio 6.0 集成了ATL 3.0版本。ATL已經(jīng)成為Microsoft標(biāo)準(zhǔn)開發(fā)工具中的一個重要成員,日益受到C++開發(fā)人員的重視。


  ATL究竟給開發(fā)人員帶來了什么樣的益處呢?這還要先從ATL產(chǎn)生以前的COM開發(fā)方式說起。


  在ATL產(chǎn)生以前,開發(fā)COM組件的方法主要有兩種:一是使用COM SDK直接開發(fā)COM組件,另一種方式是MFC提供的COM支持來實現(xiàn)。


  直接使用COM SDK開發(fā)COM組件是奡基本也是奡靈活的方式。使用Microsoft提供的開發(fā)包,我們可以直接編寫COM程序。但是,這種開發(fā)方式的難度和工作量都很大,一方面,要求開發(fā)者對于COM的技術(shù)原理具有比較深入的了解(雖然對技術(shù)本身的深刻理解對使用任何一種工具都是非常有益的,但對于COM這樣一整套復(fù)雜的技術(shù)而言,在短時間內(nèi)完全掌握是很難的),另一方面,直接使用COM SDK要求開發(fā)人員自己去實現(xiàn)COM應(yīng)用的每一個細(xì)節(jié),完成大量的重復(fù)性工作。這樣做的結(jié)果是,不僅降低了工作效率,同時也使開發(fā)人員不得不把許多精力投入到與應(yīng)用需求本身無關(guān)的技術(shù)細(xì)節(jié)中。雖然這種開發(fā)方式對于某些特殊的應(yīng)用很有必要,但這種編程方式并不符合組件化程序設(shè)計方法所倡導(dǎo)的可重用性,因此,直接采用COM SDK不是一種理想的開發(fā)方式。


  使用MFC提供的COM支持開發(fā)COM應(yīng)用可以說在使用COM SDK基礎(chǔ)上提高了自動化程度,縮短了開發(fā)時間。MFC采用面向?qū)ο蟮姆绞綄OM的基本功能封裝在若干MFC的C++類中,開發(fā)者繼承這些類得到COM支持功能。為了使派生類方便地獲得COM對象的各種特性,MFC中有許多預(yù)定義宏,這些宏的功能主要是實現(xiàn)COM接口的定義和對象的注冊等通常在COM對象中要用到的功能。開發(fā)者可以使用這些宏來定制COM對象的特性。


  另外,在MFC中還提供對Automation和 ActiveX Control的支持,對于這兩個方面,Visual C++也提供了相應(yīng)的AppWizard和ClassWizard支持,這種可視化的工具更加方便了COM應(yīng)用的開發(fā)。


  MFC對COM和OLE 的支持確實比手工編寫COM程序有了很大的進(jìn)步。但是MFC對COM的支持是不夠完善和徹底的,例如對COM接口定義的IDL語言,MFC并沒有任何支持,此外對于近些年來COM和ActiveX技術(shù)的新發(fā)展MFC也沒有提供靈活的支持。這是由MFC設(shè)計的基本出發(fā)點決定的。MFC被設(shè)計成對Windows平臺編程開發(fā)的面向?qū)ο蟮姆庋b,自然要涉及Windows編程的方方面面,COM作為Windows平臺編程開發(fā)的一個部分也得到MFC的支持,但是MFC對COM的支持是以其全局目標(biāo)為出發(fā)點的,因此對COM 的支持必然要服從其全局目標(biāo)。從這個方面而言,MFC對COM的支持不能很好的滿足開發(fā)者的要求。


  隨著Internet技術(shù)的發(fā)展,Microsoft將ActiveX技術(shù)作為其網(wǎng)絡(luò)戰(zhàn)略的一個重要組成部分大力推廣,然而使用MFC開發(fā)的ActiveX Control,代碼冗余量大(所謂的"肥代碼 Fat Code"),而且必須要依賴于MFC的運行時刻庫才能正確地運行。雖然MFC的運行時刻庫只有部分功能與COM有關(guān),但是由于MFC的繼承實現(xiàn)的本質(zhì),ActiveX Control必須背負(fù)運行時刻庫這個沉重的包袱。如果采用靜態(tài)連接MFC運行時刻庫的方式,這將使ActiveX Control代碼過于龐大,在網(wǎng)絡(luò)上傳輸時將占據(jù)寶貴的網(wǎng)絡(luò)帶寬資源;如果采用動態(tài)連接MFC運行時刻庫的方式,這將要求瀏覽器一方必須具備MFC的運行時刻庫支持??傊甅FC對COM技術(shù)的支持在網(wǎng)絡(luò)應(yīng)用的環(huán)境下也顯得很不靈活。


  解決上述COM開發(fā)方法中的問題正是ATL的基本目標(biāo)。


  首先ATL的基本目標(biāo)就是使COM應(yīng)用開發(fā)盡可能地自動化,這個基本目標(biāo)就決定了ATL只面向COM開發(fā)提供支持。目標(biāo)的明確使ATL對COM技術(shù)的支持達(dá)到非常充分的地步。對COM開發(fā)的任何一個環(huán)節(jié)和過程,ATL都提供支持,并將與COM開發(fā)相關(guān)的眾多工具集成到一個統(tǒng)一的編程環(huán)境中。對于COM/ActiveX的各種應(yīng)用,ATL也都提供了完善的Wizard支持。所有這些都極大地方便了開發(fā)者的使用,使開發(fā)者能夠把注意力集中在與應(yīng)用本身相關(guān)的邏輯上。


  其次,ATL因其采用了特定的基本實現(xiàn)技術(shù),擺脫了大量冗余代碼,使用ATL開發(fā)出來的COM應(yīng)用的代碼簡練高效,即所謂的"Slim Code"。ATL在實現(xiàn)上盡可能采用優(yōu)化技術(shù),甚至在其內(nèi)部提供了所有C/C++開發(fā)的程序所必須具有的C啟動代碼的替代部分。同時ATL產(chǎn)生的代碼在運行時不需要依賴于類似MFC程序所需要的龐大的代碼模塊,包含在后來模塊中的功能是用戶認(rèn)為奡基本和奡必須的。這些措施使采用ATL開發(fā)的COM組件(包括ActiveX Control)可以在網(wǎng)絡(luò)環(huán)境下實現(xiàn)應(yīng)用的分布式組件結(jié)構(gòu)。


  第三,ATL的各個版本對Microsoft的基于COM的各種新的組件技術(shù)如MTS、ASP等都有很好的支持,ATL對新技術(shù)的反應(yīng)速度大大快于MFC。ATL已經(jīng)成為Microsoft支持COM應(yīng)用開發(fā)的主要開發(fā)工具,因此COM技術(shù)方面的新進(jìn)展在很短的時間內(nèi)都會在ATL中得到反映。這使開發(fā)者使用ATL進(jìn)行COM編程可以得到直接使用COM SDK編程同樣的靈活性和強大的功能。


  本文的目的就是希望在有限的篇幅中能夠使讀者對ATL的使用和基本原理有一個初步的了解,為廣大的COM開發(fā)人員更好地使用ATL開發(fā)起到拋磚引玉的作用。

ATL基本技術(shù)

  雖然使用ATL開發(fā)COM 應(yīng)用是一件非常簡單的事情,但是在ATL簡單易用的界面后面卻包含著復(fù)雜的技術(shù)。面對ATL生成的大量代碼,我們即使不去深入地了解這些代碼的含義也可以開發(fā)出COM應(yīng)用來,但是如果我們要充分地挖掘ATL的潛力,開發(fā)出更靈活、強大的COM應(yīng)用,則必須對ATL使用的基本技術(shù)有所了解。研究ATL的實質(zhì)好的教材就是由Visual C++提供的ATL源代碼。本文這一部分只是對ATL中用到的奡基本的技術(shù)進(jìn)行簡單的介紹。


  簡單地說來,ATL中所使用的基本技術(shù)包括以下幾個方面:


  COM技術(shù)


  C++模板類技術(shù)(Template)


  C++多繼承技術(shù)(Multi-Inheritance)


  COM技術(shù)是理解ATL的基礎(chǔ),使用ATL進(jìn)行開發(fā)要對COM技術(shù)的基本概念有較低限度的了解。由于COM是一項非常復(fù)雜龐大的技術(shù)體系,限于本文的篇幅,這里不再贅述。對于本文中提到的COM基本概念也不做過多的解釋,請讀者參閱有關(guān)的參考書籍。


  作為ATL奡核心的實現(xiàn)技術(shù)的模板是對標(biāo)準(zhǔn)C++語言的擴展,但是在大多數(shù)的C++編程環(huán)境中,人們很少使用它,這是因為模板的功能雖然很強,但是它內(nèi)部機制比較復(fù)雜,需要比較多的C++知識和經(jīng)驗才能靈活地使用它。在MFC中的CObjectArray等功能類就是由模板來定義的。完全模板來定義程序的整體類結(jié)構(gòu),ATL是迄今為止做得奡為成功的。


  所謂模板類簡單地說是對類的抽象。我們知道C++語言用類定義了構(gòu)造對象(這里指C++對象而不是COM對象)的方式,對象是類的實例,而模板類定義的是類的構(gòu)造方式,使用模板類定義實例化的結(jié)果產(chǎn)生的是不同的類。因此可以說模板類是"類的類"。


  在C++語言中模板類的定義格式如下:


  注意:<;和>;是左右尖括號,可能無法正常顯示。


  首先使用C++的關(guān)鍵字"template"來聲明一個模板類的定義。在關(guān)鍵字后面是用尖括號括起來的類型參數(shù)。正是根據(jù)這個類型參數(shù),編譯器才能在編譯過程中將模板類的具體定義轉(zhuǎn)化為一個實際的類的定義,即生成一個新的類。接下來的定義方式與普通的類定義十分相似,只是在類的函數(shù)定義中都要帶有類型參數(shù)的說明。


  下面的程序段說明了模板類的用法:


  通常在使用模板類時為了方便起見,使用一個關(guān)鍵字"typedef"為新定義出來的類取一個名字。在上面的程序段中假設(shè)"MyClass"是一個由用戶定義的類,將這個類的名字作為類型參數(shù)傳遞給模板類,我們可以創(chuàng)建一個新的類,這個類的行為將以模板類的定義為基礎(chǔ),例如它具有模板類定義的所有成員函數(shù),同時這個類又是對模板類行為的一種修改,這種修改是用戶提供的類型參數(shù)來實現(xiàn)的。賦予模板類以不同的類型參數(shù),則得到行為框架相似但具體行為不同的一組類的集合。有了新的類的定義以后,我們可以象使用普通類一樣來創(chuàng)建一個類的實例,即一個新的對象,并且調(diào)用這個對象的成員函數(shù)。


  模板類是對標(biāo)準(zhǔn)C++語言的較新擴展,雖然它的功能很強大,但是要想使用好模板類需要相當(dāng)多的關(guān)于語言和編程的經(jīng)驗和知識,而且錯誤地使用模板類又會對程序的結(jié)構(gòu)和運行效率帶來大的副作用,因此一般的編程環(huán)境和編程書籍對模板類的使用都采取謹(jǐn)慎的態(tài)度。而ATL的核心就是由幾十個模板類構(gòu)成的,研究ATL的源代碼可以使我們對模板類的使用有比較深刻全面的認(rèn)識。


  多繼承技術(shù)同模板一樣,是C++語言中具有爭議性的技術(shù)。使用多繼承技術(shù)可以使程序的設(shè)計和實現(xiàn)更加靈活,但是,由于多繼承的復(fù)雜性和自身概念上的一些問題,使多繼承在各種面向?qū)ο蟮恼Z言環(huán)境中得到的支持都非常有限。例如Small Talk根本就不允許多繼承,同樣MFC也不支持多繼承技術(shù)。


  多繼承較大的問題是所謂的"鉆石結(jié)構(gòu)"。例如下面的代碼:


  由于類D同時從類C和B繼承,因此在下面的語句中就會發(fā)生歧義:


  由于類D類C和類B 分別繼承了類A,這里的強制轉(zhuǎn)化就會發(fā)生歧義。


  ATL使用了C++較新規(guī)范中加入的兩個運算符號static_cast、dynamic_cast代替簡單的強制轉(zhuǎn)化,從而除去多繼承帶來的歧義。使用這兩個運算符號,我們可以在對象運行過程中獲取對象的類型信息。上面的代碼可以采用下面的方式修改:


  為什么模板類和多繼承技術(shù)會成為ATL主要的工具呢?原因在于,采用模板可以在編譯過程中快速的生成具有用戶定制功能的類,這對于COM這樣一個復(fù)雜的技術(shù)體系在實現(xiàn)效率上得到了很大的提高。使用模板類,用戶可以把精力集中在自己開發(fā)的類的基本邏輯上,在完成了自己的類的設(shè)計以后,繼承不同的模板類,生成不同的類,就可以快速地實現(xiàn)COM的功能,同時又避免了采用單繼承結(jié)構(gòu)造成的大量功能冗余。


  總之,正是由于在設(shè)計實現(xiàn)過程中采用了模板類和多繼承技術(shù),才使ATL成為一個小巧靈活的COM開發(fā)工具,能夠適應(yīng)開發(fā)人員對COM應(yīng)用開發(fā)的各種需要。

ATL基本使用

  這一部分將重點介紹ATL的基本使用過程。由于ATL已經(jīng)被集成在Microsoft Visulal Studio的Visual C++開發(fā)環(huán)境中,因此要使用ATL必須先安裝Visual C++。在下面的討論中有關(guān)COM的基本知識請參閱有關(guān)的文檔,這里不再詳細(xì)說明。


  使用ATL開發(fā)一個COM應(yīng)用基本可以分為以下幾個步驟:


  創(chuàng)建一個新的ATL工程,并對工程的選項進(jìn)行適當(dāng)?shù)呐渲谩?/span>


  向新創(chuàng)建的工程添加新的ATL類,并對該類進(jìn)行一些初始配置工作。


  根據(jù)COM應(yīng)用的基本要求向新的ATL類加入新的接口定義,并實現(xiàn)相應(yīng)的接口成員函數(shù)。


  編譯連接工程,注冊COM應(yīng)用。


  下面將根據(jù)這些步驟依次介紹ATL的基本使用過程(給出的是Visual Studio 6.0的使用):


  1. 創(chuàng)建工程


  首先啟動Visual C++集成開發(fā)環(huán)境,選擇"File"菜單下的"New..."命令,在"New"對話框中選擇"Project"頁。


  選擇"ATL COM AppWizard"項,這是創(chuàng)建ATL工程的AppWizard向?qū)肟?。然后?Project name"編輯框中輸入工程的名字,單擊"OK"按鈕,進(jìn)入AppWizard對話框。


  在AppWizard對話框中主要的設(shè)置選項有:


  COM服務(wù)程序的類型:


  -動態(tài)連接庫(Dynamic Linking Library) 后來產(chǎn)生一個動態(tài)連接庫(DLL)形式的COM服務(wù)程序;


  -應(yīng)用程序(Executable application)后來產(chǎn)生一個可執(zhí)行程序類型(EXE)的COM服務(wù)程序;


  - NT服務(wù)(NT Service):產(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定義的類。這在一方面來看是非常方便的,特別是對于習(xí)慣于使用MFC的開發(fā)人員來說,能夠使用MFC提供的各種功能強大的類的支持,而不必直接使用Windows SDK。從另一個方面來看,在ATL工程中使用MFC同時就喪失了ATL代碼輕量級的特點。


  支持MTS。MTS是Microsoft Transaction Server的縮寫,它是Microsoft在COM技術(shù)方面的一個新的分支,這里不作詳細(xì)說明。


  完成上面的設(shè)置以后,可以選擇FINISH完成工程的設(shè)置,ATL將創(chuàng)建相應(yīng)的工程。


  2. 加入ATL類


  完成工程的創(chuàng)建和設(shè)置以后,下一步就是向工程中加入一個新的ATL類。Visual Studio集成環(huán)境提供了向?qū)Чぞ?ATL Object Wizard"用于加入一個新的ATL類。操作過程并不復(fù)雜,只是一組對話框操作而已。


  首先集成環(huán)境的"Insert"菜單下的"New ATL Object…"命令進(jìn)入"ATL Object Wizard"對話框。


  這個對話框即為創(chuàng)建ATL對象的向?qū)鹗冀缑?。對話框的左邊部分說明了待創(chuàng)建對象的基本類型,這里主要有以下的幾種類型:


  對象(Object)基本的COM對象類型;


  控制(Control)ActiveX Control類型的ATL對象;


  別的(Miscellaneous)輔助功能,如對話框的生成等;


  數(shù)據(jù)訪問(Data Access)數(shù)據(jù)訪問,支持MTS等。


  右邊部分說明了每種類型的詳細(xì)內(nèi)容,對于一般的COM服務(wù)程序,使用對象表中的簡單對象(Simple Object)就可以了。


  選定待創(chuàng)建對象的基本類型以后,單擊"Next>;"按鈕進(jìn)入下一步,進(jìn)入對象屬性設(shè)置對話框。


  對象屬性設(shè)置分為兩個過程:先是對象名字標(biāo)識的設(shè)定,然后是對對象的基本屬性進(jìn)行設(shè)置。首先是對象的名字標(biāo)識設(shè)置。


  在對象標(biāo)識編輯框中輸入待創(chuàng)建對象的名字,ATL對象向?qū)⑼降馗鶕?jù)用戶輸入的對象標(biāo)識設(shè)定該對象的C++標(biāo)識和COM標(biāo)識。對象的C++標(biāo)識包括對象的類名,cpp文件名和頭文件名。COM標(biāo)識包括對象在類型庫中的CoClass段和實現(xiàn)的主接口的名字,同時還有在系統(tǒng)注冊表中的類型名以及ProgID。


  對象名字標(biāo)識設(shè)置完成以后,選擇對象屬性頁(Attribute)進(jìn)入對象的屬性設(shè)置頁面。


  對象的屬性設(shè)置是ATL對象創(chuàng)建過程中奡復(fù)雜的部分,包括以下幾個主要部分:


  對象的線程模型(Thread Model)


  對象的線程模型是COM對象在多線程環(huán)境下被訪問時對訪問方式的控制,缺省情況下在ATL中采用的是套間模型Apartment,由系統(tǒng)消息隊列方式提供并發(fā)控制。


  對象的接口模型(Interface)


  COM對象的接口可以是雙接口(Dual Interface)。雙接口不同于普通接口(Custom Interface) 之處在于雙接口是從Automation基本接口IDispatch繼承的,而普通接口是從IUnknown接口直接繼承來的。缺省的接口模型是雙接口。


  對象的聚合模型(Aggregate)


  COM規(guī)范不允許對象的實現(xiàn)繼承,但是可以聚合方式重用其它的COM對象。ATL對象屬性設(shè)置中的聚合模型可以指定待創(chuàng)建的COM對象是否支持聚合模型。缺省的選項是支持對象的聚合。


  對象對錯誤處理的支持(Support ISupportErrorInfo)


  選取這個選項可以在對象的運行過程中支持錯誤處理。缺省情況下這個選項不被選中。


  對象對連接點的支持(Support Connection Points)


  連接點是COM對象的事件機制。選中這個選項可以使待創(chuàng)建的COM對象具有發(fā)出事件的能力。缺省情況下該選項不被選中。


  對象對自由線程調(diào)度的支持(Free Thread Marshaller,簡稱FTM)


  對象的自由線程調(diào)度是對象在處于自由線程模型狀態(tài)下,為了簡化對象的訪問過程而采用的一種優(yōu)化策略。缺省情況下該選項不被選中。


  對于上述的任何一個選項的詳細(xì)描述都涉及到COM技術(shù)一些核心的內(nèi)容,并且都已超出本文的范圍,因此本文只對ATL給出的缺省選項加以說明,對這些內(nèi)容感興趣的讀者可以參考Microsoft提供的文檔。


  完成了上面的設(shè)置以后,就可以按"OK"按鈕完成對象的創(chuàng)建過程。下一步就是向所生成的ATL類的接口中加入成員函數(shù)的定義,以及接口成員函數(shù)的實現(xiàn)過程。


  3. 加入接口定義,實現(xiàn)接口函數(shù)


  加入了ATL類定義之后,我們可以打開Visual C++集成環(huán)境下項目管理器(Workspace)中的Class View來檢查生成的類定義的情況。我們可以看到一個新的類已經(jīng)生成,同時,還生成了相應(yīng)的接口定義。ATL Object Wizard為我們生成了類定義的.h 和.cpp文件,此外還有用于接口定義的IDL文件。有了這些文件以后,我們就可以為接口加入成員函數(shù),完成類的定義。


  首先在Class View中選中相應(yīng)的接口,顯示為接口IATLTest,單擊鼠標(biāo)右鍵打開菜單,如圖7。此彈出式菜單定義了為接口加入屬性和方法的操作。選取其中的"Add Method..."項,可以為接口加入方法成員;選取"Add Property..."則可以為接口加入新的屬性成員。


  加入屬性和方法的對話框可以參看圖8和圖9。如果我們要在接口中加入一個方法,則選取"Add Method..."菜單命令。假設(shè)方法名為ABC,方法的返回類型為COM規(guī)定的HRESULT類型。我們也可以定義非HRESULT返回類型的函數(shù),但是這需要手工修改接口定義的IDL文件。我們定義ABC方法的一個參數(shù)為a,類型為整數(shù)型。完成了方法的定義以后,單擊"OK"按鈕則把此方法加入到接口中。


  屬性的加入過程是類似的。屬性加入對話框要求指定屬性的類型、名字以及屬性的訪問方式。在屬性和方法的編輯對話框中都有一個"Attributes"按鈕,在給出了一個屬性或方法的基本定義之后,單擊此按鈕,可以對屬性和方法的一些有檔次特性進(jìn)行設(shè)置。


  方法成員加入以后,我們可以Class View來檢查ATL為我們所做的工作。首先我們看到ATL在接口的定義中加入了該方法的定義;同時在對應(yīng)的ATL類定義中,也加入了一個相應(yīng)的方法的定義;在類對應(yīng)的.cpp文件中,加入了此方法的實現(xiàn)框架。此后,我們只要在這個函數(shù)框架中加入該方法的代碼邏輯,一個接口函數(shù)的定義和實現(xiàn)就基本完成了。依照這種方式,我們可以完成整個COM對象的定義和實現(xiàn)。


  完成以上的步驟之后,我們就可以編譯連接應(yīng)用了。


  4. 編譯連接應(yīng)用、注冊COM服務(wù)程序


  對ATL工程的編譯連接過程包括下面的幾個步驟:


  使用MIDL編譯工程的IDL文件,形成接口定義的頭文件和用于調(diào)度(Marshalling)的代碼;


  編譯工程的.cpp文件形成目標(biāo)文件;


  連接目標(biāo)文件,形成應(yīng)用模塊;


  注冊COM服務(wù)程序。


  關(guān)于工程編譯連接的其它部分同Visual C++中MFC工程的編譯連接過程相似,這里只重點介紹一下COM服務(wù)程序的注冊過程。


  在ATL中,COM服務(wù)程序的注冊是在工程編譯連接的階段,由ATL輔助完成的。在手工的COM編程中,服務(wù)程序的注冊是比較麻煩的工作。在ATL中,系統(tǒng)讀取在建立工程過程中形成的注冊腳本文件來完成注冊工作。注冊腳本(Register Script 簡稱RGS)是ATL提供的文本方式的注冊輔助文件。下面是注冊腳本文件的一個實例。


  HKCR - 表示注冊表中COM對象的注冊項,是HKEY_CLASS_ROOT的縮寫


  {


  AuthTest.ActiveXObject.1 = s 'ActiveXObject Class'


  {


  CLSID = s ''


  } - 對象的ProgID


  AuthTest.ActiveXObject = s 'ActiveXObject Class'


  {


  CLSID = s ''


  } -對象的與版本無關(guān)的ProgID


  NoRemove CLSID -對象CLSID注冊項


  {


  ForceRemove = s 'ActiveXObject Class'


  {


  ProgID = s 'AuthTest.ActiveXObject.1'


  VersionIndependentProgID = s 'AuthTest.ActiveXObject'


  InprocServer32 = s '%MODULE% -服務(wù)器類型,表示DLL服務(wù)器


  {


  val ThreadingModel = s 'both' -線程模型,這里是BOTH型


  }


  }


  }


  }


  RGS文件包含注冊COM服務(wù)程序的各項內(nèi)容,通常我們不必修改此RGS文件,必要時我們也可以手工修改RGS文件來定制模塊的注冊過程。

我要咨詢 用戶留言
ATL
  • 公司名 新能源科技有限公司
  • 所在地 香港特別行政區(qū)  
  • 注冊資金 100 
項目統(tǒng)計
  • 共有 “ATL” 資訊0
  • 共有 “ATL” 問答1