亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

用于不受支持的設(shè)備的即插即用功能的制作方法

文檔序號:6637200閱讀:420來源:國知局
專利名稱:用于不受支持的設(shè)備的即插即用功能的制作方法
相關(guān)申請本實(shí)用新型專利申請,依據(jù)美國專利法第119(e)條第35款,要求2004年5月14日提交的號碼為60/571,271的美國臨時專利申請的權(quán)益,在這里引用其全文內(nèi)容作為參考。
背景技術(shù)
過去的十年中,在零售商消費(fèi)設(shè)備方面幾乎沒有什么改進(jìn)?,F(xiàn)在,安裝零售設(shè)備的經(jīng)過與即插即用功能出現(xiàn)之前在PC上安裝設(shè)備是相似的。通常,當(dāng)試圖安裝該設(shè)備時,網(wǎng)卡、調(diào)制解調(diào)器、鼠標(biāo),以及其它網(wǎng)卡之間會出現(xiàn)設(shè)備端口沖突的問題。時常,零售商必須“打開機(jī)箱,找到設(shè)備,并且改變跳線設(shè)置”或者執(zhí)行一些類似的非用戶友好的操作。安裝這些設(shè)備是困難并且費(fèi)時的。
發(fā)明概述簡裝的說,本發(fā)明旨在為不受操作系統(tǒng)支持的設(shè)備提供即插即用(PnP)的功能。
根據(jù)本發(fā)明的一個方面,當(dāng)安裝一個不受支持的設(shè)備時,它會被操作系統(tǒng)檢測到。響應(yīng)于這種安裝操作,操作系統(tǒng)將該事件發(fā)送給駐留在用戶模式中的設(shè)備管理應(yīng)用程序。一旦接收到該安裝事件,該設(shè)備管理應(yīng)用程序確定添加進(jìn)來的設(shè)備并自動安裝支持配置入口和軟件。例如,該設(shè)備管理應(yīng)用程序會自動更新注冊表并為該設(shè)備安裝支持二進(jìn)制代碼。當(dāng)設(shè)備安裝完畢后,在不需要改變?nèi)魏纬绦蛟O(shè)計的情況下,通過一種應(yīng)用程序就可以對該設(shè)備進(jìn)行訪問。
根據(jù)本發(fā)明的另一方面,通過一個公共控制庫(CCL)將PnP事件公開給零售應(yīng)用程序。該庫旨在為訪問該設(shè)備提供通用接口。通過使用CCL,注冊的應(yīng)用程序可以接收與該設(shè)備相關(guān)聯(lián)的事件。
根據(jù)本發(fā)明的又一方面,CCL用來對在內(nèi)核的用戶模式下操作的零售設(shè)備進(jìn)行控制,其中該用戶模式是與內(nèi)核模式相反的。


圖1示出的是一個操作環(huán)境;圖2示出的是PnP零售系統(tǒng)的通用系統(tǒng)框圖;
圖3示出的是該P(yáng)nP系統(tǒng)的高層結(jié)構(gòu)圖;圖4示出的是該P(yáng)nP系統(tǒng)與CCL之間的交互;圖5示出的是集成有該P(yáng)nP零售系統(tǒng)的遺產(chǎn)(legacy)設(shè)備的結(jié)構(gòu);圖6示出的是示意性的幫助類和服務(wù)對象(SO)資料庫;圖7示出的是集成的示意性顯示,用于提供關(guān)于接入到系統(tǒng)中的POS設(shè)備的信息;以及圖8示出的是根據(jù)本發(fā)明諸多方面的已安裝的POS設(shè)備上的性屏幕快照。
優(yōu)選實(shí)施例的詳細(xì)說明本發(fā)明旨在讓系統(tǒng)不支持的零售設(shè)備的用戶象其它設(shè)備的用戶那樣獲得“即插即用”般的感受。當(dāng)安裝一個不受支持的設(shè)備時,操作系統(tǒng)發(fā)送一個事件,如一個PnP事件,給在用戶模式下操作的設(shè)備管理應(yīng)用程序,該模式允許應(yīng)用程序通過一個公共控制庫(CCL)訪問該設(shè)備。該CCL庫旨在顯著簡化用于不受支持的設(shè)備的應(yīng)用程序和服務(wù)對象的編寫,提高產(chǎn)品的兼容性和質(zhì)量,并降低成本。
根據(jù)本發(fā)明的一個實(shí)施例,遵循在統(tǒng)一服務(wù)終端(UPOS)V1.8規(guī)范中定義的零售設(shè)備分類法。UPOS V1.8規(guī)范可以從國家零售聯(lián)合會的網(wǎng)站上(www.nrf-arts.org)獲得。UPOS支持的一些零售設(shè)備包括碰撞條;現(xiàn)金兌換機(jī);現(xiàn)金出票機(jī);信用卡認(rèn)證終端;投幣自動售貨機(jī);財務(wù)打印機(jī);硬件核對機(jī);鍵鎖;條形碼掃描器;音調(diào)指示器;動作檢測器;線路顯示器;磁性墨水字符識別讀取器;磁條讀取器;個人身份號碼簿;點(diǎn)卡;POS鍵盤;POS打印機(jī);遠(yuǎn)程訂單顯示器;稅率表簽名識別器;以及支票圖像掃描儀。本發(fā)明不限于支持的零售設(shè)備。任何沒有包括在操作系統(tǒng)的支持的PnP設(shè)備列表中的設(shè)備都能夠得到支持。
貫穿于整個規(guī)范,除非上下文中明確的作出其它指示,下列術(shù)語的定義如下。術(shù)語“OPOS”指的是銷售或服務(wù)終端的對象鏈接和嵌入(Ole)。術(shù)語““UPOS”指的是用于銷售或服務(wù)終端的統(tǒng)一規(guī)范。術(shù)語“POS類外設(shè)”或“OPOS設(shè)備”指的是落入到UPOS V1.8規(guī)范中定義的24種不同設(shè)備分類中之一的設(shè)備的集合。術(shù)語“設(shè)備類”是POS設(shè)備的一個類別,共享屬性,方法,以及事件的相容組。例子是現(xiàn)金出票機(jī)和POS打印機(jī)。一些設(shè)備支持多于一種設(shè)備類。例如,某些POS打印機(jī)包括一個現(xiàn)金出票機(jī)。術(shù)語“控制對象(CO)”指的是一個對象,它將該組屬性,方法,以及事件公開給一個用于指定設(shè)備類的應(yīng)用程序。術(shù)語“服務(wù)對象(SO)”指的是一個對象,它由一個CO來調(diào)用,并為一個指定設(shè)備執(zhí)行UPOS指定的功能。SO能夠在CLR支持的任何語言環(huán)境下執(zhí)行,包括本地代碼。術(shù)語“不支持的設(shè)備”或“非支持設(shè)備”指的是在缺省條件下,不受基礎(chǔ)操作系統(tǒng)支持的任何設(shè)備。
示例性操作環(huán)境以下參照如圖1所示,一個用來執(zhí)行本發(fā)明的示意性系統(tǒng)包括一個計算設(shè)備,如計算設(shè)備100。在一個非?;镜呐渲弥?,計算設(shè)備100典型的包括至少一個處理單元102和系統(tǒng)內(nèi)存104。取決于計算設(shè)備的精確配置和類型,系統(tǒng)內(nèi)存可以是易失性的(如RAM),非易失性的(如ROM,閃存等等)或二者的一些組合。系統(tǒng)內(nèi)存104典型的包括一個操作系統(tǒng)105,一個或多個程序模塊106,并且可以包括程序數(shù)據(jù)107。PnP零售應(yīng)用程序120旨在為零售設(shè)備提供PnP功能。圖1中虛線108內(nèi)的那些組件示出了這個基本配置。
計算設(shè)備100可以帶有額外的特性和功能。例如,計算設(shè)備100也可以包括額外的數(shù)據(jù)存儲設(shè)備(可移動的和/或不可移動的),例如磁盤,光盤或磁帶。圖1中,可移動存儲裝置109和不可移動存儲裝置110示出這種存儲裝置。計算機(jī)存儲介質(zhì)可以包括采用任何方法或技術(shù)制造的易失性的和非易失性的,可移動的和不可移動的介質(zhì),來存儲信息,這些信息可以是計算機(jī)可讀指令,數(shù)據(jù)結(jié)構(gòu),程序模塊或其它數(shù)據(jù)。系統(tǒng)內(nèi)存104,可移動存儲裝置109以及不可移動存儲裝置110都是計算機(jī)存儲介質(zhì)的示例。計算機(jī)存儲介質(zhì)包括,但不局限于,RAM,ROM,EEPROM,閃存或其它存儲技術(shù),CD-ROM,數(shù)字化視頻光盤(DVD)或其它的光學(xué)存儲裝置,磁帶盒,磁帶,磁盤存儲裝置或其它的磁存儲設(shè)備,或任何可以用來存儲想要的信息并能夠由計算設(shè)備100進(jìn)行訪問的介質(zhì)。任何這樣的計算機(jī)存儲介質(zhì)可以是設(shè)備100的一部分。計算設(shè)備100還可以包括輸入設(shè)備(多個)112,如零售設(shè)備,鍵盤,鼠標(biāo),筆,語音輸入設(shè)備,觸摸輸入設(shè)備等等。還可以包括輸出設(shè)備(多個)114,如顯示器,揚(yáng)聲器,打印機(jī)等等。
計算設(shè)備100還可以包括通訊連接器116,允許該設(shè)備與其它的計算設(shè)備118進(jìn)行通訊,如通過網(wǎng)絡(luò)。通訊連接器116是通訊介質(zhì)的一個例子。通訊介質(zhì)典型的可以通過計算機(jī)可讀指令,數(shù)據(jù)結(jié)構(gòu),程序模塊,或調(diào)制數(shù)據(jù)信號中的其它數(shù)據(jù),如載波或其它傳輸機(jī)制來實(shí)現(xiàn),以及包括任何信息傳輸介質(zhì)。術(shù)語“調(diào)制數(shù)據(jù)信號”指的是包括一個或多個自身特征集合或按照信號中的編碼信息的方式進(jìn)行改變的信號。舉例來說,但并不局限于此,通訊介質(zhì)包括象有線網(wǎng)絡(luò)或直接連線連接這樣的有線介質(zhì),也包括象聲頻,射頻,紅外這樣的無線介質(zhì)以及其它的無線介質(zhì)。這里用到的術(shù)語計算機(jī)可讀介質(zhì)包括存儲介質(zhì)和通訊介質(zhì)。
零售設(shè)備的即插即用(PnP)圖2示出的是根據(jù)本發(fā)明諸多方面的PnP零售系統(tǒng)的一個通用系統(tǒng)框圖。
用于零售設(shè)備的PnP支持簡化了安裝和維護(hù)POS設(shè)備的任務(wù)。例如,終端用戶可以簡單的拔下一個POS設(shè)備,并且可以在不需要重新啟動或重新配置他們的機(jī)器來與新設(shè)備發(fā)生相互作用的情況下,插入新的POS設(shè)備。
通常的,當(dāng)用戶安裝一個不支持的設(shè)備時,如零售設(shè)備210,該安裝作為一個PnP事件被操作系統(tǒng)220檢測到。然而,操作系統(tǒng)220不能安裝這樣的零售設(shè)備,因?yàn)樵撛O(shè)備是不支持的,并且操作系統(tǒng)不具備安裝這樣的設(shè)備需的知識。一旦有了PnP事件,PnP管理器225就將該事件發(fā)送給設(shè)備管理器應(yīng)用程序230。因?yàn)樵O(shè)備管理器應(yīng)用程序230駐留在用戶模式中,與操作系統(tǒng)的內(nèi)核模式相比較而言,設(shè)備管理器應(yīng)用程序230可以在不改變操作系統(tǒng)的情況下進(jìn)行調(diào)整。一旦初始化,設(shè)備管理器230注冊以便從操作系統(tǒng)接收PnP事件,象其它I/O事件一樣。
由操作系統(tǒng)220發(fā)送到設(shè)備管理器應(yīng)用程序230的PnP事件包括一個已安裝的設(shè)備的設(shè)備ID。設(shè)備管理器230試圖從接收到的設(shè)備ID中識別該設(shè)備。當(dāng)該設(shè)備是設(shè)備管理器230支持的設(shè)備時,設(shè)備ID給安裝INF文件提供一個映射,該安裝INF文件描述了組件,注冊表設(shè)置,以及與該設(shè)備相關(guān)聯(lián)的類似的配置選項(xiàng)。根據(jù)一個實(shí)施例,與該設(shè)備有關(guān)的配置設(shè)置存儲在設(shè)置文件(245)中。根據(jù)一個實(shí)施例,配置文件存儲為XML,它包括應(yīng)該怎么樣配置該設(shè)備的指令。上下文中的配置是指對什么樣的服務(wù)對象(SO)映射給哪個設(shè)備進(jìn)行識別。包含在XML文件中的信息所包括的項(xiàng)目,例如設(shè)備ID;設(shè)備類;IHV名;SO名;SO GUID;設(shè)備的特殊屬性(端口速度,多接頭設(shè)備等等);用于設(shè)備管理的啟動UI的入口終端,等等。最后獲知的設(shè)備狀態(tài)也作為設(shè)備配置的一部分進(jìn)行保存。最后獲知的狀態(tài)在調(diào)試設(shè)備進(jìn)可能是很有用的。
根據(jù)本發(fā)明的一個實(shí)施例,模板INF文件提供給每個支持的設(shè)備類,作為軟件開發(fā)包(SDK)的一部分。模板INF文件的目的在于識別標(biāo)準(zhǔn)注冊表和支持公共控制庫(CCL)所需的配置元素。當(dāng)設(shè)備管理器應(yīng)用程序230識別出未管理的設(shè)備是一個零售設(shè)備時,CCL235公開給對零售設(shè)備210感興趣的POS應(yīng)用程序(240)。
當(dāng)接收來自操作系統(tǒng)的事件并識別該設(shè)備時,設(shè)備管理器應(yīng)用程序230自動的更新注冊表和相關(guān)的配置入口,并且在無需用戶介入的情況下,基于相關(guān)聯(lián)的INF文件為該設(shè)備安裝支持的二進(jìn)制文件。然后,在無需知道使用特定設(shè)備的特殊規(guī)定的情況下,POS應(yīng)用程序240可以使用CCL235中的功能,對零售設(shè)備210進(jìn)行訪問。
CCL235旨在為應(yīng)用程序提供與支持的設(shè)備有關(guān)的屬性,方法以及事件。根據(jù)一個實(shí)施例,CCL235通過.NET類庫,為每個支持的設(shè)備類提供UPOS屬性,方法以及事件以作為管理的代碼,這些設(shè)備類都是在UPOS V1.8規(guī)范中指定的。也可以支持其它的設(shè)備。通常的,操作系統(tǒng)的PnP系統(tǒng)不支持的任何設(shè)備,可以通過設(shè)備管理器應(yīng)用程序230在用戶模式代碼中得到支持。
圖3示出的是根據(jù)本發(fā)明諸多方面的PnP系統(tǒng)的高層次結(jié)構(gòu)框圖。如圖所示,該結(jié)構(gòu)框圖包括操作系統(tǒng)在核心模式中提供的功能(線335以下)和在用戶模式中提供的功能(線335以上)。
I/O系統(tǒng)350在操作系統(tǒng)的核心模式下進(jìn)行操作,并提供I/O管理(365),電源管理(360)和PnP管理(355)。I/O管理器提供標(biāo)準(zhǔn)I/O管理。電源管理360將不由操作系統(tǒng)管理的電源事件發(fā)送給設(shè)備管理器應(yīng)用程序310。PnP管理器355檢測PnP事件并將該事件提供給設(shè)備管理器應(yīng)用程序310。PnP事件管理器320判斷什么事件與設(shè)備管理器310所支持的設(shè)備有關(guān),并將它已經(jīng)注冊準(zhǔn)備接收的任何事件提供給POS應(yīng)用程序305。
互操作層315用于使基于遺產(chǎn)COM的零售設(shè)備能夠被指向CCL的應(yīng)用程序使用。換句話說,互操作層315旨在為POS設(shè)備305提供一種使用相同方法就能夠?qū)nP設(shè)備和遺產(chǎn)設(shè)備進(jìn)行訪問的統(tǒng)一的方式。遺產(chǎn)OPOS設(shè)備通常存儲關(guān)于它們自己的信息,識別通信路徑,來堅(jiān)持配置數(shù)據(jù)。例如,一個系統(tǒng)注冊表可以用來存儲這樣的信息。典型的,每個設(shè)備制造商將提供一個常規(guī)應(yīng)用程序來管理設(shè)備的配置。
圖4示出的是根據(jù)本發(fā)明諸多方面的PnP系統(tǒng)與CCL之間的交互。如圖所示,系統(tǒng)400包括POS應(yīng)用程序405,公共API(CCL)415,列舉器420,PnP系統(tǒng)430,SO資料庫440,配置管理器450,以及.NET框架和Win32層。
POS應(yīng)用程序405與API410進(jìn)行交互,進(jìn)而與CCL支持的設(shè)備進(jìn)行交互。API410為POS應(yīng)用程序405提供由應(yīng)用程序所注冊接收的PnP事件。
根類415在公共API410中進(jìn)行公開并作為所有操作的一個單獨(dú)入口終端。API410給應(yīng)用程序,如POS應(yīng)用程序405,提供對已安裝的POS設(shè)備進(jìn)行計數(shù)的能力,為它們用具體例子說明服務(wù)對象的能力,并在POS設(shè)備連接或斷開連接時接收即插即用事件的能力。
根據(jù)一個實(shí)施例,根類415公開了下面的方法GetDevice()返回一個安裝到機(jī)器上的所有POS設(shè)備的集合;GetDevice(字符串類型)返回一個安裝到機(jī)器上的給定類型的POS設(shè)備的集合;GetDefaultDevice(字符串類型)為給定類型的缺省設(shè)備返回IDevice接口;以及OpenControl(IDevice設(shè)備)返回被請求的服務(wù)對象的情況(IPOSControl接口)。
根類415還為POS應(yīng)用程序510公開了兩個即插即用事件OnDeviceAdded和OnDeviceRemoved,當(dāng)POS設(shè)備連接到機(jī)器或從機(jī)器斷開連接時會發(fā)出這兩個事件。
OPOS定義了服務(wù)對象發(fā)出的5個事件OnDataEvent;OnDirectIOEvent;OnErrorEvent;OnOutputCompleteEvent;以及OnStatusUpdateEvent。不同的設(shè)備類會發(fā)出,所有的事件,或事件的子集,或一個事件也不發(fā)出。這些事件都添加到IPOSControl接口。用于每個OPOS標(biāo)準(zhǔn)不能簡單支持一些或全部事件的設(shè)備類的SO將不會發(fā)出它們。
該根類還檢測機(jī)器上安裝了什么樣的服務(wù)對象,以及通過已經(jīng)安裝的SO(420)的內(nèi)部列舉器返回的列舉器,把那樣的信息呈現(xiàn)給應(yīng)用程序。根類410通過塊420與操作系統(tǒng)的即插即用系統(tǒng)430集成到一起,通過硬件ID來判斷一個由已經(jīng)安裝的服務(wù)對緣支持的物理設(shè)備當(dāng)前是否處于已經(jīng)連接或已經(jīng)打開。
塊420為.NET服務(wù)對象掃描.NET SO資料庫440。根據(jù)一個實(shí)施例,塊420對在HKLM\SOFTWARE\OLEforRetail.NET\ControlAssemblies注冊表鍵中指定的目錄進(jìn)行掃描。該鍵可以包括多個字符串值每個要掃描的目錄有一個值。.NET SO是配備給特定常規(guī)屬性的dll。一個SO匯編中的每個服務(wù)對象類都帶有一個POSServiceObject屬性,該屬性指定了服務(wù)對象的設(shè)備類,名稱,描述,以及版本。例如[POSServiceObjectAttribute(“MSR”,“CommonMSR”,“Common service objectfor magnetic stripe reader”,“1.0.0”)]配置管理器550讀取配置文件并用于將PnP硬件ID映射到多個遺產(chǎn)SO;擴(kuò)展到.NET SO元數(shù)據(jù);將非PnP設(shè)備映射到多個SO;無效設(shè)備;以及安全設(shè)置。
可以有一個或多個POSHardwareId屬性,將物理設(shè)備的硬件ID映射到SO。這些ID是硬件ID,也是由其即插即用子系統(tǒng)使用的。在通過指定較低和較高的id范圍而得到的范圍內(nèi),對硬件id進(jìn)行定義。例如[POSHardwareId(“USB\Vid_05d9&Pid_a794&Rev_0000”,“USB\Vid_05d9&Pid_a794&Rev_9999”)]。
根據(jù)一個實(shí)施例,為遺產(chǎn)服務(wù)對象,根類415讀取了HKLM\SOFTWARE\OLEforRetail\ServiceOPOS注冊表鍵。所有注冊的OPOS服務(wù)對象的名稱和標(biāo)題性ID都在按設(shè)備類型成組的鍵之下進(jìn)行定義。用于遺產(chǎn)SO的硬件id通過配置放入到指定的文件夾中的XML文件進(jìn)行定義。
正如上面討論的,根據(jù)一個實(shí)施例,CCL對POS應(yīng)用程序公開了UPOS V1.8的屬性,方法和事件,作為用于每個在UPOS規(guī)范中定義的支持設(shè)備類的管理代碼。
CCL410是代表每個設(shè)備類的控制對象(CO)的匯編集合。該CCL為應(yīng)用程序,例如售貨終端應(yīng)用程序,提供了應(yīng)用程序接口。該服務(wù)對象執(zhí)行API并且支持該CO的類的一個設(shè)備。接下來是標(biāo)準(zhǔn)屬性,方法和事件的示意性列表。

根據(jù)一個實(shí)施例,UPOS V1.8常數(shù)被執(zhí)行并且遵照由UPOS建立的分類和命名慣例。根據(jù)一個實(shí)施例,該CCL以.NET代表的形式公開UPOS事件。另外,該庫公開了與POS設(shè)備有關(guān)的PnP事件。
該CCL定義接口以及它們的設(shè)備類名稱。該庫也允許定義額外的設(shè)備類。
該IPhysicalDevice接口公開了幾個關(guān)于該將要被接入或移除的指定設(shè)備的屬性,如它的安裝狀態(tài),POS設(shè)備類,全部設(shè)備路徑,描述以及硬件Id。這些信息將應(yīng)用程序需要的上下文提供給應(yīng)用程序,使得它能夠作出關(guān)于如何處理該事件的決定。
public interface IPhysicalDevice{string Description{get;}string DevicePath {get;}string Class {get;}string[] HardwareIds{get;}bool Installed {get;}}PnP支持在該P(yáng)hysicalDeviceInfo類中實(shí)現(xiàn)。根據(jù)一個實(shí)施例,該P(yáng)hysicalDeviceInfo類是從System.Windows.Forms.Form繼承來的管理類。因?yàn)楸镜夭僮飨到y(tǒng)事件通過窗口消息公開給應(yīng)用程序并且*.Form包裝了一個本地窗口,因此PhysicalDeviceInfo繼承于*.Form。該本地窗口用于從OS中捕獲PnP事件并且不進(jìn)行顯示。
當(dāng)指明該P(yáng)hysicalDeviceInfo類是為來自所有設(shè)備接口類的PnP事件而注冊的時候,這樣它就公開什么時候任何支持PnP的設(shè)備添加到素統(tǒng)中或從系統(tǒng)中移除(包括非POS設(shè)備)的事件。該P(yáng)hysicalDeviceInfo類還建立了一個系統(tǒng)目前所知道的所有設(shè)備的內(nèi)部列表,并且判斷哪一個是當(dāng)前接入并啟動的。這個類還包括幫助方法來返回設(shè)備的完全列表并且查詢指定設(shè)備的當(dāng)前狀態(tài),其中幫助方式是在設(shè)備計數(shù)期間由CCO.Net使用的。設(shè)備列舉和設(shè)備信是通過本地API調(diào)用來完成的,本地API是通過P-Invoke類型互用而成為多個Win32API的。
該P(yáng)hysicalDeviceInfo類將本地操作系統(tǒng)PnP事件作為事件公開給該根CCO.Net類。這些事件返回執(zhí)行該P(yáng)hysicalDevice接口的IPhysicalDevice對象。該P(yáng)hysicalDevice類是代表單個設(shè)備的類,并且公開幾個關(guān)于設(shè)備的屬性,如它的硬件Id,描述等等。這是最終喚起應(yīng)用程序的同一個對象。
訪問方法和屬性一個想要訪問該庫支持的設(shè)備的應(yīng)用程序,如POS應(yīng)用程序405,應(yīng)該首先在調(diào)用其它方法之前打開該設(shè)備。根據(jù)一個實(shí)施例,在成功打開一個設(shè)備之前試圖調(diào)用一個方法會導(dǎo)致致OPOSClosedException發(fā)生。訪問專用設(shè)備需求的應(yīng)用程序應(yīng)該聲明并且在調(diào)用大部分方法之前啟動該設(shè)備。訪問可共享設(shè)備的應(yīng)用程序應(yīng)該在試圖調(diào)用大部分方法之前啟動該設(shè)備。在成功打開一個設(shè)備之前,與該設(shè)備關(guān)聯(lián)的大部分屬性的值沒有初始化。在已為設(shè)備初始化屬性之后,隨后聲明和對設(shè)備的啟動沒有重新初始化這些屬性。這些屬性保持被初始化直到設(shè)備關(guān)閉。
由設(shè)備管理器應(yīng)用程序接收的數(shù)據(jù)作為DataEvent進(jìn)行排隊(duì)。如果當(dāng)接收數(shù)據(jù)時,該AutoDisable屬性設(shè)為TRUE,那么該控制自動使它自己本身無效并將DeviceEnabled屬性設(shè)為FALSE。這樣就禁止了該控制從進(jìn)一步輸入中進(jìn)行排隊(duì)并且當(dāng)可能時,物理地使該設(shè)備無效。
當(dāng)該應(yīng)用程序準(zhǔn)備好從該設(shè)備接收輸入時,它將DataEventEnabled屬性設(shè)為TURE。然后,當(dāng)輸入被接收時(通常作為硬件中斷的結(jié)果),該控制進(jìn)行排隊(duì)并將DataEvent發(fā)送給已經(jīng)請求該事件的應(yīng)用程序。如果已經(jīng)將數(shù)據(jù)進(jìn)行了排隊(duì),那么將對該DataEvent進(jìn)行發(fā)送。這個事件可包括通過數(shù)字參數(shù)的輸入狀態(tài)信息。就在發(fā)出該事件之前,該控制把按照要而增加了其它信息的輸入數(shù)據(jù)放到設(shè)備指定性當(dāng)中。
就在發(fā)送該事件之前,通過將DataEventEnabled屬性設(shè)為FALSE,該控制使進(jìn)一步的數(shù)據(jù)事件無效。這會導(dǎo)致通過該控制對隨后輸入的數(shù)據(jù)進(jìn)行排隊(duì),而該應(yīng)用程序處理當(dāng)前輸入和相關(guān)屬性。當(dāng)該應(yīng)用程序已經(jīng)完成了當(dāng)前輸入并準(zhǔn)備更多的數(shù)據(jù)時,它通過將DataEventEnabled設(shè)為TURE來重新啟動事件。
如果該輸入設(shè)備是專用設(shè)備,該應(yīng)用程序在該設(shè)備開始讀取輸入之前進(jìn)行聲明并且啟動該設(shè)備。對于可共享的輸入設(shè)備,在該設(shè)備開始讀取輸入之前,可以打開一個或多個應(yīng)用程序并且啟動該設(shè)備。在該控制使用DataEvent向設(shè)備發(fā)送數(shù)據(jù)之前,應(yīng)用程序調(diào)用ClaimDevice方法來請求對該設(shè)備進(jìn)行單獨(dú)訪問。如果接收到事件-驅(qū)動輸入,但是沒有應(yīng)用程序已經(jīng)對該設(shè)備進(jìn)行聲明,那么對該輸入進(jìn)行緩沖直到一個應(yīng)用程序?qū)υ撛O(shè)備進(jìn)行聲明(并且該DataEventEnabled屬性為TURE)。這樣的行為允許在多個應(yīng)用程序之間按順序共享設(shè)備,有效的在它們之間傳遞該輸入焦點(diǎn)。
如果該控制在獲取或處理事件-驅(qū)動輸入時遇到了一個誤,那么該控制將它的狀態(tài)改為Error,并且對一個或兩個ErrorEvents進(jìn)行排隊(duì)來警告該應(yīng)用程序有錯誤情況。這個事件(或多個事件)不進(jìn)行發(fā)送直到該DataEventEnabled屬性為TURE,以便按順序編好應(yīng)用程序。根據(jù)一個實(shí)施例,對帶有以下片段的錯誤事件和表達(dá)式進(jìn)行發(fā)送InputwithData(OPOS_EL_INPUT_DATA)——當(dāng)一個或多個DataEvents進(jìn)行排隊(duì)時,如果該錯誤發(fā)生,則對其進(jìn)行排隊(duì)。它排在所有DataEvents之前。一種典型的實(shí)現(xiàn)方式是將把它放在事件隊(duì)列的最前面。這個事件使應(yīng)用程序能夠立即清除掉輸入,或選擇性的警告用戶對錯誤注意并處理經(jīng)過緩沖的輸入。接下來的情形可能在描器控制方面有用該用戶能夠立即被警告注意該錯誤,以至于直到該錯誤被決,否則不會對更多的項(xiàng)目進(jìn)行掃描。任何前面掃描過的項(xiàng)目在執(zhí)行錯誤恢復(fù)之前能夠被成功地進(jìn)行處理。
InputNoData(OPOS_EL_INPUT)——當(dāng)已經(jīng)發(fā)生了一個錯誤并且沒有數(shù)據(jù)可用時,對其進(jìn)行發(fā)送。一種典型的實(shí)現(xiàn)方式是將把它放到事件隊(duì)列的最后面。當(dāng)該錯誤發(fā)生時,如果一些數(shù)據(jù)已經(jīng)排在隊(duì)列中,那么對一個帶有“InputWithData”片段的ErrorEvent進(jìn)行排隊(duì)并首先發(fā)送出去,然后在所有DataEvents已經(jīng)發(fā)送之后,對這個錯誤事件進(jìn)行發(fā)送。如果發(fā)送了一個“InputWithData”事件并且該應(yīng)用程序事件句柄響應(yīng)了一個“清除”,那么這個“InputNoData”事件就不發(fā)送。
當(dāng)發(fā)生了下面的一種情況時,該控制退出錯誤狀態(tài)(1)應(yīng)用程序從InputNoDataErrorEvent返回;(2)應(yīng)用程序從InputWithData ErrorEvent返回,并帶有OPOS_ER_CLEAR;以及(3)應(yīng)用程序調(diào)用ClearInput方法。
對于一些控制來說,應(yīng)用程序調(diào)用一種方法以便開始事件驅(qū)動輸入。在該控制接收到輸入之后,接著典型地,不會再接收到額外的輸入,直到該方法被重新調(diào)用來重新開始輸入為止。示例包括MICR和簽名獲取設(shè)備。驅(qū)動輸入事件的這種變化有時候會被稱為“異步輸入”。
可以通過讀取該DataCount屬性來獲取由該控制進(jìn)行排隊(duì)的DataEvents的數(shù)量。所有由一個控制進(jìn)行排隊(duì)的輸入可以通過調(diào)用ClearInput方法來將其刪除。ClearInput可以在用于可共享設(shè)備的打開(Open)之后和用于專用設(shè)備的聲明設(shè)備(ClaimDevice)之后進(jìn)行調(diào)用。
一般的事件驅(qū)動輸入模型不排除對包括直接返回輸入數(shù)據(jù)的方法或?qū)傩缘脑O(shè)備類進(jìn)行定義。一些設(shè)備類定義這些方法和屬性,以便以更直觀或更靈活的方式來操作。一個示例是該鍵鎖設(shè)備。這種類型的輸入有時候稱為“同步輸入”。
輸出該OPOS輸出模型包括同步和異步輸入。一個設(shè)備類可以支持一種或兩種類型,或兩種類型都不支持。
同步輸出當(dāng)設(shè)備輸出能夠很快執(zhí)行的時候,優(yōu)選使用同步輸出。它的優(yōu)點(diǎn)是簡單。該應(yīng)用程序調(diào)用一個類指定方法來執(zhí)行輸出。該控制不進(jìn)行返回,直到完成該輸出為止。當(dāng)在這種類型輸出期間發(fā)生了錯誤時,發(fā)出一個OPOSException。
異步輸出在先進(jìn)先出基礎(chǔ)上執(zhí)行異步輸出。當(dāng)設(shè)備輸出需要慢速硬件交互時,優(yōu)選使用這種輸出類型。它的優(yōu)點(diǎn)是能夠被察覺到的響應(yīng)性,這是因?yàn)閼?yīng)用程序能夠在該設(shè)備正執(zhí)行該輸出時執(zhí)行其它的操作。應(yīng)用程序調(diào)用類指定方法來啟動輸出。該控制將該請求緩沖在程序存儲器中,使得一旦物理設(shè)備能夠接收并處理它,就將它發(fā)送到物理設(shè)備,將OutputID屬性設(shè)為該需求的一個識別符,然后一旦可能就將它返回。當(dāng)該設(shè)備成功的完成請求時,OPOS發(fā)出一個OutputCompleteEvent。該事件的一個參數(shù)包括了完成的請求的OutputID。
如果在執(zhí)行異步請求時發(fā)生了一個錯誤,就發(fā)出一個ErrorEvent。該應(yīng)用程序的事件句柄要么重試這個特殊的輸出,要么將它清除。當(dāng)ErrorEnevt在進(jìn)程中時,該控制處于錯誤狀態(tài)。
所有經(jīng)過緩沖的輸出數(shù)據(jù),包括所有異步輸出在內(nèi),能夠通過調(diào)用ClearOutput而將它們刪除。不必再為清除掉的輸出發(fā)出OutputCompleteEvents。該方法還能夠停止可能在進(jìn)程中的任何輸出(當(dāng)可能的時候)。
錯誤處理通過異常事件來執(zhí)行庫中的錯誤處理。該錯誤基于在UPOS V1.8規(guī)范中的定義的HRESULT代碼(ResultCode和ResultCodeExtended值)。該P(yáng)OSException類從System.ApplicationException衍生出來,并且是一個基礎(chǔ)異常事件類。該類還為OPOS錯誤代碼定義了常數(shù)。POSControlException從POSException衍生出來并由服務(wù)對象發(fā)出。POSLibraryException也從POSException衍生出來并由該庫發(fā)出。
根據(jù)一個實(shí)施例,錯誤處理從System.ApplicationException衍生出來。這個衍生類執(zhí)行出自UPOS規(guī)范的ResultCode和ResultCodeExtended屬性。
安全該CCL,即插即用特性以及設(shè)備列舉特性用基于角色的安全來對服務(wù)對象進(jìn)行訪問。設(shè)備管理包括對UI的需求以及對與服務(wù)對象有關(guān)的角色的相關(guān)配置的需求。
公開了一個幫助類,它列舉了接入到系統(tǒng)上的經(jīng)過連接和配置的設(shè)備。這個類公開了公共方法,該方法允許應(yīng)用程序開發(fā)者通過查詢CCL來判斷什么設(shè)備是可以訪問的。這個列舉類還具備查詢設(shè)備統(tǒng)計的能力(象UPOS V1.8規(guī)范定義的那樣)。
為了簡化提供給服務(wù)對象開發(fā)者和零售商的安全,添加的額外用戶類型包括所有者;集成者;管理者;以及出納員。缺省地,所有者是管理員組的成員,集成者和管理者是重要用戶,以及出納員是一個用戶。
在無需適當(dāng)角色特權(quán)的情況下,試圖訪問一個控制,會發(fā)出一個“不允許訪問”異常事件。一個標(biāo)準(zhǔn)錯誤消息被識別出來,說明已經(jīng)發(fā)生了該錯誤。如果應(yīng)用程序正在處理這個消息,應(yīng)該有一個選項(xiàng)不顯示該標(biāo)準(zhǔn)錯誤消息。如果使用的是基于角色的安全并且應(yīng)用程序不處理這個錯誤的話,該標(biāo)準(zhǔn)消息就不應(yīng)該受到阻止。
根據(jù)一個實(shí)施例,該CCL公開了一個由UPOS設(shè)備類成組起來的可訪問POS設(shè)備的列舉器。該庫作為一個用于舉例說明服務(wù)對象的例子的工廠。它將POS應(yīng)用程序復(fù)寫器從指定服務(wù)對象的實(shí)現(xiàn)方式中分離出來,并且是一個與POS設(shè)備交互的應(yīng)用程序的一個單獨(dú)入口終端。
根據(jù)一個實(shí)施例,通過標(biāo)準(zhǔn)NET方式來報告錯誤(通過異常事件的方式)。庫異常事件具有邏輯繼承層次。在可能的地方使用標(biāo)準(zhǔn)OPOS錯誤代碼并使它有效。
圖5示出的是根據(jù)本發(fā)明諸多方面的一個帶有PnP零售設(shè)備的集成遺產(chǎn)設(shè)備的結(jié)構(gòu)圖。
CCL510對帶有受管理的代理類的基于COM的SO進(jìn)行包裝。該代理通過反射530來示例SO的控制對象,并轉(zhuǎn)接調(diào)用它的應(yīng)用程序。該代理并不直接與實(shí)際的SO(570)進(jìn)行對話。而是它與它的CO(560)進(jìn)行通訊。
該LegacyProxy類是用于所有遺產(chǎn)代理的全局基礎(chǔ)類。該LegacyProxy類實(shí)現(xiàn)用于24個當(dāng)前支持的OPOS設(shè)備類的接口(ICashDrawer,IMSR,IPOSPrinter等等)以至于它的示例能夠發(fā)送給任何一個接口?;镜?,LegacyProxy是所有OPOS控制的父集。LegacyProxy通過標(biāo)準(zhǔn)NET-COM互用層與CO對話,并使用IDispatch進(jìn)行實(shí)際通訊,其中,該互用層考慮了所有垂直規(guī)則。因?yàn)镮Dispatch通過名稱來調(diào)用屬性和方法,只要下面的CO執(zhí)行它們,該LegacyProxy類就能夠公開這些屬性和方法。
根據(jù)一個實(shí)施例,通過來自Syetem.Runtime.InteropService名空間的UCOMIConnectionPointContainer和UCOMIConnectionPoint接口,將來自遺產(chǎn)控制的事件掛起。如果事件接收器類(LegacyProxy)執(zhí)行了遺產(chǎn)控制的指定事件接收器接口,通過UCOMIConnectionPoint就能夠?qū)κ录浔M(jìn)行設(shè)置。盡管僅有5個標(biāo)準(zhǔn)OPOS事件,但對于所有控制對象(它們帶有不同的接口向?qū)?來說,這些事件接收器接口全都是不同的。取代為遺產(chǎn)控制對象的每一個例子來示例LegacyProxy類,從LegacyProxy類中衍生出一個動態(tài)存儲器內(nèi)類,它另外實(shí)現(xiàn)該事件接收器接口,且該接口產(chǎn)生想要的CO。該接口的GUID是從遺產(chǎn)CO例子(通過UCOMIConnectionPoint)的事件連接點(diǎn)取出來的。產(chǎn)生的類將對事件句柄延的調(diào)用轉(zhuǎn)接到LegacyProxy類,該LegacyProxy類對它們進(jìn)行翻譯并將它們發(fā)送到應(yīng)用程序。
1.應(yīng)用程序?yàn)橐粋€遺產(chǎn)OPOS控制調(diào)用Root.OpenControl。
2.Root.OpenControl調(diào)用AssemblyFinder.OpenControl。
3.AssemblyFinder.OpenControl了解該請求是用于一個遺產(chǎn)控制,并調(diào)用AssemblyFinder.GenerateLegacyProxy。
4.AssemblyFinder.GenerateLegacyProxy說明該COM類,并然后使用UCOMIConnectionPointContainer和UCOMIConnectionPoint來獲取該連接點(diǎn)(事件接收器)接口的向?qū)А?br> 5.AssemblyFinder.GenerateLegacyProxy調(diào)用AssemblyFinder.EmitProxy來產(chǎn)生一個存儲器內(nèi)代理類,其中該存儲器內(nèi)代理類實(shí)現(xiàn)一個帶有該事件接收器向?qū)У慕涌凇?br> 6.應(yīng)用程序通過調(diào)用其上的打開(Open),來打開該代理。
7.在打開(Open)方法中,在其它的事情當(dāng)中,LegacuProxy(所產(chǎn)生的代理的父類)調(diào)用UCOMIConnectionPoint.Advise以便將該例子設(shè)為事件句柄。
支持POS應(yīng)用程序OPOS.NET API該CCL由3個核心匯編組成(1)POS.Interface.dll,它定義接口,列舉和常數(shù),通過SO和應(yīng)用程序兩者進(jìn)行引用;(2)POS.dll,它包括POS.Root類,該類使應(yīng)用程序(ISV)為已經(jīng)安裝的POS設(shè)備列舉并示例服務(wù)對象;以及(3)GenericServiceObject.dll,它是一個用于服務(wù)對象的基礎(chǔ)類。這將促使服務(wù)對象(IHV)的復(fù)寫器從它之中衍生出來,并且杠桿調(diào)節(jié)它的諸如事件序列,全局聲明等等的基礎(chǔ)SO功能的缺省實(shí)現(xiàn)方式。
因?yàn)闀腜OS機(jī)硬盤驅(qū)動器上的多個位置引用這3個匯編,那么就安裝用于全局江匯編高速緩存的匯編。這將有助于保證通過該機(jī)器只使用該二進(jìn)制文件的一個拷貝,并且該二進(jìn)制文件能夠在一個中心位置起作用。
服務(wù)對象接口出于創(chuàng)建受管理的服務(wù)對象的目的,已經(jīng)定義了幾個接口。這些接口封裝了POS1.8規(guī)范,并且被分成兩個種類(1)設(shè)備類獨(dú)立接口,它們模仿一般的POS功能以及(2)設(shè)備相關(guān)接口,它們模仿指定到一個給定設(shè)備類的功能。
公共公開的POS接口(一般的和設(shè)備相關(guān)接口)被定義成一個分別匯編的POS.Interface.dll。這些接口由.NET服務(wù)對象來執(zhí)行。應(yīng)用程序?qū)腃CL接到的SO例子發(fā)送到這些接口,以便能夠?qū)μ厥庠O(shè)備類的指定功能進(jìn)行訪問?;A(chǔ)控制接口被定義成POS.Interface.Basic名空間,并具備下面的層次。IPOSControl是用于.NET服務(wù)對象的基礎(chǔ)接口。SO將直接地或間接地實(shí)現(xiàn)它。該庫使用指向這個接口的指針,使得SO和應(yīng)用程序?qū)⑺l(fā)送到更多的指定設(shè)備的相關(guān)接口,象IMSR,IPOSPrinter等等。通過給用于事件驅(qū)動輸入設(shè)備的SO添加3個屬性,IPOSEventInput對IPOSControl進(jìn)行擴(kuò)展。通過給用于支持異步輸出的設(shè)備(如打印機(jī))的SO添加OurputID屬性,IPOSAsyncOutput對IPOSControl進(jìn)行擴(kuò)展。
用于標(biāo)準(zhǔn)OPOS設(shè)備類的設(shè)備相關(guān)接口被定義成POS.Interfaces.Specific名空間。它們從上述基礎(chǔ)接口中的一個接口衍生出來,并且根據(jù)為特殊設(shè)備類指定的功能對它們進(jìn)行擴(kuò)展。當(dāng)執(zhí)行它們的SO時,IHV的SO應(yīng)該從這些接口中衍生出來。示意性的接口如下用于現(xiàn)金抽屜的ICashDrawer,用于磁條讀取器的IMSR;用于票據(jù)打印機(jī)的IPOSPrinter等等。
這些接口近似地與各自的OPOS接口相匹配。與此同時,在一些由于COM限制導(dǎo)致的從UPOS衍生OPOS的情況中,用到了原始UPOS接口。例如,OPOS使用BSTR字符串來接收和發(fā)送二進(jìn)制數(shù)據(jù),這將引起某些由二進(jìn)制向ASNI轉(zhuǎn)換的沖突。在該CCL中,字節(jié)陣列用于二進(jìn)制數(shù)據(jù)。
作為一個例子,下面的是,用于MSR(磁條讀取器)的OPOS和庫接口看起來是什么樣子的。
<pre listing-type="program-listing"><![CDATA[ OPOS   interface IOPOSMSRIDispatch   { [hidden]HRESULT SOData([in]long Status); [hidden]HRESULT SODirectIO([in]long EventNumber,[in,out]long*pData,[in,out]BSTR*pString);   [hidden]HRESULT SOError([in]long ResultCode,[in]longResultCodeExtended,[in]long ErrorLocus,[in,out]long*pErrorResponse);   [hidden]HRESULT SOOutputCompleteDummy([in]long OutputID);   [hidden]HRESULT SOStatusUpdate([in]long Data);   [hidden]HRESULT SOProcessID([out,retval]long*pProcessID);   [propget]HRESULT OpenResult([out,retval]long*pOpenResult);[propget]HRESULT CheckHealthText([out,retval]BSTR*pCheckHealthText);   [propget]HRESULT Claimed([out,retval]VARIANT_BOOL*pClaimed);   [propget]HRESULT DataEventEnabled([out,retval]VARIANT_BOOL*pDataEventEnabled);   [propput]HRESULT DataEventEnabled([in]VARIANT_BOOLDataEventEnabled);   [propget]HRESULT DeviceEnabled([out,retval]VARIANT_BOOL*pDeviceEnabled);   [propput]HRESULT DeviceEnabled([in]VARIANT_BOOLDeviceEnabled);   [propget]HRESULT FreezeEvents([out,retval]VARIANT_BOOL*pFreezeEvents); [proPPut]HRESULT FreezeEvents([in]VARIANT_BOOLFreezeEvents);   [propget]HRESULT ResultCode([out,retval]long*pResultCode);   [propget]HRESULT ResultCodeExtended([out,retval]long*pResultCodeExtended);   [propget]HRESULT State([out,retval]long*pState);   [propget]HRESULT ControlObjectDescription([out,retval]BSTR*pControlObjectDescription);   [propget]HRESULT ControlObjectVersion([out,retval]long*pControlObjectVersion);   [propget]HRESULT ServiceObjectDescription([out,retval]BSTR*pServiceObjectDescription);   [propget]HRESULT ServiceObjectVersion([out,retval]long*pServiceObjectVersion);   [propget]HRESULT DeviceDescription([out,retval]BSTR*pDeviceDescription);[propget]HRESULT DeviceName([out,retval]BSTR*pDeviceName);   HRESULT CheckHealth([in]long Level,[out,retval]long*pRC);   HRESULT ClaimDevice([in]long Timeout,[out,retval]long*pRC);   HRESULT ClearInput([out,retval]long*pRC);   HRESULT Close([out,retval]long*pRC);   HRESULT DirectIO([in]long Command,[in,out]long*pData,[in,out]BSTR*pString,[out,retval]long*pRC);   HRESULT Open([in]BSTR DeviceName,[out,retval]long*pRC);   HRESULT ReleaseDevice([out,retval]long*pRC);   [propget]HRESULT AccountNumber([out,retval]BSTR*pAccountNumber);   [propget]HRESULT CapISO([out,retval]VARIANT_BOOL*pCapISO);   [propget]HRESULT CapJISOne([out,retval]VARIANT_BOOL*pCapJISOne);   [propget]HRESULT CapJISTwo([out,retval]VARIANT_BOOL*pCapJISTwo);   [propget]HRESULT DecodeData([out,retval]VARIANT_BOOL*pDecodeData);   [propput]HRESULT DecodeData([in]VARIANT_BOOLDecodeData);   [propget]HRESULT ExpirationDate([out,retval]BSTR*pExpirationDate);   [propget]HRESULT FirstName([out,retval]BSTR*pFirstName);   [propget]HRESULT MiddleInitial([out,retval]BSTR*pMiddlelnitial);   [propget]HRESULT ParseDecodeData([out,retval]VARIANT BOOL*pParseDecodeData);[propput]HRESULT ParseDecodeData([in]VARIANT_BOOLParseDecodeData);   [propget]HRESULT ParseDecodedData([out,retval]VARIANT_BOOL*pParseDecodedData);   [propput]HRESULT ParseDecodedData([in]VARIANT_BOOLParseDecodedData);   [propget]HRESULT ServiceCode([out,retval]BSTR*pServiceCode); [propget]HRESULT Suffix([out,retval]BSTR*pSuffix); [propget]HRESULT Surname([out,retval]BSTR*pSurname); [propget]HRESULT Title([out,retval]BSTR*pTitle);   [propget]HRESULT Track1Data([out,retval]BSTR*pTrack1Data);   [propget]HRESULT Track1DiscretionaryData([out,retval]BSTR*pTrack1DiscretionaryData);   [propget]HRESULT Track2Data([out,retval]BSTR*pTrack2Data);   [propget]HRESULT Track2DiscretionaryData([out,retval]BSTR*pTrack2DiscretionaryData);   [propget]HRESULT Track3Data([out,retval]BSTR*pTrack3Data);   [propget]HRESULT TracksToRead([out,retval]long*pTracksToRead);   [propput]HRESULT TracksToRead([in]long TracksToRead);   [propget]HRESULT AutoDisable([out,retval]VARIANT_BOOL*pAutoDisable);   [propput]HRESULT AutoDisable([in]VARIANT_BOOLAutoDisable);   [propget]HRESULT BinaryConversion([out,retval]long*pBinaryConversion);   [propput]HRESULT BinaryConversion([in]long BinaryConversion);   [propget]HRESULT DataCount([out,retval]long*pDataCount);[propget]HRESULT ErrorReportingType([out,retval]long*pErrorReportingTyPe);  [propput]HRESULT ErrorReportingType([in]longErrorReportingType);  [propget]HRESULT CapPowerReporting([out,retval]long*pCapPowerReporting);  [propget]HRESULT PowerNotify([out,retval]long*pPowerNotify);  [propput]HRESULT PowerNotify([in]long PowerNotify);  [propget]HRESULT PowerSrate([out,retval]long*pPowerState);  [propget]HRESULT CapTransmitSentinels([out,retval]VARIANT_BOOL*pCapTransmitSentinels);  [propget]HRESULT Track4Data([out,retval]BSTR*pTrack4Data);  [propget]HRESULT TransmitSentinels([out,retval]VARIANT_BOOL*pTransmitSentinels);  [propput]HRESULT TransmitSentinels([in]VARIANT_BOOLTransmitSentinels);   }   Library   public interface IPOSControl   {   PowerReporting CapPowerReporting {get;}   bool CapStaticticsReporting{get;}   bool CapUpdateStatictics {get;}   bool Claimed {get;}   string ControlObjectDescription {get;}   intControlObjectVersion {get;}   string DeviceDescription {get;}   bool DeviceEnabled {get;set;}string DeviceName {get;}   bool FreezeEvents {get;set;}   bool PowerNotificationEnabled {get;set;}   PowerState PowerState {get;}   string ServiceObjectDescription {get;}   int ServiceObjectVersion {get;}    ControlState State{get;}   string DevicePath {get;set;}   string CheckHealth(HealthCheckLevellevel);   void ClaimDevice(int timeout);   void ClearInput();   void ClearOutput();   void Close();   void Open();   void DirectIO(int command,ref int pData,ref objecpObject);   void ReleaseDevice();   void ResetStatistics(string parameters);   string RetrieveStatistics(string parameters);   void UpdateStatistics(string parameters);   eventDataEventEventHandlerOnDataEvent;   eventDirectIOEventEventHandlerOnDirectIOEvent;   eventErrorEventEventHandler OnErrorEvent;   eventOutputCompleteEventEventHandlerOnOutputCompleteEvent;   eventStatusUpdateEventEventHandlerOnStatusUpdateEvent;   }public interface IPOSEventInputIPOSControl  {   boolAutoDisable {get;set;}   int DataCount {get;}   boolDataEventEnabled {get;set;}  }  public interface IMSRBase.IPOSEventInput  {   bool CapISO {get;}   bool CapJISOne {get;}   bool CapJISTwo {get;}   bool CapTransmitSentinels {get;}   string AccountNumber {get;}   bool DecodeData {get;set;}   MSRErrorReportingTyPes ErrorReportingType {get;}   string ExpirationDate {get;}   string FirstName {get;}   string MiddleInitial {get;}   bool ParseDecodeData{get;set;}   string ServiceCode{get;}   string Suffix {get;}   string Surname{get;}   string Title {get;}   Byte[] Track1Data {get;}   Byte[] Track1DiscretionaryData{get;}   Byte[] Track2Data {get;}   Byte[] Track2DiscretionaryDara{get;}   Byte[] Track3Data {get;}Byte[] Track4Data{get;}   int TracksToRead {get;set;}   boolTransmitSentinels {get;set;}  }]]></pre>這些接口將IPOSControl當(dāng)作它的父親/祖父,因此任何SO能夠被發(fā)送到IPOSControl接口。該庫類操作IPOSControl接口并且應(yīng)用程序?qū)O的例子發(fā)送給設(shè)備指定接口。那樣的話,允許在不改變庫的情況下引入新的設(shè)備類。只要新設(shè)備類接口是從IPOSControl衍生出來的,該庫就能夠?yàn)樾略O(shè)備類處理SO例子。
圖6示出的是根據(jù)本發(fā)明諸多方面的示意性的幫助類和SO資料庫。
硬件售貨機(jī)典型地實(shí)現(xiàn)一個設(shè)備相關(guān)服務(wù)對象(SO),該服務(wù)對象按照POS規(guī)范中說明的那樣實(shí)現(xiàn)一個接口并直接與它們的硬件對話。該CCO.NET 庫包括幾種技術(shù),這些技術(shù)減輕了產(chǎn)生SO的高質(zhì)量實(shí)現(xiàn)的負(fù)擔(dān),它們包括支持在受管理代碼中的編寫服務(wù)對象;一個對于大多數(shù)服務(wù)對象來說都很普通的POS特性通用實(shí)現(xiàn)。這個包括用于設(shè)備聲明/啟動,引發(fā)事件,消息排隊(duì),統(tǒng)計等等的基礎(chǔ)結(jié)構(gòu)。IHV可杠桿平衡這個目標(biāo),以便減輕實(shí)現(xiàn)SO的POS指定方面的大部分負(fù)擔(dān),而使它們能夠?qū)W⒂谠O(shè)備指定細(xì)節(jié)上;以及一系列用于性能計數(shù)器、設(shè)備統(tǒng)計的幫助類。
根據(jù)一個實(shí)施例,服務(wù)對象按照.NET匯編進(jìn)行編寫。這些泯編是從IPOSControl接口中衍生出來的,或是從IPOSControl衍生出來的經(jīng)過定義的設(shè)備指定接口中的一個中衍生出來的。這些匯編包括匯編級或類級屬性,它們對支持設(shè)備的設(shè)備類,POS版本以及硬件Id進(jìn)行說明。該CCO.NET庫使用這些屬性來判斷SO要實(shí)現(xiàn)哪個設(shè)備類,以及它控制什么硬件。通過使用匯編屬性,極大的簡化了SO的安裝,因?yàn)樗枰龅木褪前言搮R編拷貝到一個目錄中,在這個目錄中該CCO.NET能夠找到它。
該通用服務(wù)對象類是一個抽象基礎(chǔ)類,它實(shí)現(xiàn)所有設(shè)備類的服務(wù)對象所需的缺省功能。典型的將要用于IHV的方案從通用服務(wù)對象和設(shè)備指定接口當(dāng)中的一個接口中衍生出來。通過這么做,IHV能夠依賴通用服務(wù)對象來處理很多POS 指定細(xì)節(jié),并且能夠?qū)⑺鼈兊木械絊O的設(shè)備指定方面。
該通用服務(wù)對象類包括一個缺省執(zhí)行,它用于所有IPOSControl接口上的方法和屬性。這包括一種機(jī)制,用于事件排隊(duì)和發(fā)送,設(shè)備狀態(tài)管理(聲明,啟動等等)以及狀態(tài)報告。因?yàn)檫@是一個抽象類,它不能被直接示例,并且試圖單獨(dú)地用于IHV,以便從中衍生出來它們的SO。所有的方法和屬性標(biāo)注為虛擬的,所以IHV能夠使用該缺省實(shí)現(xiàn),并且不理會它們看著合適的任何方法。
該通用服務(wù)對象實(shí)現(xiàn)POS事件的細(xì)節(jié),POS事件以事件隊(duì)列、事件隊(duì)列工人線程以及各種同步對象的形式進(jìn)行發(fā)送。在一個高層次上,引發(fā)事件由通用服務(wù)對象按照下面的方式進(jìn)行處理1)等待,直到該線程接收到信號并且該FreezeEvents屬性是false。
2)查看該線程是否結(jié)束,如果結(jié)束了,清除該事件隊(duì)列并結(jié)束該線程。
3)將下一個事件從該事隊(duì)列中去除。
4)調(diào)用PreFireEvent(EventArgs posEvent)。
5)如果步驟4中,PreFireEvent()返回的是true的話,將該事件發(fā)送給應(yīng)用程序。
6)返回到步驟1。
提供兩個幫助方法來驅(qū)動引發(fā)事件QueueEvent(EventArgs posEvent)和PreFireEvent(EventArgs posEvent)。
QueueEvent(EventArgs posEvent)用來將一個事件添加到事件隊(duì)列,以及發(fā)送信號通知該事件線程新事件已經(jīng)到達(dá)。PreFireEvent(EventArgs posEvent)是在發(fā)送一個事件之前立即由該通用SO調(diào)用的。這使得優(yōu)先于發(fā)送特殊事件,給該SO提供了一個更新內(nèi)部狀態(tài)的機(jī)會。
當(dāng)調(diào)用該Open()方法時,創(chuàng)建該事件隊(duì)列數(shù)據(jù)結(jié)構(gòu)并對其初始化。該Close()方法釋放該設(shè)備,結(jié)束了該事件線程并清除了內(nèi)部對象。提供一系列幫助類,來幫助IHV以一種簡單并相容的方式實(shí)現(xiàn)性能計數(shù)器和設(shè)備統(tǒng)計。
設(shè)備統(tǒng)計可以分成兩個種類(1)設(shè)備信息統(tǒng)計和(2)設(shè)備統(tǒng)計。設(shè)備信息統(tǒng)計是設(shè)備的屬性,如名稱、制造商、版本等等。設(shè)備統(tǒng)計典型地反映了設(shè)備使用信息,如已經(jīng)供電了多少個小時等等。UPOS 1.8定義了一系列統(tǒng)計,其中有所有設(shè)備都應(yīng)支持的統(tǒng)計,以及用于每個設(shè)備類的統(tǒng)計。UPOS還指定了設(shè)備能夠支持制造商指定設(shè)備的統(tǒng)計。
該DeviceStatistics幫助類減輕了實(shí)現(xiàn)UPOS規(guī)范1.8版本中定義的設(shè)備統(tǒng)計的負(fù)擔(dān)。它包括在該GenericSO實(shí)現(xiàn)中,因此從GenericSO中衍生出來的SO僅需要編寫很小量的代碼來支持統(tǒng)計。典型地,用戶需要編寫代碼僅是調(diào)用IncrementStatistic(字符串名)方法,來在適當(dāng)?shù)臅r候增加給定統(tǒng)計的值。該GenericSO將考慮剩下的細(xì)節(jié)。
該DeviceStatistics類支持存儲在硬件或軟中的統(tǒng)計?;谲浖慕y(tǒng)計以應(yīng)用程序可定義的間隔自動持續(xù)發(fā)送到XML文件,并且當(dāng)設(shè)備被聲明時,自動地從這個文件中載入。DeviceStatistics實(shí)現(xiàn)3個方法(resetStatistics,retrieveStatistics和updateStatistics)以及兩個屬性(CapStatisticsReporting和CapUpdateStatistics)中的每一個。它還包括用于創(chuàng)建統(tǒng)計、增加統(tǒng)計以及將統(tǒng)計載入/保存到磁盤中的公共幫助方法。為了支持存儲在設(shè)備本身當(dāng)中的統(tǒng)計,由SO指定一個回調(diào)函數(shù),返回統(tǒng)計的值。該DeviceStatistics類將在每次用戶應(yīng)用程序請求那個統(tǒng)計時,調(diào)用這個函數(shù)。
如果需要的話,IHV連同設(shè)備驅(qū)動程序,將用于安裝它們的服務(wù)對象的INF文件一起提供出來。經(jīng)過選擇的一系列INF文件被預(yù)選安裝,以至于當(dāng)有新設(shè)備接入時,操作系統(tǒng)能夠安裝它們。
安裝服務(wù)對象根據(jù)一個實(shí)施例,通過將它們的匯編拷貝到由HKLM\SOFTWARE\OLEforRetail.NET\ControlAssemblies注冊鍵指定的文件夾中,來安裝.NET服務(wù)對象。由于.NET SO在它們的匯編元數(shù)據(jù)中帶有將它們映射到物理設(shè)備所需的信息,因此在簡化情況下,不需要其它的信息。通過XML設(shè)置文件來提供所有額外的設(shè)置。這些額外的設(shè)置的例子包括如下項(xiàng)目,例如要映射到一個已存在的服務(wù)對象的額外的硬件id;當(dāng)連接多于一個的類的設(shè)備時,用于這些情況的缺省服務(wù)對象;以及用于非即插即用設(shè)備的設(shè)置,如串行口。
如上所述,全局設(shè)置保存在一個XML配置文件中。每個SO設(shè)置存在于置于一個預(yù)定件夾中的單獨(dú)的XML文件中。當(dāng)列舉已經(jīng)安裝的服務(wù)對象時,該庫讀取主配置文件和來自該文件夾的配置文件。
IHV帶有用于它們的設(shè)備的inf文件,其中既要安裝它們的驅(qū)動器,還要將SO匯編和可選擇的XML配置文件拷貝到各自的文件夾中。ISV和管理員能夠通過編輯XML配置文件來自定義該設(shè)置。
通過給基礎(chǔ)類提供了一般功能的缺省實(shí)現(xiàn),該CCL簡化了對基于.NET的服務(wù)對象的編寫。促使IHV從基礎(chǔ)類中衍生出來,在需要的地方不理會所提供的實(shí)現(xiàn),以及添加設(shè)備指定的特性。新的.NET服務(wù)對象是.NET類,這些類實(shí)現(xiàn)由該庫定義的設(shè)備類接口。
該CCL提供一個通用服務(wù)對象類,它可以用作一個用于它的服務(wù)對象的基礎(chǔ)類。該類實(shí)現(xiàn)盡可能多的設(shè)備獨(dú)立功能,來簡化SO的編寫。
該CCL為函數(shù)提供了一系列邦助類,這些函數(shù)可能是多個售貨機(jī)所需要的。旨在簡化編寫一個.NET SO。
根據(jù)一個實(shí)施例,該庫支持.NET服務(wù)對象的拖放類型安裝。SO匯編包括足夠的元數(shù)據(jù)信息,以至于該CCL能夠在無需額外配置的情況下使用它。可以定義一個額外的XML配置文件,來擴(kuò)展匯編元數(shù)據(jù)。
圖7示出的是根據(jù)本發(fā)明諸多方面的集成的示意性顯示,用于提供關(guān)于接入到系統(tǒng)中的POS設(shè)備的信息。
每個設(shè)備都能夠被啟動或被無效??梢允褂孟吕斜?20,或一個應(yīng)用程序可以調(diào)用該CCL來無效/啟動該設(shè)備。一個被無效的設(shè)備不能由該CCL訪問。在試圖訪問該設(shè)備之前,該應(yīng)用程序應(yīng)當(dāng)啟動該設(shè)備。
每個SO提供者為它們各自的設(shè)備提供這種類型的管理信息。
一個一般的標(biāo)志和驅(qū)動器標(biāo)志顯示了下列用于設(shè)備的信息名稱和說明;硬件id和路徑(用于即插即用設(shè)備);NET或遣產(chǎn)服務(wù)對象;匯編路徑,全名,版本,類名(用于NET對象);以及ProgId,ClsId,二進(jìn)制路徑,版本,來自注冊表的配置參數(shù)。
還為該設(shè)備顯示一個設(shè)備狀態(tài)(710)。
圖8示出的是根據(jù)本發(fā)明諸多方面的已安裝的POS設(shè)備的示意性屏幕快照。如圖所示,銷售設(shè)備的安裝點(diǎn)顯示在窗格810中。
窗格810顯示的是安裝的設(shè)備和配置的多個視圖,包括如下的項(xiàng)目,例如設(shè)備類以及當(dāng)前連接到機(jī)器的設(shè)備;設(shè)備類以及過去曾經(jīng)連接到機(jī)器上的設(shè)備;安裝的.NET服務(wù)對象匯編,類,以及它們控制的物理設(shè)備;安裝的遺產(chǎn)服務(wù)對象以及它們控制的物理設(shè)備;以及全局庫配置。這個接口旨在幫助管理員深入到與一個設(shè)備有關(guān)的底層細(xì)節(jié),如什么樣的二進(jìn)制實(shí)現(xiàn)什么樣的服務(wù)對象,它們安裝到哪,什么版本等等。
另一個面板(820)管理一系列用于選取樹視圖節(jié)點(diǎn)(s)的與上下文有關(guān)的控制。它顯示了選取節(jié)點(diǎn)上的詳細(xì)信息并提供有用的操作。例如,對打印機(jī)來說,可控制調(diào)用方法打開,聲明,啟動,打印正常,剪斷票據(jù)等等。還可控制來自設(shè)備的事件的可視化。這個標(biāo)志能夠讓管理員迅速的測試接入的硬件,而無需運(yùn)行一個真正的POS應(yīng)用程序。
安全設(shè)置也可以進(jìn)行選擇。例如,全局安全設(shè)置可以公開,允許設(shè)備被鎖定,以至于系統(tǒng)僅允許一定的服務(wù)對象和/或硬件能夠被應(yīng)用程序所利用。統(tǒng)計還可以提供快速地讀取/重置對設(shè)備統(tǒng)計的訪問。
以上的說明,示例以及數(shù)據(jù)提供了一個對本發(fā)明的構(gòu)成進(jìn)行制造和使用的完整描述。由于在不背離本發(fā)明實(shí)質(zhì)和范圍的情況下,可以作出很多本發(fā)明的實(shí)施例,因此,本發(fā)明包括在下文附上的權(quán)利要求中。
權(quán)利要求
1.一種為操作系統(tǒng)不支持的設(shè)備提供即插即用(PnP)功能的方法,包括判斷與設(shè)備相關(guān)聯(lián)的事件;確定設(shè)備的ID;將設(shè)備映射到服務(wù)對象,這里當(dāng)設(shè)備不受與設(shè)備關(guān)聯(lián)的操作系統(tǒng)支持時,該服務(wù)對象是在用戶模式代碼中實(shí)現(xiàn)的;以及向應(yīng)用程序公開通用接口以至于該應(yīng)用程序可以通過該通用接口對設(shè)備進(jìn)行訪問。
2.如權(quán)利要求1所述的方法,其中,該事件是即插即用(PnP)事件。
3.如權(quán)利要求1所述的方法,其中,設(shè)備是零售設(shè)備。
4.如權(quán)利要求3所述的方法,其中,該零售設(shè)備至少從下面之一進(jìn)行選擇碰撞條;現(xiàn)金兌換機(jī);現(xiàn)金出票機(jī);信用卡認(rèn)證終端;投幣自動售貨機(jī);財務(wù)打印機(jī);硬件核對機(jī);鍵鎖;條形碼掃描器;音調(diào)指示器;動作檢測器;線路顯示器;磁性墨水字符識別讀取器;磁條讀取器;個人身份號碼簿;點(diǎn)卡;POS鍵盤;POS打印機(jī);遠(yuǎn)程訂單顯示器;稅率表;簽名識別器;以及支票圖像掃描儀。
5.如權(quán)利要求1所述的方法,進(jìn)一步包括當(dāng)事件指示該設(shè)備已經(jīng)安裝時配置設(shè)備。
6.如權(quán)利要求1所述的方法,其中,公開通用接口進(jìn)一步包括給應(yīng)用程序提供與該設(shè)備相關(guān)聯(lián)的屬性,方法和事件。
7.如權(quán)利要求1所述的方法,其中,將該設(shè)備映射到該服務(wù)對象,這里當(dāng)設(shè)備不受與設(shè)備關(guān)聯(lián)的操作系統(tǒng)支持時,該服務(wù)對象是在用戶模式代碼中實(shí)現(xiàn)的,進(jìn)一步包括判斷什么時候該設(shè)備是遺產(chǎn)設(shè)備,什么時候是PnP設(shè)備。
8.一種為操作系統(tǒng)不支持的設(shè)備提供即插即用(PnP)功能的系統(tǒng),包括操作系統(tǒng),包括一個在該操作系統(tǒng)的核心模式下操作的事件管理器,配置成檢測與不受操作系統(tǒng)支持的設(shè)備相關(guān)聯(lián)的事件;以及將該事件提供給駐留在用戶模式中的設(shè)備管理器應(yīng)用程序;該設(shè)備管理器應(yīng)用程序配置成,判斷什么時候該設(shè)備是遺產(chǎn)設(shè)備,什么時候是PnP設(shè)備,以及包括一個公共控制庫(CCL),其配置成提供與設(shè)備相關(guān)聯(lián)的屬性,方法和事件;以及一個應(yīng)用程序,配置成通過該CCL與設(shè)備管理器應(yīng)用程序進(jìn)行交互,并接收與該設(shè)備相關(guān)聯(lián)的屬性,方法和事件。
9.如權(quán)利要求8所述的系統(tǒng),其中,該操作系統(tǒng)進(jìn)一步配置成給設(shè)備管理器應(yīng)用程序提供設(shè)備ID;并且其中該設(shè)備管理器應(yīng)用程序進(jìn)一步配置成接收該設(shè)備ID并響應(yīng)該ID安裝該設(shè)備并將該設(shè)備映射到一個服務(wù)對象,其中該服務(wù)對象在用戶模式下實(shí)現(xiàn)。
10.如權(quán)利要求9所述的系統(tǒng),其中,該設(shè)備是至少從下面之一進(jìn)行選擇的一種零售設(shè)備碰撞條;現(xiàn)金兌換機(jī);現(xiàn)金出票機(jī);信用卡認(rèn)證終端;投幣自動售貨機(jī);財務(wù)打印機(jī);硬件核對機(jī);鍵鎖;條形碼掃描器;音調(diào)指示器;動作檢測器;線路顯示器;磁性墨水字符識別讀取器;磁條讀取器;個人身份號碼簿;點(diǎn)卡;POS鍵盤;POS打印機(jī);遠(yuǎn)程訂單顯示器;稅率表;簽名識別器;以及支票圖像掃描儀。
11.如權(quán)利要求8所述的系統(tǒng),其中該設(shè)備管理器應(yīng)用程序進(jìn)一步包括一個遺產(chǎn)互用層,該層被配置為啟動遺產(chǎn)設(shè)備,以便使其可通過CCL而由該應(yīng)用程序使用。
12.如權(quán)利要求8所述的系統(tǒng),其中,該設(shè)備管理器應(yīng)用程序進(jìn)一步被配置成向該操作系統(tǒng)注冊,來接收與不受操作系統(tǒng)支持的設(shè)備相關(guān)聯(lián)的事件。
13.一種計算機(jī)可讀介質(zhì),帶有為不受操作系統(tǒng)支持的設(shè)備提供即插即用(PnP)功能的計算機(jī)可執(zhí)行指令,包括駐留在操作系統(tǒng)的核心模式中的一個第一組件,配置成提供與一個設(shè)備相關(guān)聯(lián)的事件;駐留在該操作系統(tǒng)的用戶模式中的一個第二組件,配置成接收由該第一組件提供的事件,并且向一個應(yīng)用程序公開一個通用接口,以至于該應(yīng)用程序可以訪問該設(shè)備并且可以通過該通用接口來接收該事件。
14.如權(quán)利要求13的計算機(jī)可讀介質(zhì),其中,該事件與一個即插即用(PnP)事件有關(guān)。
15.如權(quán)利要求14的計算機(jī)可讀介質(zhì),其中,該通用接口進(jìn)一步配置成為該應(yīng)用程序提供一個統(tǒng)一路徑,以便與一個PnP設(shè)備和一個遺產(chǎn)設(shè)備進(jìn)行交互。
16.如權(quán)利要求14的計算機(jī)可讀介質(zhì),其中,該設(shè)備是至少從下面之一進(jìn)行選擇的一種零售設(shè)備碰撞條;現(xiàn)金兌換機(jī);現(xiàn)金出票機(jī);信用卡認(rèn)證終端;投幣自動售貨機(jī);財務(wù)打印機(jī);硬件核對機(jī);鍵鎖;條形碼掃描器;音調(diào)指示器;動作檢測器;線路顯示器;磁性墨水字符識別讀取器;磁條讀取器;個人身份號碼簿;點(diǎn)卡;POS鍵盤;POS打印機(jī);遠(yuǎn)程訂單顯示器;稅率表;簽名識別器;以及支票圖像掃描儀。
17.如權(quán)利要求13的計算機(jī)可讀介質(zhì),其中,該第二個組件進(jìn)一步配置成,當(dāng)該事件指示該設(shè)備已經(jīng)進(jìn)行安裝時,就安裝該設(shè)備。
18.如權(quán)利要求13的計算機(jī)可讀介質(zhì),其中,公開該通用接口進(jìn)一步包括為該應(yīng)用程序提供與該設(shè)備相關(guān)聯(lián)的屬性,方法以及事件。
19.如權(quán)利要求18的計算機(jī)可讀介質(zhì),其中,該第二組件進(jìn)一步配置成,將該設(shè)備映射到一個服務(wù)對象上,這里當(dāng)該設(shè)備不受操作系統(tǒng)支持時,該服務(wù)對象在用戶模式代碼中實(shí)現(xiàn)。
20.如權(quán)利要求18的計算機(jī)可讀介質(zhì),其中,該第一組件進(jìn)一步配置成向該第二組件提供一個設(shè)備ID;并且其中,該第二組件進(jìn)一步配置成,判斷已經(jīng)安裝的設(shè)備的類型并基于一個配置文件對該設(shè)備進(jìn)行配置。
全文摘要
本發(fā)明為不受操作系統(tǒng)支持的設(shè)備提供了即插即用(PnP)功能。響應(yīng)于不受支持的設(shè)備的安裝操作,操作系統(tǒng)將該事件發(fā)送給駐留在用戶模式代碼中的設(shè)備管理應(yīng)用程序。一旦接收到這個事件,該設(shè)備管理應(yīng)用程序自動安裝支持配置入口和軟件。當(dāng)設(shè)備安裝完畢后,在不需要任何程序設(shè)計變動的情況下,通過應(yīng)用程序就可以對該設(shè)備進(jìn)行訪問。事件是通過一個公共控制庫(CCL)公開給應(yīng)用程序的。該庫旨在為訪問該設(shè)備提供一個通用接口。通過使用CCL,注冊的應(yīng)用程序就可以接收與該設(shè)備相關(guān)聯(lián)的事件。
文檔編號G06F9/44GK1752953SQ200510092238
公開日2006年3月29日 申請日期2005年5月14日 優(yōu)先權(quán)日2004年9月22日
發(fā)明者C·A·杰森, H·胡斯曼, J·A·哈里森, S·貝科夫, S·M·拉布朗斯, T·E·貝爾文 申請人:微軟公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1