欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
《ATL Internals》書(shū)評

關(guān)鍵字 ATL
原作者姓名 潘愛(ài)民
文章原始出處 http://www.vchelp.net/

正文
《ATL Internals》書(shū)評
潘愛(ài)民 提供 2000/06/12
ATL之深入淺出

介紹一本關(guān)于A(yíng)TL的書(shū)《ATL Internals》


潘愛(ài)民,5月7日,2000年

北京大學(xué)計算機研究所,100871

引言

面對計算機圖書(shū)市場(chǎng)的繁榮景象,我經(jīng)常感嘆今天學(xué)習計算機開(kāi)發(fā)技術(shù)的同道們是多么幸運。十年前,我們學(xué)習計算機語(yǔ)言非常不容易,要掌握各種開(kāi)發(fā)工具只有靠自己的摸索和極少量的參考手冊。我記得,94年我學(xué)習Visual C++和MFC的時(shí)候,基本上只有靠軟件自帶的聯(lián)機幫助;現在情形大不同了,書(shū)店中的計算機圖書(shū)琳瑯滿(mǎn)目,關(guān)于Visual C++和MFC的書(shū)籍尤其多。有幾位編輯朋友勸我寫(xiě)一點(diǎn)這方面的書(shū),我覺(jué)得不大有必要了,因為Visual C++的好書(shū)已經(jīng)不少了,適合各種讀者層次的書(shū)籍幾乎都可以買(mǎi)到,而且有一些書(shū)還相當不錯。不過(guò),在98年的時(shí)候,我感覺(jué)關(guān)于COM書(shū)籍實(shí)在太少,幾乎沒(méi)有,于是我下定決心,自己寫(xiě)一本關(guān)于COM的書(shū)籍,在99年底的時(shí)候由清華出版社出版。很快地,關(guān)于COM的書(shū)籍已經(jīng)很多了,有些國外的名著(zhù)也相繼引入國內。從這十多年的計算機開(kāi)發(fā)技術(shù)歷史來(lái)看,一門(mén)技術(shù)只要有很多的書(shū)籍來(lái)介紹,那么這項技術(shù)很快就會(huì )普及,否則就難以推廣。

說(shuō)到COM,相信在Windows平臺上有過(guò)開(kāi)發(fā)經(jīng)驗的朋友一定接觸過(guò),它是Windows操作系統的基本軟件模型,從93年建立以來(lái),為Windows平臺的推廣和發(fā)展做出了不可磨滅的貢獻,而且其自身還在不斷發(fā)展。但是要真正開(kāi)發(fā)COM組件并不是很輕松,在Visual C++中,我們既可以使用MFC也可以使用ATL。MFC完全面向Windows應用,它用C++的封裝技術(shù)建立了一套適合于開(kāi)發(fā)Windows應用的C++類(lèi)庫,雖然在后期的版本中MFC提供了大量的COM支持,但是從基本的設計結構上講,MFC不適合于開(kāi)發(fā)專(zhuān)業(yè)的COM組件,它適合于在Windows應用的基礎上提供相應的COM支持。

ATL則不同于MFC,它完全面向COM組件,其技術(shù)路線(xiàn)也不同于MFC,MFC使用的是C++中的繼承、封裝、嵌套等常規技術(shù),而ATL使用了C++中模板、多繼承等高級技術(shù),甚至還用到了STL。所以學(xué)習和使用ATL要求我們必須熟悉這些C++高級特性。另一方面,ATL結構完全針對COM中的諸多規范,這就要求使用人員必須非常了解COM規范,才有可能真正把ATL用好。

雖然目前關(guān)于MFC的書(shū)籍很多,但是完全介紹ATL的書(shū)籍非常少,甚至根本沒(méi)有,這不能不說(shuō)是一個(gè)遺憾。我有幸在今年2月份看到一本ATL的英文原版書(shū)《ATL Internals》,本文將為大家介紹這本書(shū)。

在看這本書(shū)之前,我對ATL已經(jīng)有了基本的了解,98年底由于寫(xiě)作的需要,我曾經(jīng)讀過(guò)ATL的部分源碼,對于A(yíng)TL的基本結構還算清楚。我剛開(kāi)始看到這本書(shū)的時(shí)候,快速讀了一章,并沒(méi)有感覺(jué)這本書(shū)有多好,后來(lái)由于工作忙碌的原因,一直沒(méi)有得閑,直到最近,我才仔細把這本書(shū)讀了一遍,感覺(jué)這是一本不可多得的好書(shū)。以前我很少仔細閱讀開(kāi)發(fā)技術(shù)類(lèi)的書(shū)籍,一則是由于自己讀書(shū)太慢,二則是往往開(kāi)發(fā)技術(shù)類(lèi)的書(shū)籍不大值得精讀。但是這本書(shū)我讀得很仔細,因為這本書(shū)把ATL的精華幾乎全表述出來(lái)了,ATL中的許多內容都能讓你為之心動(dòng),作為一個(gè)程序員,這也是一個(gè)學(xué)習和提高的機會(huì )。

我寫(xiě)這篇文章的意圖不僅僅是向讀者介紹這本書(shū),我也希望能夠把我在閱讀過(guò)程中的心得與大家分享。同時(shí)我還希望能夠按照這本書(shū)的路線(xiàn),向大家介紹一下ATL的結構和機理。

準備閱讀

《ATL Internals》由Addison-Wesley出版社出版,作者為Brent Rector和Chris Sells,出版時(shí)間為1999年2月,全書(shū)600多頁(yè)。關(guān)于這本書(shū)的背景知識可能對于許多COM迷和ATL迷來(lái)說(shuō)很有意思。首先,這本書(shū)的序言是由ATL的發(fā)明人Jim Springfield所撰寫(xiě),在序言中,Jim介紹了ATL的歷史,對于書(shū)中所介紹的內容大加贊賞,稱(chēng)贊“閱讀此書(shū)可以學(xué)到許多閱讀源碼所不能掌握的內容”,在序言的最后,Jim還談到了ATL的將來(lái)。

其次,在作者寫(xiě)的自序中,他們提到了ATL離不開(kāi)COM,要想掌握ATL,就一定要先掌握COM。ATL是一個(gè)產(chǎn)生C++/COM代碼的框架,就如同C語(yǔ)言是一個(gè)產(chǎn)生匯編代碼的框架,這個(gè)觀(guān)點(diǎn)頗為新穎,仔細想來(lái),確是如此。作者特別推薦了Don Box的書(shū)《Essential COM》,其實(shí)在英文書(shū)中,COM書(shū)籍不少,這顯示出兩位作者與Don Box的關(guān)系非同一般。我記得Don Box也曾經(jīng)推薦過(guò)《ATL Internals》這本書(shū),如果讀者有機會(huì )到亞馬遜網(wǎng)上書(shū)店(www.amazon.com)看看本書(shū)的書(shū)評就可以知道他們之間有很親密的關(guān)系,其中作者之一Chris Sells與Don Box以及另外兩人合作寫(xiě)了一本COM的書(shū)《Effective COM》(本書(shū)文中有多處推薦了這本書(shū))。我相信他們的互薦是基于相互之間絕對了解的基礎之上的,他們都是COM頂尖高手,也是ATL頂尖高手,讀者經(jīng)??梢栽贛SJ(Microsoft System Journal)雜志上看到他們的文章。

誠如作者所言,閱讀此書(shū)需要極強的預備知識,按照我閱讀此書(shū)之后的理解,讀者在閱讀此書(shū)之前應該有以下幾方面的準備知識:


一定要懂COM。ATL完全針對COM,許多細節都是為了更好地實(shí)現COM而設計。如果讀者僅僅看過(guò)《Inside COM》(清華大學(xué)出版社出版的《COM技術(shù)內幕》),那么要想通篇閱讀《ATL Internals》還不夠,建議讀者再找其他的資料看一看。


一定要懂C++的模板技術(shù)。ATL充分發(fā)揮模板的優(yōu)勢,其整個(gè)體系結構完全建立在模板的基礎之上,如果讀者不熟悉模板,那么幾乎無(wú)法閱讀ATL。


基本了解STL(可選)。ATL的集合類(lèi)和枚舉類(lèi)用到了STL,當然,如果讀者不懂STL,基本不影響全局的理解,但是STL中容器的思想和COM集合對象的思想是相通的,ATL把兩者有機地統一起來(lái)了。

所以說(shuō),《ATL Internals》是一本起點(diǎn)很高的書(shū),原因在于A(yíng)TL是一門(mén)起點(diǎn)很高的技術(shù)。據我所知,現在有許多程序員已經(jīng)在使用ATL了,這是好現象,說(shuō)明我們國內的程序員水平相當高,雖然我們的資料信息還不夠豐富(至少對于A(yíng)TL而言是這樣),但是我們仍然緊跟這些新的技術(shù)。盡管如此,要想真正用好ATL,一定要了解ATL的機理,這不同于MFC的情形。假如我們不懂MFC的機理,一樣可以做出很好的程序,利用MFC,在不懂OLE細節的情況下,一樣可以提供OLE的支持。ATL要求我們很細致地調節它的類(lèi),根據需要選擇合適的模板類(lèi),必要時(shí)還要修正它的行為。ATL盡管已經(jīng)到了3.0版本,但是仍然有不少的錯誤,這本書(shū)已經(jīng)指出了一些錯誤,但我相信肯定還會(huì )有更多的錯誤,這對程序員提出了更高的要求,確實(shí)是這樣,因此結論是:使用ATL一定要懂ATL!

盡管我這樣說(shuō),但我還是認為ATL是一項好技術(shù)、是一個(gè)好的COM模板類(lèi)庫。而且我也深感好書(shū)對于A(yíng)TL程序員的重要性,有些東西是不能從源碼和參考手冊獲得的,既然我看到了這本好書(shū),那我應該把這本書(shū)介紹出來(lái),讓大家知道這本書(shū)。也讓大家分享我的體會(huì )。如果有那家出版社能夠引進(jìn)這本書(shū)的話(huà),則是我們廣大ATL程序員的福音了。

內容介紹

下面我按照《ATL Internals》的敘述順序,逐項介紹ATL的內容,希望讀者不僅能夠了解本書(shū)的內容,也能夠借此了解ATL的機理。原書(shū)共包括十一章,我按照每一章所介紹的內容把這十一章分成四個(gè)部分。


第一部分 ATL的使用和功能展示

這一部分篇幅很小,只有短短的一章內容,讀起來(lái)非常輕松。初時(shí)我以為整本書(shū)都是這樣的,所以感覺(jué)這也是一本指南性質(zhì)的書(shū),當時(shí)就沒(méi)有太重視。

在這一章里,作者簡(jiǎn)單介紹了ATL的概念,然后通過(guò)AppWizard和ATL Object Wizard創(chuàng )建COM服務(wù)程序和COM對象類(lèi)的過(guò)程逐項介紹了Wizard中各個(gè)選項的含義。有了基本的工程框架和對象類(lèi)框架之后,作者開(kāi)始展示ATL的一些其他特性:


添加屬性和方法。


增加另外的接口。


提供腳本支持。


提供永久特性,增加永久接口。


加入事件支持,利用COM的可連接對象特性。


對窗口的支持。


實(shí)現組件類(lèi)別(component category)支持。


增加用戶(hù)界面特性,用ATL開(kāi)發(fā)ActiveX控制。


怎樣包容ActiveX控制。

作者介紹這些內容非常簡(jiǎn)捷,但是能夠讓讀者有一些基本的印象,在閱讀后續內容之前對ATL有一個(gè)清晰的思路。如果讀者對COM比較熟悉而且曾經(jīng)有過(guò)ATL開(kāi)發(fā)經(jīng)驗的話(huà),讀這部分內容會(huì )非常輕松。


第二部分 ATL實(shí)現COM:基礎部分

這部分介紹了ATL實(shí)現COM的基本方法,包括四章內容,分別如下:ATL Smart Types、Objects in ATL、COM Servers、Interface Maps。這四章內容是ATL的精華所在,也是這本書(shū)的精華所在,如果說(shuō)全書(shū)其他的內容都是可讀可不讀的話(huà),那么這部分的內容則是不可不讀的。

第二章介紹了ATL的智能類(lèi)型(smart type),包括字符串類(lèi)型、VARIANT類(lèi)型以及接口指針類(lèi)型。COM規范要求所有的字符必須用雙字節字符,不是我們常用的ANSI字符,所以對于字符串的處理往往是我們編程工作中所必須面對的任務(wù),雖然談不上有多困難,但是往往要花掉我們不少時(shí)間來(lái)處理這些瑣事。作者在這一章首先介紹了與字符表達有關(guān)的許多概念以及多種轉換途徑,然后介紹了ATL的基本字符類(lèi)型封裝類(lèi)CComBSTR以及CComVariant。作者對于這兩個(gè)類(lèi)的介紹非常細致,指出了每個(gè)成員函數的一些細節,甚至個(gè)別缺陷。我在閱讀時(shí),對這一部分很感興趣,雖然這些內容我基本上都知道,每個(gè)成員函數也可以通過(guò)ATL的源碼得到其細節知識,但是讀下來(lái)仍然感覺(jué)受益匪淺。反過(guò)來(lái),這一章最后部分介紹的智能指針類(lèi),我的興趣并不大,大概是我對智能指針一直存有偏見(jiàn)的原因吧,不過(guò)智能指針在A(yíng)TL中用得很廣泛,書(shū)中后面部分到處可見(jiàn)智能指針的應用。ATL的智能指針?lè )庋b類(lèi)是一個(gè)比較典型的、功能全面的智能指針模板類(lèi),有興趣的讀者可以讀一讀這兩個(gè)類(lèi)(CComPtr和CComQIPtr)的源碼。

第三章的開(kāi)篇就是COM的套間(apartment)和COM的線(xiàn)程模型,雖然篇幅很短,但是這些內容很重要。因為ATL是一個(gè)支持多線(xiàn)程模型的COM類(lèi)庫,為了支持多線(xiàn)程,代價(jià)是非常昂貴的,要求COM對象的每一個(gè)細節都要涉及到并發(fā)的可能性,ATL既要考慮到代碼的大小,又要考慮到代碼的運行效率,所以ATL用了許多技巧來(lái)保證其方案的有效性。介紹了線(xiàn)程模型之后,作者又講述了實(shí)現COM基本接口IUnknown的一些考慮要點(diǎn)。之后再給出ATL對象的層次圖,如果讀者對于A(yíng)TL中類(lèi)的結構還不了解的話(huà),那么這個(gè)層次圖可以讓你知道Wizard生成的類(lèi)與其他的類(lèi)有什么樣的關(guān)系,這個(gè)圖可以指導你閱讀完后續的兩章。有了這些準備知識之后,作者詳述了ATL為對象提供的線(xiàn)程模型支持,限于本文的篇幅,我不能詳細講述這些內容。

講述了線(xiàn)程模型之后,作者進(jìn)一步介紹COM對象的基類(lèi)CComObjectRootEx實(shí)現IUnknown相關(guān)的方法,有了線(xiàn)程模型的基礎后實(shí)現引用計數非常簡(jiǎn)單,但是QueryInterface成員函數不是基類(lèi)就能夠完成的,它需要用到CComObjectRootEx派生類(lèi)也就是Wizard生成的類(lèi)所提供的接口信息。ATL通過(guò)接口映射表的形式提供對象的接口信息,通過(guò)多繼承的方式實(shí)現多接口的支持。

COM對象的實(shí)例化非常與眾不同,因為Wizard生成的類(lèi)還只是一個(gè)抽象類(lèi),所以它不能夠直接被實(shí)例化,即我們不能用new操作符生成一個(gè)對象。真正的對象類(lèi)應該是CComObject,它實(shí)現了IUnknown的所有方法,并提供了一個(gè)用于創(chuàng )建對象的函數。如果對象支持聚合模型的話(huà),那么最終的對象類(lèi)應該是CComAggObject。為了統一兩種情況以便減小最終的代碼量,ATL提供了CComPolyObject類(lèi)作為最終的對象類(lèi)。

ATL的創(chuàng )建過(guò)程并不復雜,但是它提供了多階段構造(multiphase construction),允許我們在創(chuàng )建過(guò)程中加入更多的控制代碼,獲得更大的靈活性。作者對這一部分的介紹甚為細致,還解釋了ATL_NO_VTBL宏即novtbl編譯指示符的含義,如果一個(gè)類(lèi)聲明了novtbl指示符,那么編譯器在派生類(lèi)的構造過(guò)程中不為基類(lèi)產(chǎn)生虛表(vtable)。

這一章的內容是ATL的基礎,讀起來(lái)并不難,但是一定要清楚ATL類(lèi)的層次關(guān)系,否則很容易陷入ATL的復雜語(yǔ)法之中。

第四章介紹COM服務(wù)程序的ATL支持,作為一個(gè)COM服務(wù)程序,它的主要任務(wù)是管理對象的注冊、為每個(gè)對象提供一個(gè)類(lèi)廠(chǎng)、以及自身的生存期管理。對于進(jìn)程內組件和進(jìn)程外組件還需要區別對待。ATL實(shí)現的對象分為可通過(guò)類(lèi)廠(chǎng)創(chuàng )建的對象和不可創(chuàng )建的對象,不可創(chuàng )建的對象不需要類(lèi)廠(chǎng)的支持,往往為服務(wù)程序中其他的對象所用。ATL實(shí)現這些功能主要通過(guò)對象映射表和CComModule類(lèi)。

對象映射表是一個(gè)全局表,其中包括當前服務(wù)程序所實(shí)現的所有對象類(lèi),表中的每一項包括對象的CLSID、注冊該對象信息的函數、創(chuàng )建類(lèi)廠(chǎng)的函數、創(chuàng )建對象的函數等等。有了這些信息,服務(wù)程序就可以管理它所支持的每一個(gè)對象類(lèi)?;剡^(guò)頭來(lái),為了讓對象映射表管理好這些工作,每一個(gè)對象類(lèi)也需要提供相應的函數或者信息,比如對象的注冊函數、創(chuàng )建函數等。ATL的注冊功能很強,除了標準對象的注冊支持之外,它可以提取出內嵌在資源中的注冊腳本文件(Registry Script File),實(shí)現更為靈活、功能強大的注冊操作。對于使用者來(lái)說(shuō),只要編寫(xiě)資源腳本再加上一個(gè)宏聲明即可。ATL對于類(lèi)廠(chǎng)的支持在CComClassFactory類(lèi)中實(shí)現,對象類(lèi)從CComCoClass繼承一個(gè)類(lèi)廠(chǎng)創(chuàng )建類(lèi)的定義_ClassFactoryCreatorClass。CComClassFactory類(lèi)的實(shí)現沒(méi)有用到模板參數,而是內嵌一個(gè)創(chuàng )建函數,由該函數完成實(shí)際的創(chuàng )建工作。這個(gè)過(guò)程并不復雜,書(shū)中講得很清楚,而且書(shū)中還介紹了ATL實(shí)現IClassFactory2的方法。

CComModule是COM服務(wù)程序的主線(xiàn),當我們創(chuàng )建一個(gè)ATL工程的時(shí)候,Visual C++都會(huì )為我們生成一個(gè)CComModule派生類(lèi),并且定義一個(gè)全局變量_Module,這就如同我們在MFC工程中使用CWinApp應用類(lèi)一樣。CComModule類(lèi)的許多成員函數都對應了它所應該完成的任務(wù),比如更新注冊表的操作、獲取類(lèi)廠(chǎng)對象、注冊類(lèi)廠(chǎng)對象(對于進(jìn)程外服務(wù)程序)等。

第四章介紹的內容對于我們理解ATL工程的總體思路非常有用,結合COM規范對COM實(shí)現中的所有細節要求,ATL給出了一種高效、針對小尺寸組件的實(shí)現方案。結合第三章的內容,就構成了ATL實(shí)現COM的基本技術(shù)框架。

第五章講述ATL的接口映射表,實(shí)際上這是對第三章內容的補充,但是因為ATL的接口映射表比較靈活,而且多接口支持對于COM對象非常重要。所以作者單獨用一章的篇幅來(lái)講述接口映射表。對于多接口的對象,COM有很?chē)栏竦囊幏秮?lái)指示客戶(hù)程序調用這些接口成員函數,特別是IUnknown::QueryInterface。為了遵循這些規范,并保持一定的靈活性,ATL使用了接口映射表的技術(shù)。接口映射表的原理非常簡(jiǎn)單,它以表的形式記錄了每個(gè)接口的IID以及接口的vtable與對象類(lèi)的this指針之間的偏移,但是ATL的接口映射表并沒(méi)有這么簡(jiǎn)單,它以函數的形式把這樣的邏輯封裝起來(lái),從而允許用戶(hù)使用更為靈活的接口查詢(xún)策略。

ATL用多繼承的方法實(shí)現多接口的支持,如果兩個(gè)接口的方法名和參數重合的話(huà),這時(shí)就會(huì )產(chǎn)生問(wèn)題,書(shū)中介紹了一種避免名字沖突的方法,方法并不復雜,但很有效。這一章還介紹了一種被稱(chēng)為“接口著(zhù)色”的技術(shù),其實(shí)很簡(jiǎn)單,只不過(guò)是按照COM所要求的虛表結構另行構造而已,其好處是可以實(shí)現兩個(gè)接口語(yǔ)義完全相同但是IID卻不相同的接口。這也體現了COM接口實(shí)現的靈活性。

除了支持多繼承方式的接口之外,ATL有一個(gè)很強大的接口支持就是對于動(dòng)態(tài)接口的支持,書(shū)中稱(chēng)為“tear-off interface”。每一個(gè)動(dòng)態(tài)接口類(lèi)都應該從CComTearOffObjectBase派生,以后當客戶(hù)向對象請求該接口的時(shí)候,對象類(lèi)會(huì )調用接口映射表中指定的創(chuàng )建函數創(chuàng )建該接口對象。

除了動(dòng)態(tài)接口技術(shù)應用了接口映射表這種結構之外,還有對象類(lèi)對聚合接口的支持,實(shí)現形式與動(dòng)態(tài)接口非常類(lèi)似,ATL對聚合的支持分有計劃聚合(planned aggregation)和盲聚合(blind aggregation),可以說(shuō),ATL對聚合的支持比較全面,但是我們在使用的時(shí)候一定要謹慎,COM中的有些特性往往隱含著(zhù)潛在的出錯可能性,比如說(shuō)盲聚合就是這樣的一種特性。

這一章最后介紹了接口映射表的一些訣竅,包括接口映射表的鏈結構、拒絕支持某個(gè)接口、利用接口請求進(jìn)行調試、對接口映射表的擴展(比如,利用接口映射表設置后門(mén),通過(guò)后門(mén)得到對象類(lèi)的this指針;以及基于對象實(shí)例的接口請求)。這一章所講述的內容非常細節,涉及到COM規范中的許多細微的地方,讀懂這一部分并不難,但是要求讀者具有有關(guān)的COM背景知識。

以上四章內容是ATL的基石,即使把這一部分獨立出來(lái)也可以構成一本書(shū)“ATL深入淺出”,如果讀者要依靠ATL來(lái)編寫(xiě)COM組件的話(huà),那么認真讀懂這一部分就可以奠定工作的基礎。如果有人說(shuō)ATL使用C++語(yǔ)法非?;ㄉ诘脑?huà),那么他們一定是指這一部分所講述的內容。由于C++模板語(yǔ)法本身的復雜性,加上ATL在許多模板類(lèi)的定義中使用了“typedef”,再加上ATL也使用了類(lèi)似MFC的宏結構,所以讀起源碼來(lái)非?;逎?。盡管作者講述這一部分內容非常有條理,但我看這幾章的時(shí)候不免要前后翻動(dòng),偶爾還要查看一下ATL的源碼。但是一旦明白了ATL的思路,又不免為它的設計所折服。


第三部分 ATL實(shí)現COM:擴展部分

ATL實(shí)現COM的擴展部分包括三章內容,分別為:Persistence in ATL(ATL的永久特性支持)、Collections and Enumerators(集合對象和枚舉器對象)、Connection Points(連接點(diǎn)對象)。這三章是面向COM應用層面的三個(gè)大方向,也是我們比較常用的一些COM特征。如果讀者要全面掌握ATL的話(huà),那么應該讀一讀這部分。

第六章介紹ATL對COM永久機制的支持,相對來(lái)說(shuō),這一章內容的介紹讀起來(lái)要輕松得多,只要讀者對COM永久模型比較熟悉即可。由于COM永久模型的復雜性主要位于客戶(hù)程序一方,在對象一方只需要實(shí)現有關(guān)的幾個(gè)永久接口,當然這些永久接口與對象本身的邏輯是密切相關(guān)的。這一章前面部分回顧了IPersistPropertyBag、IPersistStream[Init]、IPersistStorage永久接口的定義和實(shí)現,然后介紹ATL對這些永久接口的實(shí)現,重點(diǎn)介紹了屬性映射表(Property Map)。ATL提供的永久接口的實(shí)現能夠自動(dòng)對屬性映射表中的屬性進(jìn)行永久處理,即提供Load和Save支持。對于屬性映射表不支持的永久內容(比如說(shuō)書(shū)中所舉的索引屬性的例子),我們可以在適當的地方進(jìn)行重載處理,ATL允許我們在多個(gè)地方重載這套機制。

在介紹了這幾個(gè)常用的永久接口之后,作者還介紹了IPersistMemory接口,并細致說(shuō)明了幾個(gè)永久接口公共的成員函數GetSizeMax的重要性以及作者補充的實(shí)現方法。在這一章的最后,作者還給出了一個(gè)用永久特性實(shí)現自定義列集(marshaling)的一種方法,如果讀者對自定義列集有興趣的話(huà),可以看一看這一章最后幾頁(yè)的介紹。

第七章介紹了COM集合對象和枚舉器對象(enumerator)的ATL實(shí)現。在講述集合和枚舉器對象之前,作者先介紹了STL中的容器和迭代器(iterator),這是STL中數據組織和數據訪(fǎng)問(wèn)的基本形式,然后作者以一個(gè)類(lèi)比,指出雖然STL不能直接用于COM,但是COM提供了類(lèi)似的對象組織和訪(fǎng)問(wèn)機制,這就是COM集合對象和枚舉器對象。

COM的集合對象是構成COM對象模型的基礎,為了在客戶(hù)程序一方特別是VB(Visual Basic)或者VBA作為客戶(hù)程序時(shí),它能夠方便有效地訪(fǎng)問(wèn)集合對象,COM制定了集合對象的接口規范以及枚舉對象的接口規范。ATL實(shí)現了這些規范,并且在A(yíng)TL內部,還提供了多種途徑來(lái)管理這些成員數據或者成員對象。

ATL的集合對象實(shí)現起來(lái)比較簡(jiǎn)單,只要按照COM規范,增加集合對象所特有的屬性:Count、Item、_NewEnum即可。_NewEnum屬性把集合對象和枚舉對象聯(lián)系起來(lái)了。在A(yíng)TL中,枚舉數組類(lèi)為CComEnum,它以數組的形式管理其成員數據,值得一提的是,ATL在實(shí)現枚舉接口的時(shí)候,為了方便對于數據的拷貝操作,專(zhuān)門(mén)抽象出一個(gè)被稱(chēng)為“拷貝策略”的類(lèi),由該類(lèi)的靜態(tài)成員函數實(shí)施成員拷貝操作。ATL真正實(shí)現枚舉接口的類(lèi)為CComEnumImpl,它是CComEnum的基類(lèi),CComEnumImpl的實(shí)現并不復雜,唯一值得注意的是CComEnumImpl內部保存數據的方式,既可以是快照方式,也可以引用集合對象中的數據。有了這些基礎,加上上一部分介紹的ATL對象類(lèi),實(shí)現枚舉對象就非常容易了,作者在書(shū)中用一個(gè)素數集合對象的例子講述了整個(gè)過(guò)程,最終通過(guò)素數集合對象的_NewEnum屬性把它與素數枚舉對象聯(lián)系起來(lái)。

第七章的后半部分講述了以STL作為數據組織方式來(lái)實(shí)現COM集合對象和枚舉對象,如果讀者對于STL不是很熟悉的話(huà),可以把這部分內容跳過(guò)去而無(wú)關(guān)大局。用STL實(shí)現集合對象和枚舉對象與前面方法的主要不同在于對象的內部實(shí)現細節,基本的思路和模型仍然一致。對應于CComEnum的枚舉器類(lèi)為CComEnumOnSTL,對應于CComEnumImpl的枚舉接口實(shí)現類(lèi)為IEnumOnSTLImpl,這兩個(gè)類(lèi)的用法可以非常靈活,書(shū)中舉例說(shuō)明了這兩個(gè)類(lèi)的用法。如果用STL實(shí)現枚舉對象,則集合類(lèi)也需要提供相應的支持,比較好的做法是用STL來(lái)實(shí)現集合類(lèi)。緊接著(zhù)作者就介紹了ICollectionOnSTLImpl,它與CComEnumOnSTL配合起來(lái)實(shí)現集合對象和枚舉對象。

作者在這一章還介紹了如何把ATL的數據類(lèi)型(也就是在第二章講述的一些類(lèi))封裝到STL的容器中,這部分內容對于那些STL迷來(lái)說(shuō)可能非常有用,也非常有意思。在這一章的最后,作者用前面講到的內容構造了一個(gè)簡(jiǎn)單的對象模型例子,讓讀者知道如何把集合對象和枚舉對象應用到對象模型中,起到一個(gè)全局指導的作用。

第八章講述可連接對象的ATL實(shí)現,作者首先回顧了COM的可連接對象機制,指出ATL利用兩個(gè)全局函數AtlAdvise和AtlUnadvise建立源對象和接收器對象之間的連接或者撤銷(xiāo)兩者之間的連接??蛇B接對象是COM的雙向通信機制,它并沒(méi)有應用復雜的技術(shù),實(shí)際上就是COM的一個(gè)反向應用。

然后作者從一個(gè)例子開(kāi)始講述ATL實(shí)現可連接對象的全過(guò)程(分為七個(gè)步驟),包括如何實(shí)現IConnectionPointContainer接口、如何實(shí)現每個(gè)連接點(diǎn)對象、如何增加連接點(diǎn)映射表以及如何編寫(xiě)事件激發(fā)函數或者讓Visual C++的集成環(huán)境產(chǎn)生事件激發(fā)函數。在介紹了源對象的實(shí)現過(guò)程之后,作者又介紹了客戶(hù)程序一方實(shí)現事件接收器對象的過(guò)程,相對而言,這個(gè)過(guò)程涉及到的細節要多一些,因為ATL的模板類(lèi)IDispatchImpl只支持雙接口,不支持dispinterface,源對象的出接口(outgoing interface)往往是dispinterface,所以接收器對象要通過(guò)其他的途徑來(lái)實(shí)現事件接口。ATL提供了兩個(gè)模板類(lèi)IDispEventImpl和IDispEventSimpleImpl用于接收器對象的實(shí)現,IDispEventImpl要借助于類(lèi)型庫所提供的出接口類(lèi)型信息,這是最簡(jiǎn)單的實(shí)現方法,而IDispEventSimpleImpl不需要類(lèi)型庫的支持,這是效率最高的方法。這兩種方法都需要用到事件接收器映射表(event sink map),程序員可以把具體的事件函數以及對應的dispid等信息通過(guò)ATL提供的一組宏提交給客戶(hù)類(lèi)。配合前面給出的源對象例子,作者在講解過(guò)程中也提供了客戶(hù)端接收器對象的例子程序。

在介紹了ATL中可連接對象的用法之后,作者繼續講解這套機制的實(shí)現細節,包括以下一些要點(diǎn):


源對象實(shí)現IConnectionPointContainer接口的原理,包括如何操縱連接點(diǎn)對象枚舉器、如何使用連接點(diǎn)映射表。


連接點(diǎn)對象實(shí)現類(lèi)IConnectionPointImpl。包括如何管理多個(gè)連接、如何操縱連接枚舉器對象、如何在一個(gè)源對象上實(shí)現多個(gè)連接點(diǎn)對象等細節。


事件接收器對象所涉及到的多個(gè)類(lèi)。包括_IDispEvent、_IDispEventLocator、IDispEventSimpleImpl,同時(shí)也討論了事件接收器映射表的基本原理。

這一章介紹的內容相對要簡(jiǎn)單一些,如果上一部分的基礎打得比較好的話(huà),這些內容可以輕松地讀下來(lái)。盡管內容比較簡(jiǎn)單,但是對于我們熟練應用ATL的可連接對象機制非常有幫助,因為在實(shí)際工作中,完全手工實(shí)現可連接對象機制非常繁瑣,即使ATL的Wizard中已經(jīng)提供了連接點(diǎn)對象的支持,要讓可連接對象和接收器對象真正工作起來(lái)還需要許多手工工作。所以這部分內容很有實(shí)際意義。

以上三章內容是COM擴展的內容,但是我們在實(shí)際工作中經(jīng)常會(huì )碰到這些內容,尤其是COM的永久特性和可連接對象特性,具有非常廣泛的應用背景,比如下一部分要講到的ActiveX控制就同時(shí)需要這兩種技術(shù)的支持,而集合對象和枚舉器對象則是VBA程序所非常依賴(lài)的對象組織手段。


第四部分 ATL對窗口和ActiveX控制的支持

我們知道,COM是一個(gè)平臺無(wú)關(guān)的組件規范,但是COM的應用幾乎都是與Windows平臺相關(guān)的,這是由COM的歷史背景所決定的。本書(shū)第四部分討論的內容是ATL如何實(shí)現與用戶(hù)界面有關(guān)的功能,特別是如何封裝窗口、如何支持ActiveX控制。

在Visual C++提供的兩套類(lèi)庫中,MFC側重于對Windows平臺上界面特性的封裝,包括各種風(fēng)格的窗口程序、對話(huà)框、大量的控制類(lèi)等,而ATL則側重于對COM的封裝。但是,如同MFC也提供了COM支持一樣,ATL也提供了對用戶(hù)界面的支持,這就是第九章所要討論的ATL窗口封裝,當然封裝的基礎仍然是Win32 API。

第九章討論的內容不涉及到COM,完全是Windows平臺上的與窗口有關(guān)的許多細節,作者從Windows窗口應用的基本模式講起,講到了窗口的三大要素:窗口類(lèi)(WNDCLASSEX結構)、窗口句柄(HWND)和窗口過(guò)程(WndProc),這也是封裝窗口類(lèi)的幾個(gè)要點(diǎn)。ATL的窗口類(lèi)層次結構比MFC要簡(jiǎn)單得多,其中主要的類(lèi)是CWindow、CWindowImpl、CDialogImpl和CContainedWindow,然后作者逐一介紹這些類(lèi)。

CWindow類(lèi)非常簡(jiǎn)單,它只是對窗口句柄HWND的封裝,幾乎所有與窗口有關(guān)的API函數都有對應的CWindow成員函數。這些成員函數僅僅是個(gè)簡(jiǎn)單封裝而已。

CWindowImpl是ATL窗口類(lèi)中的關(guān)鍵類(lèi),它一方面繼承自CWindow,同時(shí)它解決了窗口的兩個(gè)關(guān)鍵問(wèn)題:窗口類(lèi)的注冊和窗口消息處理。窗口類(lèi)的注冊是創(chuàng )建該類(lèi)窗口的必要條件,CWindowImpl類(lèi)把這個(gè)過(guò)程作了封裝,程序員只需使用簡(jiǎn)單的宏就可以完成這些必要的任務(wù)。CWindowImpl類(lèi)實(shí)現窗口過(guò)程則使用了一點(diǎn)技巧,因為窗口過(guò)程是以HWND作為窗口對象標識的,而CWindowImpl是以this指針作為對象標識的,所以如何在HWND和this指針之間建立對應關(guān)系是關(guān)鍵所在。CWindowImpl的基類(lèi)CWindowImplBaseT以StartWindowProc作為窗口過(guò)程,在第一次被調用的過(guò)程中建立兩者的映射關(guān)系,它通過(guò)一個(gè)被稱(chēng)為“thunk”的對象在運行過(guò)程中建立起來(lái)的一組機器指令。每個(gè)窗口對象都有一個(gè)thunk對象。thunk的任務(wù)是在調用CWindowImpl類(lèi)的靜態(tài)成員函數WindowProc處理消息之前先用this指針代替棧中的HWND。書(shū)中對這個(gè)過(guò)程作了詳細的說(shuō)明,對于A(yíng)TL的窗口底層封裝有興趣的讀者可以看一看這部分內容介紹,很有意思的。

完成了HWND到this指針的映射還只是一小步的工作,窗口過(guò)程的根本目標是處理窗口的消息,ATL的消息處理機制非常強大,首先它利用一組宏構造出ProcessWindowMessage成員函數,一旦把這些宏展開(kāi),其實(shí)就是一個(gè)規范的switch語(yǔ)句,以及每個(gè)case下的一大堆if語(yǔ)句。這種程序結構明顯不同于MFC的消息映射表,MFC消息映射表通過(guò)查表來(lái)處理每一個(gè)消息。ATL的消息支持非常靈活,我們可以按消息碼指定消息處理函數,也可以按消息碼的范圍值指定處理函數,對于命令消息和通知消息有專(zhuān)門(mén)的宏提供支持。更為強大的是,ATL的消息表可以構成鏈,也就是把派生類(lèi)和基類(lèi)的消息表鏈接起來(lái),如果有多個(gè)基類(lèi)的話(huà),可以把所有這些消息表都鏈起來(lái)。而且在每個(gè)類(lèi)中,消息表中的消息處理項又可以分組,有的用于派生類(lèi),有的用于自身,為派生類(lèi)提供了許多機會(huì )。

理解了CWindowImpl之后再來(lái)理解CDialogImpl則容易多了,同樣的thunk技術(shù),同樣的消息鏈技術(shù),所不同的是底層Win32 API有不同的處理,而且對話(huà)框分為有模式對話(huà)框和無(wú)模式對話(huà)框。如果讀者用MFC編寫(xiě)過(guò)對話(huà)框類(lèi)的話(huà),一定對其中的DDX/DDV函數有印象,Class Wizard產(chǎn)生的這些函數調用完成了對話(huà)框成員變量與對話(huà)框上控制之間的數據交換和數據有效性判斷,不幸的是,ATL沒(méi)有提供這樣的功能,我們只好自己解決,其實(shí)真要做起來(lái)并不難,而且自己實(shí)現可以更靈活。

我們知道MFC封裝了大量的控制類(lèi),而ATL的窗口類(lèi)樹(shù)中并沒(méi)有這么多的控制類(lèi),實(shí)際上,在A(yíng)TL的atlcon例子中同樣給出了所有這些控制的封裝類(lèi),只是沒(méi)有正式的文檔而已,這些類(lèi)用起來(lái)很簡(jiǎn)單,源碼本身就是最好的文檔,我們可以充分利用這些資源。

這一章最后還介紹了CContainedWindow,它的特殊之處在于,它接收到消息之后交給父窗口處理這些消息,父窗口既可以直接創(chuàng )建這樣的子窗口,也可以對一個(gè)已經(jīng)被創(chuàng )建的窗口對象利用“子類(lèi)化”的技術(shù)截取其窗口過(guò)程。

第九章的內容與COM完全無(wú)關(guān),但它是ATL庫中不同缺少的一部分,特別對于有用戶(hù)界面的ATL工程來(lái)說(shuō),更是非常重要。第十章則講述如何用ATL來(lái)建立ActiveX控制(大多數中文資料把“ActiveX control”稱(chēng)為ActiveX控件)。ActiveX控制是COM技術(shù)的大集成,也是OLE技術(shù)的大集成,如果純粹從技術(shù)角度來(lái)講的話(huà),幾乎還沒(méi)有一本書(shū)能夠全面講述ActiveX控制的各項技術(shù)。ATL對ActiveX控制的支持比較全面,而且它的應用非常靈活,程序員可以有所選擇地選取某一部分。

第十章作者首先回顧了ActiveX控制的各項功能,然后從一個(gè)例子BullsEye的功能需求分析出發(fā),利用ATL Wizard創(chuàng )建一個(gè)初始的ActiveX控制框架,對創(chuàng )建過(guò)程中涉及到的選項逐一作了說(shuō)明。有了初始的控制代碼之后,接下去的任務(wù)是逐項完善BullsEye控制的功能,分別如下:


首先是增加BullsEye控制的屬性和方法,因為ActiveX控制是自動(dòng)化技術(shù)的超集,包容器(客戶(hù))需要通過(guò)IDispatch接口或者雙接口與控制進(jìn)行通信,所以控制的屬性和方法是基礎,屬性和方法分兩種:庫存的(stock)和自定義的(custom)。ATL支持庫存屬性的類(lèi)為CStockPropImpl,它繼承自IDispatchImpl類(lèi)。而自定義的屬性和方法則可以通過(guò)VC集成環(huán)境提供的“Add Method”和“Add Property”加入,它會(huì )自動(dòng)更新IDL接口定義文件和相應的源代碼.h文件。


加入事件支持。首先在IDL文件中加入出接口的事件定義,然后加入連接點(diǎn)支持以及IConnectionPointContainer接口的支持。ActiveX控制除了支持自定義的出接口之外,它還支持IPropertyNotifySink接口作為出接口,專(zhuān)門(mén)用于向包容器程序提供屬性變化通知。ATL的類(lèi)IPropertyNotifySinkCP實(shí)現了相應的連接點(diǎn)對象。實(shí)現連接點(diǎn)支持的基本機制如上一部分所介紹,只是ATL為ActiveX控制提供了更多的便利。作為與連接點(diǎn)相關(guān)的內容,一個(gè)ActiveX控制也應該支持IProvideClassInfo2接口,相應的ATL類(lèi)為IProvideClassInfo2Impl。


作為ActiveX控制,在窗口中繪制必要的圖形信息是它的任務(wù)之一,ATL只提供了繪制的框架,具體的繪制任務(wù)由派生類(lèi)完成,對于我們編寫(xiě)ATL控制而言,就是一個(gè)OnDraw函數。


屬性的永久性。這是第六章內容的綜合應用,直接利用ATL提供的永久接口實(shí)現類(lèi),以及控制的屬性映射表即可。


一個(gè)客戶(hù)友好的ActiveX控制應該實(shí)現IQuickActivate接口,ATL想得很周到,它實(shí)現了這個(gè)接口,把有關(guān)的邏輯交給控制類(lèi)的IQuickActivate_QuickActivate成員。


組件類(lèi)別。利用ATL的類(lèi)別映射表很容易實(shí)現控制的類(lèi)別功能。


屬性分類(lèi)的功能。ATL沒(méi)有提供支持,但是我們可以很方便地實(shí)現ICategorizeProperties接口。


針對屬性的瀏覽功能。這是接口IPerPropertyBrowsing的任務(wù),ATL提供了接口實(shí)現IPerPropertyBrowsingImpl,我們只要重載有關(guān)的成員函數即可。


ActiveX控制的鍵盤(pán)處理。這是ActiveX控制與包容器之間的協(xié)作基礎,我們只要根據ActiveX控制的規范重載必要的函數即可。

這一章的內容覆蓋面比較廣,作者通過(guò)BullsEye例子程序展示了ATL實(shí)現全功能的ActiveX控制的諸多細節。有許多地方用到了前面講述的ATL類(lèi)或者相應的各種支持,這個(gè)例子對于我們自己實(shí)現ActiveX控制很有啟發(fā)性。

最后第十一章介紹ActiveX被包容器程序使用的情況。作者首先介紹了ActiveX控制與包容器之間的協(xié)作概況,然后敘述ATL實(shí)現包容的基本技術(shù)。CAxHostWindow類(lèi)是ATL實(shí)現包容控制的內部基本類(lèi)。作者從ActiveX控制的創(chuàng )建過(guò)程解釋了CAxHostWindow類(lèi)如何參與包容器窗口與控制之間的協(xié)作,我們知道,包容器程序通過(guò)控制站點(diǎn)對象來(lái)管理ActiveX控制,這里的CAxHostWindow對象相當于控制的站點(diǎn)對象,它不是由客戶(hù)程序顯式創(chuàng )建,而是在包容器窗口創(chuàng )建控制的過(guò)程中被隱式創(chuàng )建,這個(gè)過(guò)程涉及到很多協(xié)作細節。作者花了很大的篇幅來(lái)講述這個(gè)過(guò)程,一旦這個(gè)過(guò)程講清楚了,那么其他的細節就顯得非常簡(jiǎn)明。

加入事件控制的過(guò)程很簡(jiǎn)單,如第八章所述,利用IDispEventImpl類(lèi),加入接收器事件映射表,然后在適當的時(shí)候建立接收器與控制之間的連接即可。同樣地,我們可以在包容器上實(shí)現IPropertyNotifySink接口,并建立它與控制之間的連接,以便處理控制的屬性變化通知。對于屬性頁(yè)的處理也是包容器程序的一項任務(wù),但處理起來(lái)比較簡(jiǎn)單,只需調用OLE函數OleCreatePropertyFrame即可??刂频挠谰锰幚硪膊粡碗s,在包容器的保存和恢復操作中分別調用控制永久接口的Save和Load成員即可。

除了在一般的窗口中包容ActiveX控制之外,對話(huà)框作為包容器窗口也是一種典型情況,對于客戶(hù)程序而言,在對話(huà)框中使用ActiveX控制更為簡(jiǎn)便。在程序設計階段,集成環(huán)境往往能夠為我們做更多的事情,比如控制的初始狀態(tài)處理、控制的事件處理等。但是仍然有些工作需要我們在后期手工進(jìn)行處理,如建立接收器對象與控制之間的連接、編寫(xiě)事件函數等。

在實(shí)際應用中,用ActiveX控制或者Windows的標準控制構造新的控制是一項很有用的技術(shù),這就是復合控制,ATL也支持復合控制,它把對話(huà)框的功能和ActiveX控制的功能結合起來(lái)。在構造復合控制的時(shí)候,我們可以指定一個(gè)對話(huà)框模板,把設計階段完成的界面模板引入到復合控制中,這是一個(gè)非常簡(jiǎn)便的構造界面單元的方法。

另一個(gè)功能更為強大的構造界面單元的方法是HTML控制,它利用Web瀏覽器控制直接把HTML頁(yè)面封裝成一個(gè)新的ActiveX控制。由于它把HTML頁(yè)面作為界面內容,所以使用的時(shí)候非常靈活,我們可以在HTML頁(yè)面中嵌入腳本,可以使用多種字體,可以訪(fǎng)問(wèn)HTML文檔的對象模型。

這一章的內容也比較廣泛,但是它把上一章介紹的ActiveX控制與實(shí)際的應用結合起來(lái)了。而且通過(guò)這些內容的介紹,我們可以拓寬視野把ActiveX控制應用得更加靈活,把Web引入到我們的桌面程序上來(lái),或者把桌面程序的功能引入到Web當中去。這兩章的內容相對比較獨立,它們構成了用ATL開(kāi)發(fā)和使用ActiveX控制的主體。如果讀者關(guān)注MSJ雜志的話(huà),可以在1999年的2、3、4月期上找到有關(guān)這些內容的一個(gè)連載,文章的名字為:“Write ActiveX Controls Using Custom Interfaces Provided by ATL 3.0”。

第十一章是全書(shū)的最后一章,我們跟隨作者從基本的向導開(kāi)發(fā)學(xué)起,經(jīng)過(guò)深入淺出的分析,終于達到了一個(gè)歇腳點(diǎn),可以輕松一下了。但這不等于我們學(xué)習ATL的任務(wù)已經(jīng)完成了,ATL還有很多內容有待于我們去挖掘。

結束語(yǔ)

對于COM應用的開(kāi)發(fā),ATL無(wú)疑是首選的工具,與MFC相比,ATL的規模還不算大,但是從上述的介紹我們可以看出,ATL涉及到了COM的方方面面。實(shí)際上,ATL的內容還要多得多,比如OLE DB的支持、MTS的支持等,盡管如此,如果我們有了這本書(shū)中的內容為基礎,那么再去學(xué)習這些擴展的內容就會(huì )容易得多,結合ATL中實(shí)現COM的基本手段加上這些應用技術(shù)的背景知識,我們可以很容易地掌握這些開(kāi)發(fā)技術(shù)。

但是如果我們要想熟練掌握甚至精通ATL的話(huà),那么這只是一個(gè)開(kāi)頭,前面還有漫長(cháng)的路要走。原因有多方面,一則COM本身異常復雜,不下苦功難窺全貌;二則ATL確實(shí)奧妙很多,它體現了C++語(yǔ)法的博大精深;三則ATL還存在很多錯誤,雖然本書(shū)作者指出了一些錯誤,但實(shí)際的錯誤肯定更多,這就對ATL使用者提出了更高的要求,如果使用過(guò)程中不能發(fā)現這些錯誤或者避開(kāi)這些錯誤,那么用ATL反而會(huì )阻礙我們的工作。

雖然ATL比較精深,但是這本書(shū)的講解非常通俗易懂,語(yǔ)言比較簡(jiǎn)練,條理非常清楚。即使在讀完這本書(shū)之后,它仍然可以作為參考書(shū)指導我們的開(kāi)發(fā)和學(xué)習工作。我想,這就是好書(shū)的價(jià)值所在吧。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
STL,ATL,WTL之間的聯(lián)系和區別
用ATL和MFC來(lái)創(chuàng )建ActiveX控件
用 ATL ActiveX 繪制任意平面函數的曲線(xiàn)
[筆記](méi)COM組件初識
深入探索COM開(kāi)發(fā)框架之MFC和ATL[一]
用ATL開(kāi)發(fā)和部署ActiveX網(wǎng)頁(yè)控件
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久