專利名稱:基于類別創(chuàng)建驅(qū)動構(gòu)件對象實(shí)現(xiàn)設(shè)備驅(qū)動程序多態(tài)的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種基于類別創(chuàng)建驅(qū)動構(gòu)件對象實(shí)現(xiàn)設(shè)備驅(qū)動程序多態(tài)的方法,特別是指一種操作系統(tǒng)根據(jù)客戶的指定,自動根據(jù)指定的構(gòu)件類型選用相應(yīng)的構(gòu)件,進(jìn)一步實(shí)現(xiàn)應(yīng)用程序?qū)︱?qū)動程序的多態(tài)訪問的構(gòu)件創(chuàng)建方法,屬于計(jì)算機(jī)技術(shù)領(lǐng)域。
背景技術(shù):
在操作系統(tǒng)中,真正的硬件驅(qū)動程序總是針對某一特定的硬件設(shè)備進(jìn)行I/O訪問,并向上層應(yīng)用提供這一特定設(shè)備的訪問接口。但對于驅(qū)動程序的使用者來說他們大多數(shù)情況下并不關(guān)心使用的是什么設(shè)備,而只關(guān)心系統(tǒng)上有沒有這種類型的可用設(shè)備。例如使用打印機(jī)的應(yīng)用程序只關(guān)心機(jī)器上有沒有打印機(jī)可以用,而不關(guān)心是使用的是并口打印機(jī)、串口打印機(jī)還是網(wǎng)絡(luò)打印機(jī),更不會去關(guān)心打印機(jī)的型號或品牌。因此,讓使用打印機(jī)的應(yīng)用程序去直接指定所要使用的打印機(jī)驅(qū)動程序的做法是不合理的。
為了解決這一問題,傳統(tǒng)操作系統(tǒng)中的做法是把驅(qū)動程序分層,參見圖1,打印機(jī)驅(qū)動程序通常被分成三層硬件I/O層3、打印驅(qū)動層2及應(yīng)用接口層1。在應(yīng)用接口層1,操作系統(tǒng)實(shí)現(xiàn)一個(gè)偽打印驅(qū)動程序,目的是為上層應(yīng)用程序提供一個(gè)標(biāo)準(zhǔn)的打印機(jī)接口,這樣應(yīng)用程序就可以在不需要關(guān)心打印機(jī)的具體型號的情況下使用它。下層具體的打印驅(qū)動程序在安裝時(shí)再把自己注冊到虛擬打印機(jī)的偽驅(qū)動程序中,這樣虛擬打印機(jī)驅(qū)動可以把上層應(yīng)用的打印請求轉(zhuǎn)發(fā)給具體的打印驅(qū)動程序,執(zhí)行相應(yīng)的打印指令。
這種通過抽象接口(應(yīng)用接口層1),根據(jù)接口引用到的實(shí)體對象(驅(qū)動程序)的不同而獲取不同功能特征的特性,在面向構(gòu)件(或面向?qū)ο?的技術(shù)里被稱為多態(tài)。
通過這種多態(tài)特征,可以很好地解決應(yīng)用程序與具體硬件隔離的問題。但由于傳統(tǒng)操作系統(tǒng)內(nèi)核中并沒有真正的組件對象模型(The ComponentObject Model,簡稱COM)去支持這種特征,使得這種模型存在以下兩個(gè)問題一是沒有通用性,需要為每一類設(shè)備實(shí)現(xiàn)一個(gè)面向上層應(yīng)用的偽驅(qū)動程序;二是由于需要接口層的轉(zhuǎn)接,帶來了額外的效率開銷,有時(shí)還會增加不必要的數(shù)據(jù)拷貝。
在COM中,所有的構(gòu)件都是以類標(biāo)識(Class Identification,簡稱CLSID)作為構(gòu)件類的唯一標(biāo)識,每一個(gè)CLSID就對應(yīng)了一個(gè)構(gòu)件實(shí)現(xiàn)。
COM規(guī)范認(rèn)為將虛接口抽象出來,就實(shí)現(xiàn)了二進(jìn)制的多態(tài)。但實(shí)際情況并不完全如此。構(gòu)件客戶端在使用構(gòu)件時(shí),還是需要指定構(gòu)件服務(wù)器的CLSID來創(chuàng)建構(gòu)件對象,指定CLSID實(shí)際上就是指定了構(gòu)件的實(shí)現(xiàn)。
以上述的打印機(jī)模型為例假設(shè)打印驅(qū)動程序都是構(gòu)件化的,并且它們都實(shí)現(xiàn)了“打印機(jī)公共接口”;如果要求應(yīng)用程序在創(chuàng)建驅(qū)動對象時(shí)指定CLSID,也就指定了用什么打印驅(qū)動程序,這樣實(shí)際上依然達(dá)不到設(shè)備及驅(qū)動對應(yīng)用程序透明的目的。
因此,把接口抽象出來只是實(shí)現(xiàn)了構(gòu)件方法調(diào)用的多態(tài)性,并未實(shí)現(xiàn)構(gòu)件創(chuàng)建的多態(tài)性。而一個(gè)構(gòu)件的使用總要經(jīng)過創(chuàng)建、調(diào)用、消亡這三個(gè)過程,只有實(shí)現(xiàn)了構(gòu)件創(chuàng)建的多態(tài)性,才可以實(shí)現(xiàn)構(gòu)件使用的多態(tài)。
發(fā)明內(nèi)容
本發(fā)明的主要目的在于提供一種基于類別創(chuàng)建驅(qū)動構(gòu)件對象實(shí)現(xiàn)設(shè)備驅(qū)動程序多態(tài)性的方法,操作系統(tǒng)根據(jù)客戶的指定,自動根據(jù)指定的構(gòu)件類型選用相應(yīng)的構(gòu)件,進(jìn)一步實(shí)現(xiàn)應(yīng)用程序?qū)︱?qū)動程序的多態(tài)訪問。
本發(fā)明的目的是這樣實(shí)現(xiàn)的一種基于類別創(chuàng)建驅(qū)動構(gòu)件對象實(shí)現(xiàn)設(shè)備驅(qū)動程序多態(tài)性的方法,至少包括步驟1定義并實(shí)現(xiàn)驅(qū)動構(gòu)件類別;
步驟2構(gòu)件客戶程序基于該驅(qū)動構(gòu)件類別創(chuàng)建驅(qū)動對象。
上述的實(shí)現(xiàn)方法還進(jìn)一步包括在構(gòu)件類別中設(shè)定該類別的缺省類標(biāo)識(CLSID)。
上述的構(gòu)件類別中CLSID的設(shè)定方法為對構(gòu)件類別及其所屬的構(gòu)件類進(jìn)行注冊,并將最后一個(gè)注冊到構(gòu)件類別中的CLSID作為該構(gòu)件類別的缺省CLSID。
上述的構(gòu)件類別中CLSID的設(shè)定方法還可以為步驟31讀入系統(tǒng)構(gòu)件類別注冊文件中的類別注冊信息;步驟32讀取打包在對應(yīng)的動態(tài)連接庫文件資源段(Resource Section)中的構(gòu)件元數(shù)據(jù);步驟33在構(gòu)件元數(shù)據(jù)中查找是否定義了新的類別,否則執(zhí)行步驟35;步驟34把包括驅(qū)動構(gòu)件類別標(biāo)識的新的類別信息添加到類別注冊信息中;步驟35在元數(shù)據(jù)中查找是否存在屬于類別注冊信息中構(gòu)件類別的構(gòu)件類,不存在,則執(zhí)行步驟37;步驟36將包括驅(qū)動構(gòu)件類別標(biāo)識的構(gòu)件類信息添加到相應(yīng)的構(gòu)件類別名下,并將該構(gòu)件類作為該類別的缺省構(gòu)件類;步驟37將修改后的類別注冊信息寫回到系統(tǒng)類別注冊文件中。
上述的構(gòu)件類別中CLSID的設(shè)定方法又可以為如果定義構(gòu)件類別的動態(tài)連接庫文件中有一個(gè)以上的構(gòu)件類相應(yīng)的構(gòu)件類別,則使用最后一個(gè)屬于該類別的構(gòu)件類作為缺省類,否則返回失敗信息。
上述的步驟1具體包括如下的定義步驟步驟11通過繼承定義的構(gòu)件類別定義構(gòu)件類;步驟12根據(jù)構(gòu)件的功能需求實(shí)現(xiàn)構(gòu)件類;步驟13編譯構(gòu)件程序并自動注冊構(gòu)件類別。
其中,步驟13具體包括步驟131對構(gòu)件程序進(jìn)行編譯,生成構(gòu)件動態(tài)連接庫文件;步驟132將定義的構(gòu)件類別及類別所包含的構(gòu)件類進(jìn)行注冊。
本發(fā)明在定義并實(shí)現(xiàn)驅(qū)動構(gòu)件類之前,還包括使用構(gòu)件描述語言定義驅(qū)動的類別。
上述的驅(qū)動構(gòu)件類允許定義一個(gè)或一個(gè)以上的接口。
上述的步驟2具體包括如下的創(chuàng)建步驟步驟21指定要?jiǎng)?chuàng)建驅(qū)動對象的驅(qū)動構(gòu)件類別標(biāo)識(CATID);步驟22取該類別的缺省類標(biāo)識CLSID;步驟23判斷該CLSID是否屬于驅(qū)動程序類別,如果是,則執(zhí)行步驟24;如果不是,則使用CLSID創(chuàng)建出普通的構(gòu)件對象,執(zhí)行步驟26;步驟24使用CLSID創(chuàng)建具體的驅(qū)動對象;步驟25從驅(qū)動對象查詢(QueryInterface,COM規(guī)范所規(guī)定的用于從構(gòu)件對象中查詢它是否支持指定的接口的一個(gè)標(biāo)準(zhǔn)方法)出類別中的公用接口;步驟26返回該類別的公共接口。
本發(fā)明具有如下的優(yōu)點(diǎn)1)不需為每個(gè)種類的驅(qū)動實(shí)現(xiàn)一個(gè)偽驅(qū)動作為公用入口,而只要定義這種驅(qū)動類別的公用接口,屬于這個(gè)類別的驅(qū)動都實(shí)現(xiàn)該公用接口;2)本發(fā)明只有在創(chuàng)建驅(qū)動對象的過程中的動態(tài)綁定時(shí)才需要附加一些效率上的開銷;一旦驅(qū)動對象創(chuàng)建出來,操作系統(tǒng)把驅(qū)動對象所實(shí)現(xiàn)的公共接口返回給應(yīng)用程序,應(yīng)用程序就可以直接調(diào)用具體驅(qū)動對象的方法,沒有額外的效率開銷;實(shí)現(xiàn)了應(yīng)用程序?qū)︱?qū)動程序的多態(tài)訪問。
圖1為傳統(tǒng)驅(qū)動模型的示意圖;圖2為本發(fā)明基于構(gòu)件類別的驅(qū)動模型示意圖;圖3為本發(fā)明實(shí)現(xiàn)基于構(gòu)件類別驅(qū)動程序創(chuàng)建的流程圖。
具體實(shí)施例方式
以下結(jié)合附圖和具體的實(shí)施例對本發(fā)明作進(jìn)一步的詳細(xì)說明為了達(dá)到本發(fā)明的目的,設(shè)計(jì)的一個(gè)構(gòu)件類別包含了一組公用接口,具體的某個(gè)驅(qū)動構(gòu)件類(class)要屬于這個(gè)類別,就必須繼承該類別,并實(shí)現(xiàn)該類別包含的所有接口。構(gòu)件類別本身沒有實(shí)現(xiàn)代碼,因此,構(gòu)件類別也可以被稱為抽象類或超類。
繼承于構(gòu)件類別的所有構(gòu)件類(class)均實(shí)現(xiàn)構(gòu)件類別中包含的所有接口,這也正是構(gòu)件類別作為類別中所有構(gòu)件類的公共入口點(diǎn)的技術(shù)基礎(chǔ)。
參見圖2,其為以打印驅(qū)動為例,用構(gòu)件類別創(chuàng)建構(gòu)件化驅(qū)動程序的模型示意圖。
應(yīng)用程序通過指定打印驅(qū)動類別來創(chuàng)建構(gòu)件驅(qū)動,操作系統(tǒng)為該應(yīng)用程序創(chuàng)建出類別中缺省的打印驅(qū)動,然后把該打印驅(qū)動的接口返回給應(yīng)用程序,應(yīng)用程序就可以直接調(diào)用該打印驅(qū)動對象的接口方法來執(zhí)行打印操作。
例如在應(yīng)用層,應(yīng)用程序通過指定打印機(jī)類別,例如HP LaserJet(一種類型的打印機(jī)),向操作系統(tǒng)提出創(chuàng)建打該印驅(qū)動的請求。
操作系統(tǒng)根據(jù)應(yīng)用程序指定的HP LaserJet類別標(biāo)識,找出該類別中缺省的構(gòu)件(在示意圖中為HP LasertJet),并創(chuàng)建出驅(qū)動構(gòu)件對象。
創(chuàng)建對象成功后,操作系統(tǒng)把對象的公共接口直接返回給應(yīng)用程序。這樣,應(yīng)用程序調(diào)用的接口方法就是直接調(diào)用HP LasertJet驅(qū)動對象的接口方法,不再需要操作系統(tǒng)的參與、轉(zhuǎn)接了。
參見圖3,具體的實(shí)現(xiàn)方法為首先定義驅(qū)動類別,例如在構(gòu)件對象模塊(Easy Component ObjectModel,簡稱ezCOM)的構(gòu)件描述語言(Component Description Language,簡稱CDL)文件中使用構(gòu)件描述語言定義的驅(qū)動類別,如定義一個(gè)名稱為“CatPrinter”的打印驅(qū)動類別,用具體的CDL語言描述如下[uuid(02aff0b1-a887-4da7-bf2e-626af6165a56)]category CatPrinter{interface IPrinter;}其中,[uuid(02aff0b1-a887-4da7-bf2e-626af6165a56)]與現(xiàn)有的COM規(guī)范相同;表示該構(gòu)件的屬性信息;category CatPrinter定義一個(gè)打印機(jī)類別CatPrinter;interface IPrinter定義一個(gè)打印機(jī)接口Iprinter。
打印驅(qū)動類別CatPrinter包含了一個(gè)打印機(jī)接口IPrinter(關(guān)于接口的概念及定義方式請參見相關(guān)COM規(guī)范)。本發(fā)明中,一個(gè)類別中允許定義一個(gè)到多個(gè)接口。
定義構(gòu)件類如果某個(gè)驅(qū)動構(gòu)件類要屬于打印驅(qū)動類別CatPrinter,那么它必須繼承該打印驅(qū)動類別CatPrinter,例如HP LaserJet 6L打印驅(qū)動構(gòu)件的定義方式,以具體的CDL語言描述如下[uuid(9defd903-6443-4eed-b4e4-a3020b448cb5),driver]class CHPLaserJet6LCatPrinter{interface ILaserJet6L;}
其中,[uuid(9defd903-6443-4eed-b4e4-a3020b448cb5),driver]與現(xiàn)有的COM規(guī)范相同;表示該構(gòu)件的屬性信息;class CHPLaserJet6LCatPrinter定義一個(gè)打印機(jī)類CHPLasterJet 6Linterface ILaserJet6L表示定義一個(gè)打印機(jī)接口ILaserJet6L。
其中,類CHPLasterJet6L的定義本身包含了打印機(jī)接口ILaserJet6L,同時(shí)由于它繼承了打印驅(qū)動類別CatPrinter,并且還包含了打印驅(qū)動類別CatPrinter中的打印機(jī)接口IPrinter。
此外,在構(gòu)件類(class)前的驅(qū)動(driver)屬性聲明之中,說明了類CHPLaserJet6L是一個(gè)驅(qū)動程序。因此,CHPLaserJet6L還必須實(shí)現(xiàn)另外一個(gè)隱含的系統(tǒng)接口驅(qū)動接口Idriver;因?yàn)?,?qū)動程序本身也是一個(gè)類別,操作系統(tǒng)中所有以驅(qū)動(driver)屬性定義的構(gòu)件類都屬于驅(qū)動程序類別CatDriver,驅(qū)動接口IDriver則包含在驅(qū)動程序類別CatDriver之中。
本實(shí)施例中,驅(qū)動程序類別CatDriver中包含了驅(qū)動接口IDriver。本實(shí)施例中所有驅(qū)動構(gòu)件類都是從驅(qū)動程序類別CatDriver繼承來的;其中,驅(qū)動程序類別CatDriver的定義如下[uuid(0000112d-0000-0000-C000-000000000066)]category CatDriver{interface IDriver;}其中,[uuid(0000112d-0000-0000-C000-000000000066)]與現(xiàn)有的COM規(guī)范相同;表示該構(gòu)件的屬性信息;category CatDriver定義一個(gè)驅(qū)動設(shè)備類別CatDriver;interface Idriver定義一個(gè)驅(qū)動設(shè)備接口Idriver;驅(qū)動設(shè)備類別Idriver包含了一個(gè)驅(qū)動設(shè)備接口Idriver。本發(fā)明中,一個(gè)類別中允許定義一個(gè)到多個(gè)接口。
實(shí)現(xiàn)構(gòu)件類使用ezCOM的CDL編譯器編譯定義驅(qū)動構(gòu)件類別以及構(gòu)件類的CDL文件,會產(chǎn)生構(gòu)件源程序的框架。該框架中包含了構(gòu)件類所有接口的方法,構(gòu)件實(shí)現(xiàn)者需要根據(jù)構(gòu)件的功能填寫相應(yīng)的實(shí)現(xiàn)代碼。以Cprinter為例,就必須實(shí)現(xiàn)IPrinter、ILaserJet6L及IDriver三個(gè)接口中的所有方法。
編譯構(gòu)件程序并自動注冊構(gòu)件類別實(shí)現(xiàn)代碼完成后,需要對構(gòu)件程序進(jìn)行編譯生成構(gòu)件的動態(tài)連接庫文件。構(gòu)件類別CatPrinter會被自動添加到類別注冊文件“category.cfg”之中,類CHPLasterJet69則會被添加到類別CatPrinter之中,同時(shí)也會被添加到構(gòu)件類別CatDriver之中。
重復(fù)上述的過程,可以定義并實(shí)現(xiàn)多個(gè)屬于對應(yīng)的驅(qū)動構(gòu)件類。
驅(qū)動構(gòu)件程序編譯生成后,可以通過編寫構(gòu)件客戶應(yīng)用程序來使用驅(qū)動程序提供的功能。構(gòu)件客戶程序可以通過使用類別的智能指針來創(chuàng)建驅(qū)動對象,例如通過以C++語言描述的類別CatPrinter創(chuàng)建打印驅(qū)動對象的代碼如下#import<printer.dll>
.......
CatPrinterRef catPrinterRef;hr=catPrinterRef.Instantiate();if(FAILED(hr)){......
}......
客戶程序創(chuàng)建驅(qū)動對象驅(qū)動構(gòu)件客戶程序通過類別創(chuàng)建驅(qū)動對象的實(shí)現(xiàn)過程如下1)指定驅(qū)動構(gòu)件類別標(biāo)識(CATID)來創(chuàng)建驅(qū)動對象;2)取該類別的缺省(default)CLSID;3)判斷該CLSID是否屬于驅(qū)動程序類別(CatDriver);4)使用CLSID創(chuàng)建具體的驅(qū)動對象;5)從驅(qū)動對象查詢出類別中的公用接口;6)返回類別公共接口;構(gòu)件客戶在得到上述的公共接口后,就可以調(diào)用這些公共接口的功能。
本發(fā)明中還包括構(gòu)件類別中的缺省類標(biāo)識(CLSID)的設(shè)定方法,具體的設(shè)定可以是下列的三種之一編譯工具在編譯構(gòu)件程序時(shí),可自動對構(gòu)件類別及其所屬的構(gòu)件類進(jìn)行注冊,并且將最后一個(gè)注冊到構(gòu)件類別中的CLSID作為該構(gòu)件類別的缺省CLSID。
使用專用的工具注冊構(gòu)件類別中的缺省類標(biāo)識。
當(dāng)編譯生成構(gòu)件程序的動態(tài)鏈接庫(DLL)文件后,編譯工具自動調(diào)用對構(gòu)件進(jìn)行注冊。
在沒有注冊文件的情況下,可以使用定義構(gòu)件類別的動態(tài)連接庫文件。如果該文件中有一個(gè)以上的構(gòu)件類屬于該類別,則使用第一個(gè)屬于該類別的構(gòu)件類作為缺省類,否則返回失敗。
最后應(yīng)說明的是以上實(shí)施例僅用以說明本發(fā)明而并非限制本發(fā)明所描述的技術(shù)方案;因此,盡管本說明書參照上述的各個(gè)實(shí)施例對本發(fā)明已進(jìn)行了詳細(xì)的說明,但是,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解,仍然可以對本發(fā)明進(jìn)行修改或者等同替換;而一切不脫離本發(fā)明的精神和范圍的技術(shù)方案及其改進(jìn),其均應(yīng)涵蓋在本發(fā)明的權(quán)利要求范圍當(dāng)中。
權(quán)利要求
1.一種基于類別創(chuàng)建驅(qū)動構(gòu)件對象實(shí)現(xiàn)設(shè)備驅(qū)動程序多態(tài)的方法,其特征在于至少包括步驟1定義并實(shí)現(xiàn)驅(qū)動構(gòu)件類別;步驟2構(gòu)件客戶程序基于該驅(qū)動構(gòu)件類別創(chuàng)建驅(qū)動對象。
2.根據(jù)權(quán)利要求1所述的基于類別創(chuàng)建驅(qū)動構(gòu)件對象實(shí)現(xiàn)設(shè)備驅(qū)動程序多態(tài)的方法,其特征在于所述的實(shí)現(xiàn)方法還進(jìn)一步包括在構(gòu)件類別中設(shè)定該類別的缺省類標(biāo)識(CLSID)。
3.根據(jù)權(quán)利要求2所述的基于類別創(chuàng)建驅(qū)動構(gòu)件對象實(shí)現(xiàn)設(shè)備驅(qū)動程序多態(tài)的方法,其特征在于所述的構(gòu)件類別中CLSID的設(shè)定方法為對構(gòu)件類別及其所屬的構(gòu)件類進(jìn)行注冊,并將最后一個(gè)注冊到構(gòu)件類別中的CLSID作為該構(gòu)件類別的缺省CLSID。
4.根據(jù)權(quán)利要求2所述的基于類別創(chuàng)建驅(qū)動構(gòu)件對象實(shí)現(xiàn)設(shè)備驅(qū)動程序多態(tài)的方法,其特征在于所述的構(gòu)件類別中CLSID的設(shè)定方法為步驟31讀入系統(tǒng)構(gòu)件類別注冊文件中的類別注冊信息;步驟32讀取打包在對應(yīng)的動態(tài)連接庫文件資源段(Resource Section)中的構(gòu)件元數(shù)據(jù);步驟33在構(gòu)件元數(shù)據(jù)中查找是否定義了新的類別,否則執(zhí)行步驟35;步驟34把包括驅(qū)動構(gòu)件類別標(biāo)識的新的類別信息添加到類別注冊信息中;步驟35在元數(shù)據(jù)中查找是否存在屬于類別注冊信息中構(gòu)件類別的構(gòu)件類,不存在,則執(zhí)行步驟37;步驟36將包括驅(qū)動構(gòu)件類別標(biāo)識的構(gòu)件類信息添加到相應(yīng)的構(gòu)件類別名下,并將該構(gòu)件類作為該類別的缺省構(gòu)件類;步驟37將修改后的類別注冊信息寫回到系統(tǒng)類別注冊文件中。
5.根據(jù)權(quán)利要求2所述的基于類別創(chuàng)建驅(qū)動構(gòu)件對象實(shí)現(xiàn)設(shè)備驅(qū)動程序多態(tài)的方法,其特征在于所述的構(gòu)件類別中CLSID的設(shè)定方法為如果定義構(gòu)件類別的動態(tài)連接庫文件中有一個(gè)以上的構(gòu)件類相應(yīng)的構(gòu)件類別,則使用最后一個(gè)屬于該類別的構(gòu)件類作為缺省類,否則返回失敗信息。
6.根據(jù)權(quán)利要求1所述的基于類別創(chuàng)建驅(qū)動構(gòu)件對象實(shí)現(xiàn)設(shè)備驅(qū)動程序多態(tài)的方法,其特征在于步驟1具體包括步驟11通過繼承定義的構(gòu)件類別定義構(gòu)件類;步驟12根據(jù)構(gòu)件的功能需求實(shí)現(xiàn)構(gòu)件類;步驟13編譯構(gòu)件程序并自動注冊構(gòu)件類別。
7.根據(jù)權(quán)利要求6所述的基于類別創(chuàng)建驅(qū)動構(gòu)件對象實(shí)現(xiàn)設(shè)備驅(qū)動程序多態(tài)的方法,其特征在于步驟13具體包括步驟131對構(gòu)件程序進(jìn)行編譯,生成構(gòu)件動態(tài)連接庫文件;步驟132將定義的構(gòu)件類別及類別所包含的構(gòu)件類進(jìn)行注冊。
8.根據(jù)權(quán)利要求1或6所述的基于類別創(chuàng)建驅(qū)動構(gòu)件對象實(shí)現(xiàn)設(shè)備驅(qū)動程序多態(tài)的方法,其特征在于在定義并實(shí)現(xiàn)驅(qū)動構(gòu)件類之前,還包括使用構(gòu)件描述語言定義驅(qū)動的類別。
9.根據(jù)權(quán)利要求1或6所述的基于類別創(chuàng)建驅(qū)動構(gòu)件對象實(shí)現(xiàn)設(shè)備驅(qū)動程序多態(tài)的方法,其特征在于所述的驅(qū)動構(gòu)件類允許定義一個(gè)或一個(gè)以上的接口。
10.根據(jù)權(quán)利要求1所述的基于類別創(chuàng)建驅(qū)動構(gòu)件對象實(shí)現(xiàn)設(shè)備驅(qū)動程序多態(tài)的方法,其特征在于步驟2具體包括步驟21指定要?jiǎng)?chuàng)建驅(qū)動對象的驅(qū)動構(gòu)件類別標(biāo)識(CATID);步驟22取該類別的缺省類標(biāo)識CLSID;步驟23判斷該CLSID是否屬于驅(qū)動程序類別,如果是,則執(zhí)行步驟24;如果不是,則使用CLSID創(chuàng)建出普通的構(gòu)件對象,執(zhí)行步驟26;步驟24使用CLSID創(chuàng)建具體的驅(qū)動對象;步驟25從驅(qū)動對象查詢(QueryInterface,COM規(guī)范所規(guī)定的用于從構(gòu)件對象中查詢它是否支持指定的接口的一個(gè)標(biāo)準(zhǔn)方法)出類別中的公用接口;步驟26返回該類別的公共接口。
全文摘要
一種基于類別創(chuàng)建驅(qū)動構(gòu)件對象實(shí)現(xiàn)設(shè)備驅(qū)動程序多態(tài)的方法,首先定義并實(shí)現(xiàn)驅(qū)動構(gòu)件類;然后,構(gòu)件客戶程序使用類別的智能指針創(chuàng)建驅(qū)動對象。本發(fā)明使操作系統(tǒng)根據(jù)客戶的指定,自動根據(jù)指定的構(gòu)件類型選用相應(yīng)的構(gòu)件,進(jìn)一步實(shí)現(xiàn)應(yīng)用程序?qū)︱?qū)動程序的多態(tài)訪問。不需為每個(gè)種類的驅(qū)動實(shí)現(xiàn)一個(gè)偽驅(qū)動作為公用入口,而只要定義這種驅(qū)動類別的公用接口,屬于這個(gè)類別的驅(qū)動都實(shí)現(xiàn)該公用接口;本發(fā)明只在創(chuàng)建驅(qū)動對象的過程中的動態(tài)綁定時(shí)才附加一些效率上的開銷;一旦驅(qū)動對象創(chuàng)建出來,操作系統(tǒng)把驅(qū)動對象所實(shí)現(xiàn)的公共接口返回給應(yīng)用程序,應(yīng)用程序就可以直接調(diào)用具體驅(qū)動對象的方法,沒有額外的效率開銷;實(shí)現(xiàn)了應(yīng)用程序?qū)︱?qū)動程序的多態(tài)訪問。
文檔編號G06F9/30GK1512323SQ02159488
公開日2004年7月14日 申請日期2002年12月31日 優(yōu)先權(quán)日2002年12月31日
發(fā)明者蘇翼鵬, 陳榕, 杜永文, 梁宇洲 申請人:北京科泰世紀(jì)科技有限公司