无码视频在线观看,99人妻,国产午夜视频,久久久久国产一级毛片高清版新婚

  • 始創(chuàng)于2000年 股票代碼:831685
    咨詢熱線:0371-60135900 注冊(cè)有禮 登錄
    • 掛牌上市企業(yè)
    • 60秒人工響應(yīng)
    • 99.99%連通率
    • 7*24h人工
    • 故障100倍補(bǔ)償
    全部產(chǎn)品
    您的位置: 網(wǎng)站首頁(yè) > 幫助中心>文章內(nèi)容

    什么是ALT

    發(fā)布時(shí)間:  2012/9/18 11:52:42
       ATL究竟給開發(fā)人員帶來(lái)了什么樣的益處呢?這還要先從ATL產(chǎn)生以前的COM開發(fā)方式說(shuō)起。
      
        在ATL產(chǎn)生以前,開發(fā)COM組件的方法主要有兩種:一是使用COM SDK直接開發(fā)COM組件,另一種方式是通過(guò)MFC提供的COM支持來(lái)實(shí)現(xiàn)。
      
        直接使用COM SDK開發(fā)COM組件是最基本也是最靈活的方式。通過(guò)使用Microsoft提供的開發(fā)包,我們可以直接編寫COM程序。但是,這種開發(fā)方式的難度和工作量都很大,一方面,要求開發(fā)者對(duì)于COM的技術(shù)原理具有比較深入的了解(雖然對(duì)技術(shù)本身的深刻理解對(duì)使用任何一種工具都是非常有益的,但對(duì)于COM這樣一整套復(fù)雜的技術(shù)而言,在短時(shí)間內(nèi)完全掌握是很難的),另一方面,直接使用COM SDK要求開發(fā)人員自己去實(shí)現(xiàn)COM應(yīng)用的每一個(gè)細(xì)節(jié),完成大量的重復(fù)性工作。這樣做的結(jié)果是,不僅降低了工作效率,同時(shí)也使開發(fā)人員不得不把許多精力投入到與應(yīng)用需求本身無(wú)關(guān)的技術(shù)細(xì)節(jié)中。雖然這種開發(fā)方式對(duì)于某些特殊的應(yīng)用很有必要,但這種編程方式并不符合組件化程序設(shè)計(jì)方法所倡導(dǎo)的可重用性,因此,直接采用COM SDK不是一種理想的開發(fā)方式。
      
        使用MFC提供的COM支持開發(fā)COM應(yīng)用可以說(shuō)在使用COM SDK基礎(chǔ)上提高了自動(dòng)化程度,縮短了開發(fā)時(shí)間。MFC采用面向?qū)ο蟮姆绞綄OM的基本功能封裝在若干MFC的C++類中,開發(fā)者通過(guò)繼承這些類得到COM支持功能。為了使派生類方便地獲得COM對(duì)象的各種特性,MFC中有許多預(yù)定義宏,這些宏的功能主要是實(shí)現(xiàn)COM接口的定義和對(duì)象的注冊(cè)等通常在COM對(duì)象中要用到的功能。開發(fā)者可以使用這些宏來(lái)定制COM對(duì)象的特性。
      
        另外,在MFC中還提供對(duì)Automation 和 ActiveX Control的支持,對(duì)于這兩個(gè)方面,Visual C++也提供了相應(yīng)的AppWizard和ClassWizard支持,這種可視化的工具更加方便了COM應(yīng)用的開發(fā)。
      
        MFC對(duì)COM和OLE 的支持確實(shí)比手工編寫COM程序有了很大的進(jìn)步。但是MFC對(duì)COM的支持是不夠完善和徹底的,例如對(duì)COM接口定義的IDL語(yǔ)言,MFC并沒(méi)有任何支持,此外對(duì)于近些年來(lái)COM和ActiveX技術(shù)的新發(fā)展MFC也沒(méi)有提供靈活的支持。這是由MFC設(shè)計(jì)的基本出發(fā)點(diǎn)決定的。MFC被設(shè)計(jì)成對(duì)Windows平臺(tái)編程開發(fā)的面向?qū)ο蟮姆庋b,自然要涉及Windows編程的方方面面,COM作為Windows平臺(tái)編程開發(fā)的一個(gè)部分也得到MFC的支持,但是MFC對(duì)COM的支持是以其全局目標(biāo)為出發(fā)點(diǎn)的,因此對(duì)COM 的支持必然要服從其全局目標(biāo)。從這個(gè)方面而言,MFC對(duì)COM的支持不能很好的滿足開發(fā)者的要求。
      
        隨著Internet技術(shù)的發(fā)展,Microsoft將ActiveX技術(shù)作為其網(wǎng)絡(luò)戰(zhàn)略的一個(gè)重要組成部分大力推廣,然而使用MFC開發(fā)的ActiveX Control,代碼冗余量大(所謂的“肥代碼 Fat Code”),而且必須要依賴于MFC的運(yùn)行時(shí)刻庫(kù)才能正確地運(yùn)行。雖然MFC的運(yùn)行時(shí)刻庫(kù)只有部分功能與COM有關(guān),但是由于MFC的繼承實(shí)現(xiàn)的本質(zhì),ActiveX Control必須背負(fù)運(yùn)行時(shí)刻庫(kù)這個(gè)沉重的包袱。如果采用靜態(tài)連接MFC運(yùn)行時(shí)刻庫(kù)的方式,這將使ActiveX Control代碼過(guò)于龐大,在網(wǎng)絡(luò)上傳輸時(shí)將占據(jù)寶貴的網(wǎng)絡(luò)帶寬資源;如果采用動(dòng)態(tài)連接MFC運(yùn)行時(shí)刻庫(kù)的方式,這將要求瀏覽器一方必須具備MFC的運(yùn)行時(shí)刻庫(kù)支持。總之MFC對(duì)COM技術(shù)的支持在網(wǎng)絡(luò)應(yīng)用的環(huán)境下也顯得很不靈活。
      
        解決上述COM開發(fā)方法中的問(wèn)題正是ATL的基本目標(biāo)。
      
        首先ATL的基本目標(biāo)就是使COM應(yīng)用開發(fā)盡可能地自動(dòng)化,這個(gè)基本目標(biāo)就決定了ATL只面向COM開發(fā)提供支持。目標(biāo)的明確使ATL對(duì)COM技術(shù)的支持達(dá)到淋漓盡致的地步。對(duì)COM開發(fā)的任何一個(gè)環(huán)節(jié)和過(guò)程,ATL都提供支持,并將與COM開發(fā)相關(guān)的眾多工具集成到一個(gè)統(tǒng)一的編程環(huán)境中。對(duì)于COM/ActiveX的各種應(yīng)用,ATL也都提供了完善的Wizard支持。所有這些都極大地方便了開發(fā)者的使用,使開發(fā)者能夠把注意力集中在與應(yīng)用本身相關(guān)的邏輯上。
      
        其次,ATL因其采用了特定的基本實(shí)現(xiàn)技術(shù),擺脫了大量冗余代碼,使用ATL開發(fā)出來(lái)的COM應(yīng)用的代碼簡(jiǎn)練高效,即所謂的“Slim Code”。ATL在實(shí)現(xiàn)上盡可能采用優(yōu)化技術(shù),甚至在其內(nèi)部提供了所有C/C++開發(fā)的程序所必須具有的C啟動(dòng)代碼的替代部分。同時(shí)ATL產(chǎn)生的代碼在運(yùn)行時(shí)不需要依賴于類似MFC程序所需要的龐大的代碼模塊,包含在最終模塊中的功能是用戶認(rèn)為最基本和最必須的。這些措施使采用ATL開發(fā)的COM組件(包括ActiveX Control)可以在網(wǎng)絡(luò)環(huán)境下實(shí)現(xiàn)應(yīng)用的分布式組件結(jié)構(gòu)。
      
        第三,ATL的各個(gè)版本對(duì)Microsoft的基于COM的各種新的組件技術(shù)如MTS、ASP等都有很好的支持,ATL對(duì)新技術(shù)的反應(yīng)速度大大快于MFC。ATL已經(jīng)成為Microsoft支持COM應(yīng)用開發(fā)的主要開發(fā)工具,因此COM技術(shù)方面的新進(jìn)展在很短的時(shí)間內(nèi)都會(huì)在ATL中得到反映。這使開發(fā)者使用ATL進(jìn)行COM編程可以得到直接使用COM SDK編程同樣的靈活性和強(qiáng)大的功能。
      
        本文的目的就是希望在有限的篇幅中能夠使讀者對(duì)ATL的使用和基本原理有一個(gè)初步的了解,為廣大的COM開發(fā)人員更好地使用ATL開發(fā)起到拋磚引玉的作用。
      
        二、 ATL基本技術(shù)
      
        雖然使用ATL開發(fā)COM 應(yīng)用是一件非常簡(jiǎn)單的事情,但是在ATL簡(jiǎn)單易用的界面后面卻包含著復(fù)雜的技術(shù)。面對(duì)ATL生成的大量代碼,我們即使不去深入地了解這些代碼的含義也可以開發(fā)出COM應(yīng)用來(lái),但是如果我們要充分地挖掘ATL的潛力,開發(fā)出更靈活、強(qiáng)大的COM應(yīng)用,則必須對(duì)ATL使用的基本技術(shù)有所了解。研究ATL的實(shí)質(zhì)最好的教材就是由Visual C++提供的ATL源代碼。本文這一部分只是對(duì)ATL中用到的最基本的技術(shù)進(jìn)行簡(jiǎn)單的介紹。
      
        簡(jiǎn)單地說(shuō)來(lái),ATL中所使用的基本技術(shù)包括以下幾個(gè)方面:
      
        COM技術(shù) 
      
        C++模板類技術(shù)(Template) 
      
        C++多繼承技術(shù)(Multi-Inheritance) 
      
        COM技術(shù)是理解ATL的基礎(chǔ),使用ATL進(jìn)行開發(fā)要對(duì)COM技術(shù)的基本概念有最低限度的了解。由于COM是一項(xiàng)非常復(fù)雜龐大的技術(shù)體系,限于本文的篇幅,這里不再贅述。對(duì)于本文中提到的COM基本概念也不做過(guò)多的解釋,請(qǐng)讀者參閱有關(guān)的參考書籍。
      
        作為ATL最核心的實(shí)現(xiàn)技術(shù)的模板是對(duì)標(biāo)準(zhǔn)C++語(yǔ)言的擴(kuò)展,但是在大多數(shù)的C++編程環(huán)境中,人們很少使用它,這是因?yàn)槟0宓墓δ茈m然很強(qiáng),但是它內(nèi)部機(jī)制比較復(fù)雜,需要比較多的C++知識(shí)和經(jīng)驗(yàn)才能靈活地使用它。在MFC中的CObjectArray等功能類就是由模板來(lái)定義的。完全通過(guò)模板來(lái)定義程序的整體類結(jié)構(gòu),ATL是迄今為止做得最為成功的。
      
        所謂模板類簡(jiǎn)單地說(shuō)是對(duì)類的抽象。我們知道C++語(yǔ)言用類定義了構(gòu)造對(duì)象(這里指C++對(duì)象而不是COM對(duì)象)的方式,對(duì)象是類的實(shí)例,而模板類定義的是類的構(gòu)造方式,使用模板類定義實(shí)例化的結(jié)果產(chǎn)生的是不同的類。因此可以說(shuō)模板類是“類的類”。
      
        在C++語(yǔ)言中模板類的定義格式如下:
      
        注意:<和>是左右尖括號(hào),可能無(wú)法正常顯示。
     
      template < class T>
      class MyTemp
      {
      MyTemp<T>( ){ };
      ~MyTemp<T>( ) { };
      int MyFunc( int a) ;
      }
      ………….
      Int MyTemp<T>::MyFunc( int a)
      {
      } 
      
        首先使用C++的關(guān)鍵字“template”來(lái)聲明一個(gè)模板類的定義。在關(guān)鍵字后面是用尖括號(hào)括起來(lái)的類型參數(shù)。正是根據(jù)這個(gè)類型參數(shù),編譯器才能在編譯過(guò)程中將模板類的具體定義轉(zhuǎn)化為一個(gè)實(shí)際的類的定義,即生成一個(gè)新的類。接下來(lái)的定義方式與普通的類定義十分相似,只是在類的函數(shù)定義中都要帶有類型參數(shù)的說(shuō)明。
      
        下面的程序段說(shuō)明了模板類的用法:
     
      typedef MyTemp<MyClass> myclassfromtemp;
      myclassfromtemp m;
      int a = m.Myfunc(10); 
     
        通常在使用模板類時(shí)為了方便起見(jiàn),使用一個(gè)關(guān)鍵字“typedef”為新定義出來(lái)的類取一個(gè)名字。在上面的程序段中假設(shè)“MyClass”是一個(gè)由用戶定義的類,通過(guò)將這個(gè)類的名字作為類型參數(shù)傳遞給模板類,我們可以創(chuàng)建一個(gè)新的類,這個(gè)類的行為將以模板類的定義為基礎(chǔ),例如它具有模板類定義的所有成員函數(shù),同時(shí)這個(gè)類又是對(duì)模板類行為的一種修改,這種修改是通過(guò)用戶提供的類型參數(shù)來(lái)實(shí)現(xiàn)的。賦予模板類以不同的類型參數(shù),則得到行為框架相似但具體行為不同的一組類的集合。有了新的類的定義以后,我們可以象使用普通類一樣來(lái)創(chuàng)建一個(gè)類的實(shí)例,即一個(gè)新的對(duì)象,并且調(diào)用這個(gè)對(duì)象的成員函數(shù)。
      
        模板類是對(duì)標(biāo)準(zhǔn)C++語(yǔ)言的最新擴(kuò)展,雖然它的功能很強(qiáng)大,但是要想使用好模板類需要相當(dāng)多的關(guān)于語(yǔ)言和編程的經(jīng)驗(yàn)和知識(shí),而且錯(cuò)誤地使用模板類又會(huì)對(duì)程序的結(jié)構(gòu)和運(yùn)行效率帶來(lái)大的副作用,因此一般的編程環(huán)境和編程書籍對(duì)模板類的使用都采取謹(jǐn)慎的態(tài)度。而ATL的核心就是由幾十個(gè)模板類構(gòu)成的,通過(guò)研究ATL的源代碼可以使我們對(duì)模板類的使用有比較深刻全面的認(rèn)識(shí)。
      
        多繼承技術(shù)同模板一樣,是C++語(yǔ)言中極具爭(zhēng)議性的技術(shù)。使用多繼承技術(shù)可以使程序的設(shè)計(jì)和實(shí)現(xiàn)更加靈活,但是,由于多繼承的復(fù)雜性和自身概念上的一些問(wèn)題,使多繼承在各種面向?qū)ο蟮恼Z(yǔ)言環(huán)境中得到的支持都非常有限。例如Small Talk根本就不允許多繼承,同樣MFC也不支持多繼承技術(shù)。
      
        多繼承最大的問(wèn)題是所謂的“鉆石結(jié)構(gòu)”。例如下面的代碼:
     
      class A
      {
      .....
      };
      class B : public A
      { 
      .. .
      };
      class C : public A
      {
      .....
      };
      class D : public C,B
      {
      ........
      } 
      由于類D同時(shí)從類C和B繼承,因此在下面的語(yǔ)句中就會(huì)發(fā)生歧義:
      D* pD = new D;
      (A*)pD->Func(...); 
      由于類D通過(guò)類C和類B 分別繼承了類A,這里的強(qiáng)制轉(zhuǎn)化就會(huì)發(fā)生歧義。
      ATL使用了C++最新規(guī)范中加入的兩個(gè)運(yùn)算符號(hào) static_cast、dynamic_cast代替簡(jiǎn)單的強(qiáng)制轉(zhuǎn)化,從而消除多繼承帶來(lái)的歧義。使用這兩個(gè)運(yùn)算符號(hào),我們可以在對(duì)象運(yùn)行過(guò)程中獲取對(duì)象的類型信息。上面的代碼可以采用下面的方式修改:
      D* pD = new D;
      static_cast<A*>(static_cast<B*>(pD))->Func(...); 
      為什么模板類和多繼承技術(shù)會(huì)成為ATL主要的工具呢?原因在于,采用模板可以在編譯過(guò)程中快速的生成具有用戶定制功能的類,這對(duì)于COM這樣一個(gè)復(fù)雜的技術(shù)體系在實(shí)現(xiàn)效率上得到了很大的提高。通過(guò)使用模板類,用戶可以把精力集中在自己開發(fā)的類的基本邏輯上,在完成了自己的類的設(shè)計(jì)以后,通過(guò)繼承不同的類,生成不同的模板類,就可以快速地實(shí)現(xiàn)COM的功能,同時(shí)又避免了采用單繼承結(jié)構(gòu)造成的大量功能冗余。
      總之,正是由于在設(shè)計(jì)實(shí)現(xiàn)過(guò)程中采用了模板類和多繼承技術(shù),才使ATL成為一個(gè)小巧靈活的COM開發(fā)工具,能夠適應(yīng)開發(fā)人員對(duì)COM應(yīng)用開發(fā)的各種需要。
      三. ATL基本使用 
      這一部分將重點(diǎn)介紹ATL的基本使用過(guò)程。由于ATL已經(jīng)被集成在Microsoft Visulal Studio的Visual C++開發(fā)環(huán)境中,因此要使用ATL必須先安裝Visual C++。在下面的討論中有關(guān)COM的基本知識(shí)請(qǐng)參閱有關(guān)的文檔,這里不再詳細(xì)說(shuō)明。給出的圖是在Microsoft Windows 98平臺(tái)下Visual Studio 6.0的使用示意圖。
      使用ATL開發(fā)一個(gè)COM應(yīng)用基本可以分為以下幾個(gè)步驟:
      創(chuàng)建一個(gè)新的ATL工程,并對(duì)工程的選項(xiàng)進(jìn)行適當(dāng)?shù)呐渲谩?nbsp;
      向新創(chuàng)建的工程添加新的ATL類,并對(duì)該類進(jìn)行一些初始配置工作。 
      根據(jù)COM應(yīng)用的基本要求向新的ATL類加入新的接口定義,并實(shí)現(xiàn)相應(yīng)的接口成員函數(shù)。 
      編譯連接工程,注冊(cè)COM應(yīng)用。 
      下面將根據(jù)這些步驟依次介紹ATL的基本使用過(guò)程。
      1. 創(chuàng)建工程
      首先啟動(dòng)Visual C++集成開發(fā)環(huán)境,選擇“File”菜單下的“New...”命令,在“New”對(duì)話框中選擇“Project”頁(yè)。
      選擇“ATL COM AppWizard”項(xiàng),這是創(chuàng)建ATL工程的AppWizard向?qū)肟。然后?ldquo;Project name”編輯框中輸入工程的名字,單擊“OK”按鈕,進(jìn)入AppWizard對(duì)話框。
      在AppWizard對(duì)話框中主要的設(shè)置選項(xiàng)有:
      COM服務(wù)程序的類型:
      - 動(dòng)態(tài)連接庫(kù)(Dynamic Linking Library) 最終產(chǎn)生一個(gè)動(dòng)態(tài)連接庫(kù)(DLL)形式的COM服務(wù)程序;
      - 應(yīng)用程序(Executable application)最終產(chǎn)生一個(gè)可執(zhí)行程序類型(EXE)的COM服務(wù)程序;
      - NT服務(wù)(NT Service):產(chǎn)生一個(gè)以NT服務(wù)方式運(yùn)行的COM服務(wù)程序。 
      允許嵌入Proxy/Stub代碼。由Microsoft提供的MIDL編譯IDL文件以后,將產(chǎn)生用于對(duì)象調(diào)度(Marshaling)的Proxy/Stub的代碼。傳統(tǒng)地,這部分代碼與COM服務(wù)程序的代碼是分離的,但是由于新的COM標(biāo)準(zhǔn)支持多線程環(huán)境下的COM對(duì)象服務(wù),因此在動(dòng)態(tài)連接庫(kù)的COM服務(wù)程序中也要有Proxy/Stub的支持。為了支持在網(wǎng)絡(luò)上的傳輸,ATL允許用戶選擇將Proxy/Stub的代碼包括在生成的DLL代碼中。這個(gè)選項(xiàng)在EXE和NT服務(wù)類型的COM應(yīng)用條件下不可選。 
      允許支持MFC。由于ATL對(duì)除COM以外的基本的Windows編程方面的支持極為有限,同時(shí)許多程序員對(duì)MFC又非常熟悉,因此在ATL的工程設(shè)置中允許在ATL工程內(nèi)部支持使用MFC,即可以使用MFC定義的類。這在一方面來(lái)看是非常方便的,特別是對(duì)于習(xí)慣于使用MFC的開發(fā)人員來(lái)說(shuō),能夠使用MFC提供的各種功能強(qiáng)大的類的支持,而不必直接使用Windows SDK。從另一個(gè)方面來(lái)看,在ATL工程中使用MFC同時(shí)就喪失了ATL代碼輕量級(jí)的特點(diǎn)。 
      支持MTS。MTS是Microsoft Transaction Server的縮寫,它是Microsoft在COM技術(shù)方面的一個(gè)新的分支,這里不作詳細(xì)說(shuō)明。 
      完成上面的設(shè)置以后,可以選擇FINISH完成工程的設(shè)置,ATL將創(chuàng)建相應(yīng)的工程。
      2. 加入ATL類
      完成工程的創(chuàng)建和設(shè)置以后,下一步就是向工程中加入一個(gè)新的ATL類。Visual Studio集成環(huán)境提供了向?qū)Чぞ?ldquo;ATL Object Wizard”用于加入一個(gè)新的ATL類。操作過(guò)程并不復(fù)雜,只是一組對(duì)話框操作而已。
      首先通過(guò)集成環(huán)境的“Insert”菜單下的“New ATL Object…”命令進(jìn)入“ATL Object Wizard”對(duì)話框。
      這個(gè)對(duì)話框即為創(chuàng)建ATL對(duì)象的向?qū)鹗冀缑妗?duì)話框的左邊部分說(shuō)明了待創(chuàng)建對(duì)象的基本類型,這里主要有以下的幾種類型:
      對(duì)象(Object)基本的COM對(duì)象類型; 
      控制(Control)ActiveX Control類型的ATL對(duì)象; 
      其他(Miscellaneous)輔助功能,如對(duì)話框的生成等; 
      數(shù)據(jù)訪問(wèn)(Data Access)數(shù)據(jù)訪問(wèn),支持MTS等。 
      右邊部分說(shuō)明了每種類型的詳細(xì)內(nèi)容,對(duì)于一般的COM服務(wù)程序,使用對(duì)象表中的簡(jiǎn)單對(duì)象(Simple Object)就可以了。
      選定待創(chuàng)建對(duì)象的基本類型以后,單擊“Next>”按鈕進(jìn)入下一步,進(jìn)入對(duì)象屬性設(shè)置對(duì)話框,如圖4和圖5所示。
      對(duì)象屬性設(shè)置分為兩個(gè)過(guò)程:先是對(duì)象名字標(biāo)識(shí)的設(shè)定,然后是對(duì)對(duì)象的基本屬性進(jìn)行設(shè)置。首先是對(duì)象的名字標(biāo)識(shí)設(shè)置。
      在對(duì)象標(biāo)識(shí)編輯框中輸入待創(chuàng)建對(duì)象的名字,ATL對(duì)象向?qū)⑼降馗鶕?jù)用戶輸入的對(duì)象標(biāo)識(shí)設(shè)定該對(duì)象的C++標(biāo)識(shí)和COM標(biāo)識(shí)。對(duì)象的C++標(biāo)識(shí)包括對(duì)象的類名,cpp文件名和頭文件名。COM標(biāo)識(shí)包括對(duì)象在類型庫(kù)中的CoClass段和實(shí)現(xiàn)的主接口的名字,同時(shí)還有在系統(tǒng)注冊(cè)表中的類型名以及ProgID。
      對(duì)象名字標(biāo)識(shí)設(shè)置完成以后,選擇對(duì)象屬性頁(yè)(Attribute)進(jìn)入對(duì)象的屬性設(shè)置頁(yè)面。
      對(duì)象的屬性設(shè)置是ATL對(duì)象創(chuàng)建過(guò)程中最復(fù)雜的部分,包括以下幾個(gè)主要部分:
      對(duì)象的線程模型(Thread Model)
      對(duì)象的線程模型是COM對(duì)象在多線程環(huán)境下被訪問(wèn)時(shí)對(duì)訪問(wèn)方式的控制,缺省情況下在ATL中采用的是套間模型Apartment,由系統(tǒng)通過(guò)消息隊(duì)列方式提供并發(fā)控制。 
      對(duì)象的接口模型(Interface)
      COM對(duì)象的接口可以是雙接口(Dual Interface)。雙接口不同于普通接口(Custom Interface) 之處在于雙接口是從Automation基本接口IDispatch繼承的,而普通接口是從IUnknown接口直接繼承來(lái)的。缺省的接口模型是雙接口。 
      對(duì)象的聚合模型(Aggregate)
      COM規(guī)范不允許對(duì)象的實(shí)現(xiàn)繼承,但是可以通過(guò)聚合方式重用其它的COM對(duì)象。ATL對(duì)象屬性設(shè)置中的聚合模型可以指定待創(chuàng)建的COM對(duì)象是否支持聚合模型。缺省的選項(xiàng)是支持對(duì)象的聚合。 
      對(duì)象對(duì)錯(cuò)誤處理的支持(Support ISupportErrorInfo)
      選取這個(gè)選項(xiàng)可以在對(duì)象的運(yùn)行過(guò)程中支持錯(cuò)誤處理。缺省情況下這個(gè)選項(xiàng)不被選中。 
      對(duì)象對(duì)連接點(diǎn)的支持(Support Connection Points)
      連接點(diǎn)是COM對(duì)象的事件機(jī)制。選中這個(gè)選項(xiàng)可以使待創(chuàng)建的COM對(duì)象具有發(fā)出事件的能力。缺省情況下該選項(xiàng)不被選中。 
      對(duì)象對(duì)自由線程調(diào)度的支持(Free Thread Marshaller, 簡(jiǎn)稱FTM)
      對(duì)象的自由線程調(diào)度是對(duì)象在處于自由線程模型狀態(tài)下,為了簡(jiǎn)化對(duì)象的訪問(wèn)過(guò)程而采用的一種優(yōu)化策略。缺省情況下該選項(xiàng)不被選中。 
      對(duì)于上述的任何一個(gè)選項(xiàng)的詳細(xì)描述都涉及到COM技術(shù)一些核心的內(nèi)容,并且都已超出本文的范圍,因此本文只對(duì)ATL給出的缺省選項(xiàng)加以說(shuō)明,對(duì)這些內(nèi)容感興趣的讀者可以參考Microsoft提供的文檔。
      完成了上面的設(shè)置以后,就可以按“OK”按鈕完成對(duì)象的創(chuàng)建過(guò)程。下一步就是向所生成的ATL類的接口中加入成員函數(shù)的定義,以及接口成員函數(shù)的實(shí)現(xiàn)過(guò)程。
      3. 加入接口定義,實(shí)現(xiàn)接口函數(shù) 
      加入了ATL類定義之后,我們可以打開Visual C++集成環(huán)境下項(xiàng)目管理器(Workspace)中的Class View來(lái)檢查生成的類定義的情況。我們可以看到一個(gè)新的類已經(jīng)生成,同時(shí),還生成了相應(yīng)的接口定義。ATL Object Wizard為我們生成了類定義的.h 和.cpp文件,此外還有用于接口定義的IDL文件。有了這些文件以后,我們就可以為接口加入成員函數(shù),完成類的定義。
      首先在Class View中選中相應(yīng)的接口,顯示為接口IATLTest,單擊鼠標(biāo)右鍵打開菜單,如圖7。此彈出式菜單定義了為接口加入屬性和方法的操作。選取其中的“Add Method...”項(xiàng),可以為接口加入方法成員;選取“Add Property...”則可以為接口加入新的屬性成員。
      加入屬性和方法的對(duì)話框可以參看圖8和圖9。如果我們要在接口中加入一個(gè)方法,則選取“Add Method...”菜單命令。假設(shè)方法名為ABC,方法的返回類型為COM規(guī)定的HRESULT類型。我們也可以定義非HRESULT返回類型的函數(shù),但是這需要手工修改接口定義的IDL文件。我們定義ABC方法的一個(gè)參數(shù)為a,類型為整數(shù)型。完成了方法的定義以后,單擊“OK”按鈕則把此方法加入到接口中。
      屬性的加入過(guò)程是類似的。屬性加入對(duì)話框要求指定屬性的類型、名字以及屬性的訪問(wèn)方式。在屬性和方法的編輯對(duì)話框中都有一個(gè)“Attributes”按鈕,在給出了一個(gè)屬性或方法的基本定義之后,單擊此按鈕,可以對(duì)屬性和方法的一些高級(jí)特性進(jìn)行設(shè)置。
      方法成員加入以后,我們可以通過(guò)Class View來(lái)檢查ATL為我們所做的工作。首先我們看到ATL在接口的定義中加入了該方法的定義;同時(shí)在對(duì)應(yīng)的ATL類定義中,也加入了一個(gè)相應(yīng)的方法的定義;在類對(duì)應(yīng)的.cpp文件中,加入了此方法的實(shí)現(xiàn)框架。此后,我們只要在這個(gè)函數(shù)框架中加入該方法的代碼邏輯,一個(gè)接口函數(shù)的定義和實(shí)現(xiàn)就基本完成了。依照這種方式,我們可以完成整個(gè)COM對(duì)象的定義和實(shí)現(xiàn)。
      完成以上的步驟之后,我們就可以編譯連接應(yīng)用了。
      4. 編譯連接應(yīng)用、注冊(cè)COM服務(wù)程序
      對(duì)ATL工程的編譯連接過(guò)程包括下面的幾個(gè)步驟:
      使用MIDL編譯工程的IDL文件,形成接口定義的頭文件和用于調(diào)度(Marshalling)的代碼; 
      編譯工程的.cpp文件形成目標(biāo)文件; 
      連接目標(biāo)文件,形成應(yīng)用模塊; 
      注冊(cè)COM服務(wù)程序。 
      關(guān)于工程編譯連接的其它部分同Visual C++中MFC工程的編譯連接過(guò)程相似,這里只重點(diǎn)介紹一下COM服務(wù)程序的注冊(cè)過(guò)程。
      在ATL中,COM服務(wù)程序的注冊(cè)是在工程編譯連接的最后階段,由ATL輔助完成的。在手工的COM編程中,服務(wù)程序的注冊(cè)是比較麻煩的工作。在ATL中,系統(tǒng)通過(guò)讀取在建立工程過(guò)程中形成的注冊(cè)腳本文件來(lái)完成注冊(cè)工作。注冊(cè)腳本(Register Script 簡(jiǎn)稱RGS)是ATL提供的文本方式的注冊(cè)輔助文件。下面是注冊(cè)腳本文件的一個(gè)實(shí)例。
      HKCR - 表示注冊(cè)表中COM對(duì)象的注冊(cè)項(xiàng),是HKEY_CLASS_ROOT的縮寫
      {
      AuthTest.ActiveXObject.1 = s 'ActiveXObject Class'
      {
      CLSID = s ''
      } - 對(duì)象的ProgID
      AuthTest.ActiveXObject = s 'ActiveXObject Class'
      {
      CLSID = s ''
      } -對(duì)象的與版本無(wú)關(guān)的ProgID
      NoRemove CLSID -對(duì)象CLSID注冊(cè)項(xiàng)
      {
      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文件包含注冊(cè)COM服務(wù)程序的各項(xiàng)內(nèi)容,通常我們不必修改此RGS文件,必要時(shí)我們也可以手工修改RGS文件來(lái)定制模塊的注冊(cè)過(guò)程。
      四. 應(yīng)用ATL的一個(gè)例子
      上面介紹了使用ATL創(chuàng)建一個(gè)COM服務(wù)程序的基本過(guò)程。在介紹過(guò)程中,我們實(shí)際上已經(jīng)生成了一個(gè)COM服務(wù)程序的基本框架,只是沒(méi)有填寫實(shí)際的內(nèi)容。在下面部分,我們實(shí)際開發(fā)一個(gè)十分簡(jiǎn)單的COM服務(wù)程序,并且為它編寫一段客戶代碼進(jìn)行測(cè)試,使大家對(duì)使用ATL開發(fā)COM服務(wù)程序的過(guò)程有一個(gè)全面整體的了解。
      我們要開發(fā)的服務(wù)程序的功能很簡(jiǎn)單,它只實(shí)現(xiàn)一個(gè)接口,這個(gè)接口名字是ISimpleInterface,接口只有一個(gè)成員函數(shù),叫做Welcome。這個(gè)函數(shù)的功能只是輸出一個(gè)“Hello World!”的字符串。
      按照上一部分介紹的創(chuàng)建COM服務(wù)程序的步驟,我們進(jìn)行如下的操作:
      1 打開Visual C++集成開發(fā)環(huán)境;
      2 創(chuàng)建一個(gè)稱為SimpleTest的ATL工程;
      3 在這個(gè)工程中插入新的對(duì)象,對(duì)象的名字是SimpleInterface;
      4 設(shè)置接口ISimpleInterface的有關(guān)屬性,使它成為一個(gè)雙接口;
      5 在對(duì)象的接口ISimpleInterface中加入方法Welcome;
      6 打開ATL加入的Welcome方法的框架,可以看到如下的代碼段:
      STDMETHODIMP CActiveXObject::get_TestProp(long *pVal)
      {
      AFX_MANAGE_STATE(AfxGetStaticModuleState())
      // TODO: Add your implementation code here
      return S_OK;
      } 
      7 將程序框架中的注釋部分替換為下面的代碼:
      ::MessageBox(NULL,_T(”Hello World!”),_T(”Welcome”), MB_OK);
      Welcome方法被調(diào)用時(shí)將彈出一個(gè)消息框。
      8 編譯連接工程。
      上面的步驟完成以后,我們就有了一個(gè)簡(jiǎn)單的COM服務(wù)程序,而且已經(jīng)被注冊(cè)到當(dāng)前系統(tǒng)中。
      下面我們要完成一個(gè)簡(jiǎn)單的COM客戶程序。一個(gè)COM客戶程序簡(jiǎn)單地說(shuō)是使用COM組件對(duì)象的程序。客戶程序調(diào)用COM對(duì)象的基本流程是:
      創(chuàng)建COM對(duì)象的實(shí)例。這可以通過(guò)調(diào)用Windows系統(tǒng)的API函數(shù)CoCreateInstance來(lái)完成。 
      通過(guò)接口調(diào)用函數(shù)。 
      調(diào)用IUnknown::Release釋放COM對(duì)象實(shí)例 
      我們的客戶程序是使用MFC編寫的一個(gè)基于對(duì)話框的簡(jiǎn)單應(yīng)用程序。具體的過(guò)程如下:
      1 打開Visual C++集成開發(fā)環(huán)境;
      創(chuàng)建一個(gè)稱為SimpleClient的基于對(duì)話框的MFC工程; 
      在對(duì)話框中加入一個(gè)按鈕,名字為TEST; 
      在SimpleClient.cpp文件中加入如下的代碼: 
      (1) 在cpp文件 #include “simpleclientdlg.h”之后加入下面的代碼:
      #include “d:\simpletest\simpletest_i.h” // 根據(jù)需要修改頭文件的路徑
      加入的頭文件是在編譯COM服務(wù)程序過(guò)程中自動(dòng)生成的,其中包含接口本身的定義、接口IID的定義和COM對(duì)象的CLSID的定義。包含該頭文件可以使客戶程序能夠使用COM服務(wù)程序。
      (2) 在按鈕TEST的消息控制函數(shù)中加入如下的代碼:
      HRESULT hr; 
      ISimpleInterface* pIntf = NULL;
      hr = CoCreateInstance(CLSID_SimpleInterface, NULL, CLSCTX_SERVER , 
      IID_ISimpleInterface, (void **)& pIntf);
      if(SUCCEEDED(hr))
      {
      pIntf->Welcome();
      pIntf->Release();
      } 
      上面的代碼首先通過(guò)系統(tǒng)API CoCreateInstance創(chuàng)建COM對(duì)象,得到接口的指針,然后調(diào)用接口成員函數(shù)Welcome,最后通過(guò)IUnknown::Release()函數(shù)釋放COM對(duì)象實(shí)例。
      編譯連接客戶程序
    最后,我們可以測(cè)試客戶程序是否正常運(yùn)行。啟動(dòng)客戶程序,當(dāng)單擊“TEST”按鈕時(shí)我們可以看到彈出一個(gè)消息框,這正是我們的COM服務(wù)程序提供的功能。    
    本文出自:億恩科技【mszdt.com】

    服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]

  • 您可能在找
  • 億恩北京公司:
  • 經(jīng)營(yíng)性ICP/ISP證:京B2-20150015
  • 億恩鄭州公司:
  • 經(jīng)營(yíng)性ICP/ISP/IDC證:豫B1.B2-20060070
  • 億恩南昌公司:
  • 經(jīng)營(yíng)性ICP/ISP證:贛B2-20080012
  • 服務(wù)器/云主機(jī) 24小時(shí)售后服務(wù)電話:0371-60135900
  • 虛擬主機(jī)/智能建站 24小時(shí)售后服務(wù)電話:0371-60135900
  • 專注服務(wù)器托管17年
    掃掃關(guān)注-微信公眾號(hào)
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權(quán)所有  地址:鄭州市高新區(qū)翠竹街1號(hào)總部企業(yè)基地億恩大廈  法律顧問(wèn):河南亞太人律師事務(wù)所郝建鋒、杜慧月律師   京公網(wǎng)安備41019702002023號(hào)
      1
     
     
     
     

    0371-60135900
    7*24小時(shí)客服服務(wù)熱線