向應用程序通知狀態變化的靈活體系結構的制作方法

            文檔序號:6434993閱讀:198來源:國知局
            專利名稱:向應用程序通知狀態變化的靈活體系結構的制作方法
            相關申請本實用專利要求序號為60/513,723,在2003年10月23日提交的美國臨時專利申請符合35USC119(e)的優先權。
            背景技術
            當今,移動設備被設計成運行各種應用程序,并保持用戶能獲得最新的當前信息。這些設備的某些包括個人數字助理、無線電話和電子郵件設備。移動設備現在能通過各種裝置連接到因特網和其它網絡,并從而能通過網絡交換信息。這些移動設備能更新應用程序,并發送和接收信息,如電子郵件、電子郵件附件和網頁內容。提供所有這些功能需要移動設備上的應用程序收到各種事件的通知,如當新的電子郵件可用時、當設備的屏幕被激活時、當收到電話時等。然而,訪問與該設備關聯的所有不同狀態變化是困難的。

            發明內容
            簡言之,本發明是針對在各設備間統一狀態和通知的體系結構。
            按本發明的一方面,客戶機向通知代理程序(broker)注冊以接收對狀態屬性改變的通知。當注冊的狀態屬性改變時,通知代理程序確定向哪一客戶機通知狀態改變,并為客戶機提供關于該變化的通知。例如,客戶機能注冊以接收關于電池強度變化、網絡連接性、存儲器使用等的通知。每當這些注冊的態屬性之一改變時,通知代理程序向客戶機發通知消息。
            按本發明另一方面,每當狀態改變,當狀態改變滿足預定條件時,或根據一時間表來通知客戶機。按本發明的又一方面,響應于狀態改變或時間表能裝入應用程序。例如,客戶機能注冊,以當發生某個事件時,如移動設備接收到定向到要裝入的應用程序的消息時,啟動該應用程序。也能根據客戶機配置的時間表來啟動應用程序。
            按本發明的再一方面,提供一種應用編程接口(API),它針對提供一種在設備內不同組件之間訪問狀態變化信息的統一方法。例如,應用程序能使用同一函數調用來訪問由設備內的不同組件設置的狀態屬性。
            按本發明的還有一個方面,注冊狀態屬性能跨設備重起而保持不變。


            圖1示出一個示例性計算設備;圖2示出一個示例性移動設備;圖3示出一個示例性狀態管理和通知系統;圖4示出用于狀態變化通知系統的過程;以及圖5示出按本發明的各方面處理狀態變化信息的過程。
            具體實施例方式
            簡言之,本發明針對提供一種用于存儲設備、應用程序和服務狀態的統一機制的方法和系統,以及一種豐富的通知代理體系結構。一般而言,客戶機向通知代理程序注冊,以便在某些狀態屬性改變時接收通知。當注冊的狀態屬性改變時,通知代理程序判斷向哪一客戶機通知該狀態變化,并向該客戶機提供關于此變化的通知。每當狀態改變,當狀態變化滿足預定條件時,或根據一時間表來通知客戶機。也可響應于狀態變化或時間表來裝入應用程序。也提供了一種應用編程接口(API),它針對提供一種在設備內不同組件之間訪問狀態變化的統一方法。
            在整個說明書和權利要求書中,下列術語至少采取明確與此處相關的意義,除非上下文清楚地另外要求。下面標識的意義并不意味著局限這些術語,而僅提供這些術語的說明性示例。“一”,“一個”和“該”的意義包括多個引用,“在……中”的意義包括“在……內”和“在……上”。
            術語“狀態屬性”指的是向通知系統注冊并存儲的“狀態”變量,用于維護和改變通知。
            術語“通知請求”指的是來自要向其通知狀態變化的客戶機的請求。
            術語“通知列表”指的是已注冊狀態屬性變化通知的客戶機的集合。
            術語“通知代理程序”指的是負責從數據存儲中添加、更新和移除數據的底層驅動程序。
            術語“狀態改變組件”指的是添加,更新,或通常維護數據存儲中的狀態屬性的任何組件。
            術語“客戶機”指的是注冊狀態屬性改變通知的任何組件。客戶機可以是狀態改變組件,狀態改變組件也可以是客戶機。
            術語“狀態屬性標識符”指的是狀態屬性的“友好”串(名)的表示。此標識符能是分層的,并是唯一的。
            術語“條件通知”指的是當狀態屬性改變且狀態屬性的新值滿足通知請求中規定的條件時所發出的通知。
            說明性操作環境參考圖1,用于實現本發明的示例性系統包括諸如計算設備100的計算設備。計算設備100能被配置成客戶機或服務器。在很基本的配置中,計算設備100通常包括至少一個處理單元102和系統存儲器104。按照計算設備的確切配置和類型,系統存儲器104能是易失(如RAM)、非易失(如ROM,閃存等)或兩者的某種組合。系統存儲器104通常包括操作系統105、一個或多個程序模塊106,并能包括程序數據107。在圖1中,這些基本配置由在虛線108中的那些組件示出。
            計算設備100能具有附加特征或功能。例如,計算設備100還能包括另外的數據存儲設備(可移動和/或不可移動的),如磁盤、光盤或磁帶。在圖1中,這些另外的存儲用可移動存儲109和不可移動存儲110示出。計算機存儲介質能包括以用于存儲如計算機可讀指令、數據結構、程序模塊或其它數據等信息的任何方法或技術實現的易失和非易失、可移動和不可移動介質。系統存儲器104,可移動存儲109,和不可移動存儲110均是計算機存儲介質之例。計算機存儲介質包括但不限于,RAM、ROM、EEPROM、閃存或其它存儲器技術、CD-ROM、數字多功能盤(DVD)或其它光存儲、盒式磁帶、磁帶、磁盤存儲或其它磁存儲設備,或能用于存儲希望的信息并能由計算設備100訪問的其它介質。任何那樣的計算機存儲介質能是設備100的部分。計算設備100還能具有輸入設備112,如鍵盤、鼠標、輸入筆、語音輸入設備、觸摸輸入設備等。還能包括如顯示器、揚聲器、打印機等輸出設備。
            計算設備100還包含通信連接,它允許該設備如經過網絡與其它計算設備118通信。通信連接116是通信媒體的例子。通信媒體通常在如載波或其它傳輸機制的已調制數據信號包含計算機可讀指令、數據結構、程序模塊或其它數據,并包括任何信息傳送媒體。術語“已調制數據信號”意為以如在信號中編碼信息的方式設置或改變其一個或多個特征的信號。作為示例而非局限,通信媒體包括如有線網絡或直線連接的有線媒體,如聲音、RF、紅外和其它無線媒體的無線媒體。這里使用的術語計算機可讀媒質包括存儲介質和通信媒體。
            參考圖2,用于實現本發明的一個示例性系統包括如移動設備200的移動設備。移動設備200具有處理器260、存儲器262、顯示器228和小鍵盤232。存儲器262一般包括易失存儲器(如RAM)和非易失存儲器(如ROM、閃存等)。移動設備200包括操作系統264,如微軟公司的Windows CE操作系統或其它操作系統,它們駐留在存儲器262中,并在處理器260上執行。小鍵盤232可以是壓鍵數字撥號盤(象典型的電話)、多鍵鍵盤(如傳統的鍵盤)。顯示器228能是液晶顯示器,或在移動設備中常用的任何其它類型顯示器。顯示器228能是觸敏的,因而能用作輸入設備。
            一個或多個應用程序能加載到存儲器262中,并在操作系統264上運行。應用程序的示例包括電話撥號程序、電子郵件程序、時間表程序、PIM(個人信息管理)程序、文字處理程序、電子表格程序、因特網瀏覽器程序等。應用程序266能使用共用的API,以在與設備關聯的狀態屬性上執行動作。例如,電話撥號程序能向通知系統注冊,以接收關于對信號強度、電話狀態、電池強度的改變的通知。移動計算設備200在存儲器262中還包括非易失存儲268。非易失存儲268可用于存儲永久性信息,它在移動計算設備200掉電時也不會丟失。應用程序266能使用和儲存存儲器268中的信息,如電子郵件或由電子郵件應用程序使用的其它消息、由PIM使用的聯系人信息、由時間表程序使用的約會信息、由文字處理程序使用的文檔等。
            移動計算設備200具有實現為一個或多個電池的電源270。電源還能包括外接電源,如AC適配器或補充或重充電電池的電源連接座。
            移動計算設備200還能包括外部通知機制,如LED(未示出)和音頻接口274。這些設備能直接耦合到電源270,使得在激活時,即使關閉處理器260和其它組件來節省電池功率,它們仍按通知機制所指示的在一段時間內保持打開。音頻接口274用于向用戶提供音頻信號并從用戶接收音頻信號。例如,音頻接口274能耦合至揚聲器以提供音頻輸出,并耦合至麥克風以接收聽覺輸入以便于電話對話。
            移動計算設備200還能包含通信連接240,它允許設備如經無線網絡與其它計算設備進行通信。移動計算設備200還包括無線電接口層272,它執行發送和接收射頻通信的功能。無線電接口層272通過通信載波或服務提供商方便了在移動計算設備200和外部世界之間的無線連接。到無線電接口層272的來回發送在操作系統264的控制下進行。換言之,由無線電接口層272和通信連接240接收的通信能通過操作系統傳播到應用程序,反之亦然。
            說明性狀態變化通知系統圖3按本發明的諸方面示出了示例狀態管理和通知系統。通知系統300包括狀態改變組件310、客戶機315和320、通知代理程序335和數據存儲330。按一個實施例,通知代理程序335還維護通知列表340、高速緩存屬性345和調度程序350。
            如客戶機315或320那樣的客戶機向通知代理程序335注冊來接收關于對狀態屬性的變化的通知。一般而言,每當狀態屬性改變,當變化滿足一條件時或根據一時間表,客戶機用注冊該客戶機以接收通知的通知代理程序335作出通知請求。通知能是永久的或暫時的通知。
            永久的通知被保存在數據存儲(320)中。按照一個實施例,永久的通知保存在如注冊表的后端數據存儲中,因而跨重起是“持久不變的”。因為這些通知是持久的,這些類型的狀態屬性在軟復位(或關閉)之前具有與重起(或起動)之后相同的值。。按照一個實施例,狀態屬性默認地是持久的。
            暫時通知不是永久的,因而跨重起是不持久保持的。換言之,若軟復位(或重起)設備,從通知列表340中刪除通知請求。為了恢復暫時通知,客戶機重新注冊(向通知代理程序335發送另一通知請求)以接收關于對狀態屬性的變化的通知。
            客戶機還能注冊,使在發生狀態改變時和/或按時間表裝入應用程序。通常,如果當狀態改變或已調度的時間出現時客戶機所指定的應用程序尚未運行,則通知代理程序335發出命令以啟動該應用程序。按一個實施例,客戶機能指定當裝入時發送給該應用程序的命令行參數。若裝入的進程創建一窗口,則向該窗口發送表示該通知的消息。若目標進程已在客戶機上運行,則客戶機僅接收通知消息。
            發送給客戶機的通知也能分批處理。分批的狀態屬性供經常經常發生值變化的狀態屬性使用。設定允許使狀態屬性值“穩定”的預定的時間周期。按一個實施例,預定周期設成200ms。若在預定期間未向狀態屬性值作出改變,則將該通知傳送給注冊的客戶機。分批預定周期是可配置的,并存儲在數據存儲330中。
            數據存儲330被配置成存儲注冊的狀態屬性,以及其它信息。按一個實施例,數據存儲330是操作系統提供的注冊表,如由微軟公司的Windows XP操作系統提供的注冊表。數據存儲330也能是在其中能設置和訪問信息的其它類型的數據存儲。數據存儲330還能包括在通知系統300的各種位置上維護的一個或多個數據存儲。
            數據存儲330也能用可由客戶機315和320訪問的狀態屬性的默認設置預加載。預加載狀態屬性數據使許多狀態屬性可用,而客戶機不必添加狀態屬性。例如,按一個實施例,下面狀態對客戶機可用而不必注冊該狀態顯示校準(分辨率,亮度)、不消除的提醒(計數、主題、日期、時間、位置)、不消除的警告(計數、描述、日期、時間)、電池(剩余電量的%、狀態)、后備電池(剩余電量的%、狀態)、存儲器(空閑的程序存儲器、已使用的程序存儲器、空閑的存儲存儲器、已使用的存儲存儲器)、存儲卡(總的空閑存儲器、總的已使用存儲器)、硬件(按下電話狀態(開/關)、啟用鍵盤、啟用Wifi、啟用藍牙、頭戴式耳機存在、相機存在)、消息(未讀計數、總計數、草稿計數、發件箱計數)、任務(高優先級計數、今天的任務計數、已過期計數)、日程表(下次約會、名字、位置、日期、時間、POOM ID)、白天的約會(名字、位置、日期、時間、POOM ID)、當前約會(名字、位置、日期、時間、POOM ID);當前空閑/忙碌狀態、即時消息(狀態、在線聯系人計數、離線聯系人計數)、連接性(速度、Wifi、接入點、信號強度、連接名、連接到(工作,互聯網)、狀態)、媒體播放器(狀態、播放列表(名稱、模式(重復,隨機)、音軌記數、總持續時間)、音軌(類型(音頻、視頻)、名稱、專輯、藝術家、音軌數、流派、年、持續時間、播放演位置、文件名、比特率)、同步狀態、電話(操作員、信號強度、電話狀態、概覽、漫游、無線電狀態、有效呼叫(呼叫者名、呼叫者號碼)、未接呼叫計數、SIM工具組消息。如能看到,狀態覆蓋了許多不同的應用程序。
            按一個實施例,狀態屬性數據被組織成一層次結構。該層次結構使客戶機能通過參照其父屬性來規定一組狀態屬性。狀態屬性能設置成如串、整型、浮點型等數據類型。
            客戶機能通過狀態屬性的“友好”串(名)表示來標識狀態屬性。例如,“battery\a”參照在父“battery(電池)”之下的狀態屬性“a”,同樣,“battery\b”能是在父“battery”之下的狀態屬性“b”。當參照共同的父之下的一組狀態屬性時,能使用父標識符。例如,為接收基于對所有電池狀態的變化的通知,在注冊表中提供“battery”,從而使用單個名字參照所有電池狀態屬性。
            代理程序335能被配置成控制對數據存儲330中設置/調節/移除狀態屬性類型的訪問。例如,能在狀態屬性上加上限制,它將從通知系統中的刪除屬性局限到預定的客戶機的列表上。當刪除狀態屬性時,向已注冊關于該屬性的通知的客戶機通知這一刪除。
            如上討論,客戶機315和320注冊他們在接收關于這些狀態屬性何時改變的通知時所感興趣的的狀態屬性。客戶機能注冊,以每當他們所注冊的狀態改變時,當施加到狀態值的條件滿足一條件時,或在預定時間表到達時接收通知。條件通知可基于許多不同的條件。按一個實施例,條件包括所有、等于、不等于、大于、大于或等于、小于或等于、小于、包含、以……開始、以……結束。例如,客戶機315能向通知代理程序335注冊,以當未接呼叫計數狀態屬性大于15時,和當呼叫者的名字包含“Ja”時接收通知。加條件使客戶機能接收他們關注的狀態改變信息而不必處理他們無關心的狀態改變信息。
            注冊來接收關于對狀態屬性的改變的通知的客戶機在通知列表340中維護。通知代理程序335訪問通知列表340,以便當注冊的狀態屬性改變時確定應接收通知的客戶機。
            調度程序350可被配置成根據時間表通知和/或激活客戶機。調度的激活通知模式允許客戶機根據向通知代理程序335注冊的簡化的循環時間表接收通知。時間表能被配置成以任意的時間間隔發生,如按秒、分、小時、天、星期、或月的度量。按一個實施例,時間表由第一次出現的日期/時間和兩次出現的時間量來定義。此外,可不以循環時間間隔來定義時間表。當不提供循環時間間隔時,通知只發送一次,然后從通知列表中移除該注冊。此外,當通知到達時,若未能找到指定的(在通知請求期間提供的)應用程序路徑,則從通知列表340移除該已調度的通知注冊。
            當狀態改變時,狀態變化組件310在數據存儲330中更新該狀態屬性的值。狀態變化組件310能直接在數據存儲330中更新狀態,或通過通知代理程序335來更新。當通過數據存儲330更新狀態時,數據存儲330向通知代理程序335傳遞此變化。當通過通知代理程序335更新狀態時,通知代理程序335在數據存儲330中更新狀態。在任一情況下,通知代理程序335根據狀態變化確定應通知哪些客戶機。通知代理程序335分析通知列表340,并確定已注冊了關于該狀態變化的通知的客戶機。通知代理程序335向已經改變的狀態屬性值施加任何條件,并在條件滿足時通知客戶機。當不存在與該狀態變化關聯的條件時,向該客戶機通知該狀態變化。
            當如客戶機315和320那樣的客戶機從通知代理程序335接收通知時,客戶機能調用公用API中的功能(見下面討論)來檢索該狀態屬性的新狀態。可選地,可將該屬性信息連同通知一起直接傳送到客戶機。當用戶對接收有關特定狀態屬性的通知不再感興趣時,客戶機能從接收關于該狀態屬性的改變通知撤消其本身的注冊。客戶機315和320也能在任何時刻使用公用API直接查詢代理程序335,以找到狀態屬性的狀態。
            狀態屬性值也能由通知代理程序335高速緩存在高速緩存屬性345中。狀態屬性值能根據許多不同理由高速緩存。例如,狀態屬性值能被高速緩存,使得可將狀態屬性的先前值與該狀態屬性的當前值進行比較。此外,高速緩存能幫助便于請求狀態屬性值的快速重復查找。
            按一個實施例,通知系統300支撐.NET(管理的)客戶機,以向存儲添加和改變通知注冊。
            以下是進一步表明狀態管理通知系統300的某些示例性場景。
            例1ISV服務網絡新手Norm構建了C#應用程序,它保持了當前賽季棒球的統計數據(如,隊、隊員、得分、狀態等)的完整數據庫。他還構建了簡單的XML Web-服務客戶機,它能連接到體育網站并下拉出已更新的日統計。因為該應用存儲的數據量相當大,Norm僅希望其應用程序在設備(如PPC)上的“粗管道(fat pipe)”(如802.1x)可用時同步數據。然后Norm通過向通知代理程序335發送對當高帶寬連接可用時的通知的請求來注冊其應用程序。Norm在通知請求中另外規定,當高帶寬連接可用時裝入其應用程序的請求。當與連接關聯的狀態變化組件更新該連接狀態時,若狀態表明它是高速連接,則通知代理程序335激活Norm的應用程序。
            例2LOB公司(商務線)應用程序企業開發者Elph構建了基于現場服務形式的VB.Net應用程序,供保險精算人使用。該應用程序允許保險調停者查找零件數和價格、作出注釋、檢索汽車的原理圖等。每天,保險精算人在現場拿出他的移動設備為客戶機服務。該應用程序在數據存儲中本地持久保存今天的操作的所有數據。Elph希望每當連接上設備時,該應用程序將離線存儲與公司主服務器同步。因而,Elph注冊其應用程序以接收通知同步連接事件的通知。每當連接上設備時,向該應用程序通知,且該應用程序同步其數據。
            例3電話游戲電話游戲開發者Golem正在構建下一代電話多游戲者RPG。他希望該游戲是非常普及的,使得它一次能持續數周和數月。Golem主要關心的一個問題是沒有用戶的干預游戲狀態的持久性。該游戲的純粹特征之一是在電話電池耗盡之前保存當前的狀態,并確保用戶永不丟失任何數據的能力。Golem注冊他的應用程序來接收電量不足的通知,以確保在設備電池耗盡前保存游戲信息。
            例4設備管理客戶機應急企業管理客戶機開發者Eric尋求創建下一代移動計算設備和電話管理客戶機;能夠處理客戶機更新、病毒掃描、政策實施及其它更多的功能。他使用C#已構建了強有力的設備方客戶機,它能基于服務器驅動的命令處理諸請求。每天凌晨3點,Eric希望他的應用程序“醒來”,使他能聯系服務器來尋找已更新的政策、病毒掃描器的簽名等。為此,他簡單地向通知代理程序335注冊其應用程序以接收已調度的通知(每天凌晨3點)。Eric現能確保他的應用程序在指定時間運行。
            圖4示出按本發明的諸方面用于狀態變化通知系統的過程。在開始塊之后,過程400前進到塊410,其中,客戶機注冊以獲得對至少一個狀態屬性的改變的通知。若該狀態屬性不是已由另一客戶機監控,則將該狀態屬性添加到可用狀態屬性的列表中。如上討論,可用屬性的列表被預加載到通知系統。客戶機能注冊以接收關于對該屬性作出的所有變化、滿足條件的變化的通知,以及按時間表來通知。
            移到塊420,向通知系統注冊回叫,使得當對注冊的狀態屬性作出變化時,令通知系統知道該變化。按一個實施例,通知代理程序向操作系統注冊表注冊對狀態屬性值作出的變化的回叫。
            前進到塊430,將該客戶機添加到通知列表,以接收關于該裝態屬性的通知消息。包括在通知列表中的客戶機接收關于對注冊的狀態屬性的變化的通知。
            移到塊440,當對任何注冊的狀態屬性作出變化時,接收回叫。按一個實施例,回叫包括標識狀態屬性變化的標識符和狀態屬性的當前值。
            移到塊450,處理狀態變化信息。一般而言,處理狀態變化信息包括判斷是否向每一對改變的狀態屬性已注冊的客戶機應用了任何條件、時間表、分批處理或應用程序裝入條件(見圖5及有關討論)。
            圖5示出按本發明的諸方面處理狀態改變信息的過程。在開始塊500之后,過程前進到塊510,其中,訪問注冊接收有關改變的狀態屬性的狀態變化的通知用戶。按一個實施例,訪問通知表以確定對已改變的狀態屬性已注冊的客戶機。
            移到判斷塊520,在通知客戶機之前判斷該客戶機是否已規定要應用到該狀態屬性的任何條件。
            當條件表達式與通知請求關聯時,過程前進到塊530,其中,判斷條件是否滿足。當條件滿足,或當客戶機未規定任何條件時,過程前進到判斷塊540,其中,判斷客戶機是否規定響應于狀態屬性的變化而裝入應用程序。當客戶機規定裝入應用,過程前進到塊550,其中,若應用程序尚未運行,則裝入該應用程序。當客戶機未規定裝入應用程序,或在塊550該應用程序已經被裝入,則過程移到塊560,向客戶機通知狀態變化。
            然后,過程前進到判斷塊570,判斷是否有更多的注冊來接收關于對該狀態屬性變化的通知的客戶機。當存在另一客戶機時,過程返回到塊510。當不存在其它客戶機,則過程移到結束塊并返回以處理其它行動。
            狀態屬性類型和模式按本發明的一個實施例,能使用兩個API來訪問通知系統中的狀態信息。提供一本機或底層API,并向客戶機提供已管理的API。已管理的API訪問本機API以執行其操作。
            下面是按本發明的諸方面的示例性本機API<pre listing-type="program-listing"><![CDATA[ #define E_ALREADY_REGISTERED ERROR_ALREDAY_REGISTERED#define E_DATATYPE_MISMATCH ERROR_DATETYPE_MISMATCH#define E_INSUFFICIENT_BUFFERERROR_INSUFFICIENT_BUFFER#define E_INVALID_HANDLE ERROR_INVALID_HANDLE#define E_NOT_FOUND ERROR_NOT_FOUND#define E_NOT_READY ERROR_NOT_READYDECLARE_HANDLE(HREGNOTIFY);//暫時通知句柄//**************************************************************//枚舉名REG_COMPARISONTYPE//目的用于定義應當如何將狀態屬性值與條件變化通知的目標值相比較。當執行//REG_COMPARISONTYPE時,改變的值用作1-值,即,REG_CT_LESS指如果//改變的值小于目標值,則激發通知。//描述//以下示出了當完成比較時哪一命題為真。大小寫敏感的CompareString用于比較//串,以下信息用于闡明REG COMPARISONTYPE值的目的。//假設“cv”表示改變的值,“psz”或“dw”表示NOTIFICATIONCONDITION//結構中指定的TargetValue(目標值)。設“l”表示psz中指定的串的長度(wcslen(psz)),“cvl”表示改變的值的串長度(wcslen(cv))。// REG_SZREG_DWORD//REG_CT_EQUAL |(0==strcmp(cv,psz)) |(cv==dw)|//REG_CT_NOT_EQUAL |(0!=strcmp(cv,psz)) |(cv!=dw)|//REG_CT_GREATER |(0<strcmp(cv,psz)) |(cv>dw)|//REG_CT_GREATER_OR_EQUAL|(0<=strcmp(cv,psz)) |(cv>=dw)|//REG_CT_LESS|(0>strcmp(cv,psz)) |(cv<dw)|//REG_CT_LESS_OR_EQUAL |(0>=strcmp(cv,psz)) |(cv<=dw)|//REG_CT_CONTAINS|(0!=strstr(cv,psz)) |N/A|//REG_CT_STARTS_WITH |(0==strncmp(cv,psz,l)) |N/A|//REG_CT_END_WITH|(0==strcmp(cv+cvl-1,psz))|N/A|//*************************************************typedef enum tagREG_COMPARISONTYPE{REG_CT_EQUAL,REG_CT_NOT_EQUAL,   REG_CT_GREATER,   REG_CT_GREATER_OR_EQUAL,   REG_CT_LESS,   REG_CT_LESS_OR_EQUAL,   REG_CT_CONTAINS,   REG_CT STARTS_WITH.   REG_CT_ENDS_WITH  }REG_COMPARISONTYPE;  //*******************************************************  //結構名NOTIFICATIONCONDITION  //  //目的用于定義若符合則應當激發屬性狀態變化通知的條件  //  //描述  // REG_COMPARISONTYPE ctComparisonType—如何將改變的值與TargetValue  // (目標值)中指定的值進行比較  // DWORD dwMask—如果該值不設為0,則將TargetValue解釋為DWORD。該  // 在比較完成之前應用到改變的DWORD值,該標記不應用到TargetValue。  // 如果該值設為0,則將TargetValue解釋為串。  //union TargetValue—如果dwMask設為0,則在psz和改變的值之間完成比較。如  // dwMask設為不同于0的任何值,則在dw和加表征碼(見dwMask)的改  // 變值之間完成比較。如果改變的值既不是類型REG_SZ也不是  // REG_DWORD,或者改變的值是類型REG_DWORD并且dwMask設為0,  // 或者改變的值是類型REG_SZ且dwMask不設為0,則忽略通知。如果改  // 變的值被刪除并且對照dw完成了比較,則0用作改變的值,且比較照常進  // 行。如果值被刪除且對照psz完成了比較,則NULL用作改變的值,且僅  // 由比較處理REG_CT_EQUAL和REG_CT_NOT_EQUAL,如果使用了任何  // 其它的ctComparisonType,則忽略刪除通知。  ////**********************************************************  typedef struct tagNOTIFICATIONCONDITION  {  REG_COMPARISONTYPE ctComparisonType;  DWORD dwMask;  union  {   LPCTSTR psz;    DWORD dw;   }TargetValue;  }NOTIFICATIONCONDITION  //函數原型REGISTRYNOTIFYCALLBACK  //  //目的定義RegisterNotifyCallback使用的回叫的原型  //  //自變量  // IN HREGNOTIFY hNotify—到有效HREGNOTIFY的句柄,這是從  // RegistryNotifyCallback返回的同一句柄  // IN DWORD dwUserData—傳遞到RegistryNotifyCallback的用戶數據  // IN const PBYTE pData—到該值的新值的指針,如果該值被刪除,則將其設為  // NULL  // IN const UINT cbData—由pData指出的字節數,如果該值被刪除,則將該值設  //為0  //  //描述  //該回叫用于通知使用RegistryNotifyCallback注冊了通知的客戶機。如果不再需要  //任何通知,則可以安全地從該回叫內調用RegistryCloseNotification。  //  //****************************************************************** typedef void(*REGISTRYNOTIFYCALLBACK)(HREGNOTIFY hNotify  DWORD dwUserData,  const PBYTE pData,  const UINT cbData);  //******************************************************************  //函數名RegistryGetDWORD  //  //目的用于讀取REG_DWORD注冊表值  //  //自變量  // IN HKEY hKey—到當前打開的鍵的句柄,或預定義的根值  // IN LPCTSTR pszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName  // 在該hKey中)  // IN LPCTSTR pszValueName—要檢索的值的名字(可以為NULL以檢索默認值)  // OUT DWORD*pdwData—到接收與同該值關聯的數據的緩沖器的指針  //  //返回值  // HRESULT  // S_OK—數據復制到緩沖器  // E_INVALIDARG-hKey或pdwData無效  // E_DATATYPE_MISMATCH—非REG_DWORD類型的值  // 被包裝成FACILITY_WIN32 HRESULT的從RegOpenKeyEx或  // RegQueryValueEx返回的錯誤值  //  //結果  // SUCCEEDED-pData指向與該值關聯的數據  // FAILED—未改變  //  //描述  // 與該值關聯的DWORD被復制到由pData指向的緩沖器中。如果由// hKey+pszSubKey指向的鍵不存在,則RegistryGetDWORD失敗,因為它使用  // RegOpenKey來訪問該鍵  //  //*************************************************************  HRESULT WINAPI RegistryGetDWORD(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   DWORD*pdwData);  //*************************************************************  //函數名RegistryGetString  //  //目的用于讀取REG_SZ注冊表鍵  //  //自變量  // IN HKEY hKey—到當前打開的鍵的句柄,或預定義的根值  // IN LPCTSTR pszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—要檢索的值的名字(可以為NULL,以檢索默認  // 值)  // OUT LPTSTR pszData—到接收與該值關聯的數據的緩沖器的指針  // IN UINT cchData—到以字符計算的長度為由pData指向的緩沖器的變量的指針  //  //返回值  // HRESULT  // S_OK—數據復制到緩沖器  // E_INVALIDARG-hKey或pszData無效  // E_DATATYPE_MISMATCH—該值不是REG_SZ類型  // E_INSUFFICIENT_BUFFER—如cchData確定的由pszData指向的緩沖器的大  // 小不夠大來保留該串  // 被包裝為FACILITY_WIN32 HRESULT的從RegOpenKeyEx或// RegQueryValueEx返回的錯誤值  //  //結果  // SUCCEED-pData指向與該值關聯的數據  // FAILED—沒有變化  //  //描述  //  // 與該值關聯的串被復制到由pData指向的緩沖器。如果由hKey+pszSubKey指  // 向的鍵不存在,則RegsitryGetString將失敗,因為它使用了RegOpenKey來訪  // 問該鍵  //  //******************************************************************  HRESULT WINAPI RegistryGetString(HKEY hKey,  LPCTSTR pszSubKey,  LPCTSTR pszValueName,  LPTSTR pszData,  UINT cchData);  //************************************************************  //函數名RegistrySetDWORD  //  //目的用于設置REG_DWORD注冊表值  //  //自變量  // IN HKEY hKey—到當前打開的鍵的句柄,或預定義的根值  // IN LPCTSTR pszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—要設置的值的名字(可以為NULL,以設置默認  // 值)  // IN DWORD dwData—新值//  //返回值  // HRESULT  // S_OK-pszValueName的值變為dwData中的值  // E_INVALIDARG-hKey無效  // E_DATATYPE_MISMATCH—值不是REG_DWORD類型  // 被包裝成FACILITY_WIN32 HRESULT的從RegOpenKeyEx或  // RegQueryValueEx返回的錯誤值  //  //結果  // SUCCEEDED—與該值關聯的數據改變  // FAILED—不改變  //  //描述  // 與該值關聯的數據改變成新值。如果由hKey+PszSubKey指向的鍵不存在,則  // RegistrySetDWORD失敗,因為它使用RegOpenKey來訪問該鍵  //  //****************************************************************  HRESULT WINAPI RegistrySetDWORD(HKEY hKey,  LPCTSTR pdzSubKey,  LPCTSTR pszValueName,  DWORD dwData);  //****************************************************************  //函數名RegistrySetString  //  //目的用于設置REG_SZ注冊表值  //  //自變量  // IN HKEY hKey—到當前打開的鍵的句柄,或預定義根值  // IN LPCTSTR pszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName// 在hKey下)  // IN LPCTSTR pszValueName—要設置的值的名字(可以為NULL,以設置默認  // 值)  // IN LPCTSTR pszData—新值。該串以空結束。  //  //返回值  // HRESULT  // S_OK-pszValueName的數據值變為pszData中的值  // E_INVALIDARG-hKey或pszData無效  // E_DATATYPE_MISMATCH—值不是REG SZ類型  // 被包裝成FACILITY_WIN32 HRESULT的從RegOpenKeyEx或  // RegQueryValueEx返回的錯誤值  // 從StringCbLength返回的錯誤HRESULT  //  //結果  // SUCCEEDED—與該值關聯的數據改變  // FAILED—不改變  //  //描述  // 與該值關聯的數據變為新值。如果由hKey+pszSubKey指向的鍵不存在,則  // RegistrySetString失敗,因為它使用RegOpenKey來訪問該鍵  //  //******************************************************************  HRESULT WINAPI RegistrySetString(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   LPCTSTR pszData);  //******************************************************************  //函數名RegistryTestExchangeDWORD  ////目的用于基于條件原子地設置值  //  //自變量  // IN HKEY hKey—到當前打開的鍵的句柄,或預定義根值  // IN LPCTSTR pszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName  // 在hKey下  // IN LPCTSTR pszValueName—要設置的值的名字(可以為NULL,以設置默認  // 值)  // IN DWORD dwOldValue—要對照來檢查的值  // IN DWORD dwNewValue—要有條件地設置的值  //  //返回值  // HRESULT  // S_OK—數據值變為dwNewValue  // S_FALSE—目標值未設為dwNewValue,因為與pdsValueName關聯的DWORD  // 值不等于dwOldValue  // E_INVALIDARG—傳遞的句柄或指針之一無效  // E_DATATYPE MISMATCH—值不是REG DWORD類型  // E_NOT_FOUND—值無法在指定的鍵下找到  // 被包裝成FACILITY_WIN32 HRESULT的錯誤值  //  //結果  // SUCCEEDED—與pszData關聯的數據值曾經是dwOldValue,現在是  // dwNewValue  // FAILED—不改變  //  //描述  // 該函數是聯鎖(interlocked)函數—換言之,它可以被認為是原子的。它檢查  // 與pszValueName關聯的DWORD值是否等于OldValue。如果是,則它將目標  // 設為NewValue,否則失敗。//  //**************************************************************  HRESULT WINAPI RegistryTestExchangeDWORD(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   DWORD dwOldValue,   DWORD dwNewValue);  //**************************************************************  //函數名RegistryNotifyAppp  //  //目的用于請求當指定的值改變時裝入或通知應用程序  //  //自變量  // IN HKEY hKey—到當前打開的鍵的句柄,或預定義根值  // IN LPCTSTRpszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—在其上請求了變化通知的值的名字(可以為  // NULL,以指示默認值)  // IN LPCTSTR pszName—表示通知請求的用戶定義的串,當不再需要通知時,  // 該串應當被傳遞到RegistryStopNotification  // IN LPCTSTR pszApp—到作為到要裝入的可執行碼的路徑的串的指針  // IN LPCTSTR pszClass—一旦裝入了可執行碼,或者如果它已運行,則具有該窗  // IN LPCTSTRpszWindow 口名和類類型的窗口位于該進程內,并且向其傳  // 遞通知。如果這兩個參數都為空,該函數將僅裝入應用程序。  // IN UINT msg—傳遞到窗口的消息  // IN NOTIFICATIONCONDITION*pCondition—當與新注冊表值的比較為TRUE  // 時應當發送變化通知的條件(可以為NULL,以指示任何變化應當導致通知)  //  //返回值  // HRESULT// S_OK—對通知的請求被添加到通知列表  // E_INVALIDARG-hKey、pszApp或pszName無效  // E_ALTRADY_REGISTERED—名字等于由pszName執行的名字的通知已存在  // 包裝成FACILITY_WIN32 HRESULT的錯誤值  //  //結果  // SUCCEEDED—現在每次當對該值作出改變時將通知調用者  // FAILED—不改變  //  //描述  // 通知請求被添加到通知列表。調用者調用RegistryStopNotification來停止進一  // 步的通知。該通知請求類型是永久的,即,即使設備復位時通知請求也是活動  // 的。在通知時,該函數通過在pszClass和pszWindow指定的類名和窗口名上作  // 出FindWind來確定是否已運行了具有pszApp中指定的名字的可執行碼,如果  // 沒有,則它裝入該應用程序。傳遞到應用程序的命令行應當在pszApp串中指  // 定,除用戶指定的任何命令行之外,添加以下內容  // /notify″pszName″  // pszName—傳遞到pszName參數中的函數的句柄串  // 在裝入應用程序之后,完成FindWindow,以查找具有pszClass和pszWindow  // 中指定的類名和窗口名的窗口。如果找到該窗口,則如在RegistryNotifyWindow  // 窗口中一樣通過PostMessage標帖由msg指定的消息。PostMessage的參數如下  // WPRAM—對于類型REG_DWORD的值,如果值已被刪除,則它是新值或  // 0;對于所有其它類型,該值為0  // LPARAM-0  // 該消息參數應當對RegistryNotifyApp的每一調用都是唯一的,使得客戶機可在  // 多個通知之間區分。當添加或改變值時通知客戶機。當通知到達時,如果由  // pszApp指向的應用程序無法被裝入,或無法找到具有類型pszClass的類的窗  // 口,或PostMessage失敗,則從通知列表中移除通知。  //  //*******************************************************************HRESULT WINAPI RegistryNotifyApp(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   LPCTSTR pszName,   LPCTSTR pszApp,   LPCTSTR pszClass,   LPCTSTR pszWindow,   UINT msg,   NOTIFICATIONCONDITION*pCondition);  //***************************************************************  //函數名RegistryNotifyWindow  //  //目的用于請求當指定值改變時通知窗口  //  //自變量  // IN HKEY hKey—到當前打開的鍵的句柄,或預定義根值  // IN LPCTSTR pszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—在其上請求了變化通知的值的名字(可以為  // NULL,以指示默認值)  // IN HWND hWnd—向其發送消息的窗口的句柄  // IN UINT msg—傳遞到窗口的消息  // IN DWORD dwUserData—用通知傳遞回用戶的用戶數據  // IN NOTIFICATION CONDITION*pCondition—當與新注冊表值的比較為  // TRUE時應當發送變化通知的條件(可以為NULL,以指示任何變化應當  // 導致通知)  // OUT HREGNOTIFY*phNotify—接收到通知請求的句柄。當該鍵上的通知不再  // 需要時,應當使用RegistryCloseNotification關閉該句柄。  //  //返回值// HRESULT  // S_OK—對通知的請求被添加到通知列表  // E_INVALIDARG-hKey、phNotify或hWnd無效  // 被包裝成FACILITY_WIN32 HRESULT的錯誤值  //  //結果  // SUCCEEDED—每次當對該值作出變化時將通知調用者  // FAILED—不改變  //  //描述  // msg參數應當對RegistryNotifyWindow的每一調用都唯一,使得客戶機可在多  // 個通知之間區分。通知請求被添加到通知列表。調用者調用  // RegistryCloseNotification來停止進一步的通知,并關閉通知句柄。該通知請求  // 類型是暫時的,即,如果設備復位,則通知請求不再存在。當由pszValueName  // 指定的值改變時,通過PostMessage通知客戶機。如果PostMessage失敗,或  // 由hWnd指定的窗口不再有效,則從通知隊列中移除通知請求,并且關閉  // phNotify中返回的句柄。  // 傳遞到PostMessage的參數如下  // WPARAM—對于類型REG_DWORD的值,如果該值已被刪除,則它是新  //值或0;對于所有的其它類型,該值為0  // LPARAM-dwUserData上傳遞的數據  // 當調用RegsitryNotifyWindow時如果該值不再存在,則當添加該值時通知客戶  // 機。  //  //***************************************************************  HRESULT WINAPI RegistryNotifyWindow(HKEY hKey,   LPCTSTR pszValueName,   HWND hWnd,   UINT msg,   DWORD dwUserData,NOTIFICATIONCONDITION*pCondition,   HREGNOTIFY*phNotify);  //***************************************************************  //函數名RegistryNotifyMsgQueue  //  //目的用于請求當指定的值改變時通知消息隊列  //  //自變量  // IN HKEY hKey—到當前打開的鍵的句柄,或預定義根值  // IN LPCTSTR pszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—在其上請求變化通知的值的名字(可以為NULL,  // 以指示默認值)  // IN LPCTSTR pszMsgQueue—到作為要通知的消息隊列的名字的串的指針。如  // 果該消息隊列尚未創建,則RegistryNotifyMsgQueue將創建它。  // IN DWORD dwUserData—將用通知傳遞回用戶的用戶數據  // IN NOTIFICATIONCONDITION*pCondition—當與新注冊表值的比較為TRUE  // 時應當發送變化通知的條件(可以為NULL,以指示任何變化應當導致通  // 知)  // OUT HREGNOTIFY*phNotify—接收到通知請求的句柄。當該鍵上的通知不再  // 需要時,應當用RegistryCloseNotification關閉該句柄。  //  //返回值  // HRESULT  // S_OK—對通知的請求被添加到通知列表  // E_INVALIDARG-hKey、phNotify或pszMsgQueue無效  // 被包裝成FACILITY_WIN32 HRESULT的錯誤結果  //  //結果  // SUCCEEDED—每次當對該值作出變化時將通知調用者// FAILED—不改變  //  //描述  // 通知請求被添加到通知列表。調用者調用RegistryCloseNotification來停止進一  // 步的通知,并關閉通知句柄。該通知請求類型是暫時的,即,如果設備復位,  // 則通知請求不再存在。通過消息隊列通知客戶機。一旦通知了客戶機,可使用  // ReadMsgQueue函數來檢索關于改變的鍵的信息。返回的數據為以下格式  // |HREGNOTIFY hNotify|DWORD dwUserData|UINT字節級數|BYTE[]新值  // |  // hNotify—與phNotify中所返回的一樣的hNotify  // dwUserData—作為dwUserData傳遞的用戶數據  // 字節計數—隨后的字節數(對于刪除,該值為0)  // 新值—pszValueName的新值  // 如果當調用RegistryNotifyMsgQueue時該值不存在,則當添加該值時通知客戶  // 機。  //  //******************************************************************  HRESULT WINAPI RegistryNotifyMsgQueue(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   LPCTSTR pszMsgQueue,   DWORD dwUserData,   NOTIFICATIONCONDITION*pCondition,   HREGNOTIFY*phNotify);  //*******************************************************************  //函數名RegistryNotifyCallback  //  //目的用于請求當指定的值改變時通知回叫  //  //自變量// IN HKEY hKey—到當前打開的鍵的句柄,或預定義根值  // IN LPCTSTR pszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—在其上請求的變化通知的值的名字(可以為  // NULL,以指示默認值)  // IN REGISTRYNOTIFYCALLBACK pfnRegistryNotifyCallback—到當通知到達  // 時將回叫的函數的指針  // IN DWORD dwUserData—用通知傳遞回用戶的用戶數據  // IN NOTIFICATIONCONDITION*pCondition—當與新值的比較為TRUE時應  // 當發送變化通知的條件(可以為NULL,以指示任何變化應當導致通知)  // OUT HREGNOTIFY*phNotify—接收到通知請求的句柄。當該鍵上的通知不再  需要時,應當使用RegistryCloseNotificaion關閉該句柄。  //  //返回值  // HRESULT  // S_OK—對通知的請求被添加到通知列表  // E_INVALIDARG-hKey、phNotify或pfnRegistryNotifyCallback無效  // 被包裝成FACILITY_WIN32 HRESULT的錯誤結果  //  //結果  // SUCCEEDED—每次當對該值作出變化時通知調用者  // FAILED—不改變  //  //描述  // 通知請求被添加到通知列表。調用者調用RegistryCloseNotificaion來停止進一  // 步的通知,并關閉通知句柄。該通知請求的類型是暫時的,即,如果設備復位,  // 則通知請求不再存在。通過回叫向客戶機通知變化。如果當調用  // RegistryNotifyCallback時該值不存在,則當添加該值時通知客戶機。  //  //******************************************************************HRESULT WINAPI RegistryNotifyCallback(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   REGISTRYNOTIFYCALLBACK pfnRegistryNotifyCallback,   DWORD dwUserData,   NOTIFICATIONCONDITION*pCondition,   HREGNOTIFY*phNotify);  //******************************************************************  //函數名RegistryCloseNotification  //  //目的用于從通知列表中移除通知請求,并關閉通知句柄  //  //自變量  // IN HREGNOTIFY hNotify—到有效HREGNOTIFY的句柄,必須已返回  // RegistryNotify*函數之一  //  //返回值  // HRESULT  // S_OK—通知請求從通知列表中移除  // E_INVALID_HANDLE-hNotify無效  // 被包裝成FACILITY_WIN32 HRESULT的錯誤值  //  //結果  // SUCCEEDED—通知請求已被移除,hNotify現在是無效句柄  // FAILED—不改變  //  //描述  // 搜索通知列表以查找對hNotify的參照,如果找到,將其從隊列中移除,并且  // 釋放與hNotify關聯的存儲器。尚未分派給客戶機的任何通知將丟失。  ////***************************************************************  HRESULT WINAPI RegistryCloseNotification(HREGNOTIFY hNotify);  //***************************************************************  //函數名RegistryStopNotification  //  //目的用于從通知列表中移除對永久通知的請求  //  //自變量  // IN LPCTSTR pszName—表示已注冊的永久通知的串  //  //返回值  // HRESULT  // S_OK—通知已從列表中移除  // E_INVALIDARG-pszName無效  // 被包裝成FACILITY_WIN32 HRESULT的錯誤值  //  //結果  // SUCCEEDED—通知請求已被移除  // FAILED—不改變  //  //描述  // 搜索通知列表以查找對通知的參照,如果找到,從隊列中移除它們。尚未分派  // 給客戶機的任何通知將丟失。  //  //*****************************************************************  HRESULT WINAPI RegistryStopNotification(LPCTSTR pszName);  //*****************************************************************  //函數名RegistryBatchNotification  //  //目的用于分批處理頻繁出現的通知//  //自變量  // IN HREGNOTIFY hNotify—到有效HREGNOTIFY的句柄,已返回  // RegistryNotify*函數之一  // IN DWORD dwMillisecondsIdle—在通知被激發之前應當值保持不變的毫秒數  // IN DWORD dwMillisecondsMax—第一個變化發生和發送通知之間的時間的最  // 大毫秒數  //  //返回值  // HRESULT  // S_OK—通知已從列表中移除  // E_INVALIDARG-dwMillisecondIdle被設為INFINITE  // E_INVALID_HANDLE-hNotify無效  // 被包裝成FACILITY_WIN32 HRESULT的錯誤值  //  //結果  // SUCCEEDED—設置了新的分批處理時間  // FAILED—不改變  //  //描述  // 當值改變時,通知系統等候dwMillisecondsIdle毫秒,然后發送通知。如果在  // 此等候期間發生另一變化,則復位定時器,通知系統將等候另一  // dwMillisecondsIdle毫秒以發送通知。為確保dwMillisecondsIdle不阻止發送通  // 知,使用dwMillisecondsMax。dwMillisecondsMax是可從第一個通知到達的時  // 間推移到發送通知的時間的最大毫秒數。如果dwMillisecondsMax被設為  // INFINITE,則分批處理通知直到該值為空閑。dwMillisecondsIdle不可以是  // INFINITE。  //  //**************************************************************  HRESULT WINAPI RegistryBatchNotification(HREGNOTIFY hNotify,DWORD dwMillisecondsIdle,   DWORD dwMillisecondsMax);  HRESULT WINAPI RegistryScheduleNotifications(SYSTEMTIME*pstStart,  DWORD dwIntervalMinutes,  RSN_BEHAVIOR rsnbehavior,  LPCTSTR pszName,  LPCTSTR pszApp,  LPCTSTR pszClass,  LPCTSTR pszWindow,  UINT msg);]]></pre>已管理API<pre listing-type="program-listing"><![CDATA[  以下是示例性已管理API  名字空間A.Mobile  {  ///用于指定當設備待命時當出現事件時應當發生什么   public enum StandbyBehavior   {   ///不要引發任何事件   Ignore,   ///將設備帶離待命狀態并引發事件    Wake,   ///一旦設備由其它事情喚醒就引發事件   Delay  }  public interface IAppLaunchable  {   ///該通知的唯一名字   public string appLaunchId{get;}///對特定的可執行碼和命令行參數注冊該通知  ///在被調用之前,該通知不活動  ///<param name=″appLaunchID″>  ///該通知的唯一標識符。  ///用于當應用程序關閉/重起時再次打開它  ///如果該ID已被使用,則拋出異常  ///</param>  ///param name=″filename″>  ///當引發通知時裝入的應用程序。  ///如果為空,則使用調用的可執行碼  ///</param>  ///<param name=″parameters″>發送到應用程序的命令行參數</param>  void EnableAppLaunch(string appLaunchId,string filename,stringparameters);  ///對不具有命令行的特定可執行碼注冊該通知  ///在被調用之前,該通知不活動  ///<param name=″appLaunchId″>  ///該通知的唯一標識符。  ///用于當應用程序關閉/重起時再次打開它  ///如果該ID已被使用,則拋出異常  ///</param>  ///<param name=″filename″>當引發通知時要裝入的應用程序</param>  void EnableAppLaunch(string appLaunchId,string filename);  ///對沒有參數的調用可執行碼注冊該通知  ///在被調用之前,該通知不活動  ///  ///如果從DLL而非EXE調用,則拋出異常///DLL用于調用其它超負載之一   ///<param name=″appLaunchId″>   ///該通知的唯一標識符   ///用于當應用程序關閉/重起時再次打開它   ///如果該ID已被使用,則拋出異常   ///</param>   void EnableAppLaunch(string appLaunchId);   ///解除通知的注冊   ///用于停止通知不再被激發   void DisableAppLaunch();  }  ///在已調度的基礎上引發的通知   public class ScheduledNotificationILaunchable  {   //該通知的下一次出現被調度在何時出現   public DateTime NextOccurrence{get;set}   ///在通知的出現之間過去了多少時間   ///忽略秒和毫秒   public TimeSpan Interval{get;set}   ///當出現過程中設備待命時該通知應當如何行動   ///忽略、喚醒設備、等候直到其它事情喚醒設備。   ///默認值是Wake(喚醒)   public StandbyBehavior StandbyBehavior{get;set}   ///確定是否注冊了命名的通知   ///<param name=″appLaunchId″>通知名</param>   ///<returns>如果已注冊了通知則為真</returns>   public static bool AppLaunchIdExists(string appLaunchId){}public event EventHandler Occured;   ///用給定名字創建新的持久通知   ///<param name=″nextOccurrence″>下一次出現是何時</param>   ///<param name=″interval″>出現之間的時間多長。忽略秒和毫秒  </param>   public ScheduledNotification(Datetime nextOccurrence,TimeSpan  interval){}   //加載先前注冊的通知的構造函數   ///<param name=″existingAppLaunchId″>先前注冊的通知的名字  </param>   public ScheduledNotification(string existingAppLaunchId)   {  if(!AppLaunchIdExists(name))   throw new ArgumentException();   }   }  }   名字空間A.Mobile.Status   {   ///用于有條件的變化通知指定應當如何將新值與期望值相比較   public enum StateComparisonType   {   ///不論值如何都引發事件,這是默認的   All,   Equal,   Greater,   GreaterOrEqual,   LessOrEqual,   Less,Contains,  StartsWith,  EndsWith  }  ///表示可被查詢并可被傾聽的所有系統狀態的枚舉  public abstract class StateBaseILaunchable  {   ///對于有條件的通知,如何將新值與TargetValue進行比較   public ComparisonType Comparisontype{get;set}   ///將新值與什么比較。僅當比較為真時引發通知   public object ComparisonValue{get;set}   ///該系統屬性的當前值   public object CurrentValue{get;}   public event ChangeNotificationEventHandlerChanged;  }  ///當系統定義的屬性改變時引發的暫時通知  public class SystemStateStateBase  {   ///獲取指定的系統屬性的值   ///<param name=″property″>要獲取值的屬性</param>   ///<returns></returns>   public static object GetValue(SystemProperty property){}   ///要監控的系統屬性   public SystemProperty Property{get;}   ///確定是否已注冊了命名的通知   ///<param name=″appLaunchId″>通知名</param>///<returns>如果通知已注冊則為真</returns>   public static bool AppLaunchIdExists(string appLaunchId){}   ///沒有條件的構造函數(永遠引發事件)   ///<param name=″property″></param>   public SystemState(SystemProperty property){}   ///為何時引發事件設置條件的構造函數   ///<param name=″property″>要監視的屬性</param>   ///<param name=″comparisonType>如何比較</param>   ///<param name=″comparisonValue>比較什么</param>   public SystemState(SystemProperty property,ComparisonTypecomparisonType,object comparisonValue){}   ///加載先前注冊的通知的構造函數   ///<param name=″existingAppLaunchId″>先前注冊的通知名</param>   public SystemState(string existingAppLaunchId)   {   if(!AppLaunchIdExists(name))   throw new ArgumentException();   }  }  ///當注冊表值改變時引發的暫時通知  public class RegistryValueStateBase  {   ///要監控的注冊表鍵   public RegistryKey Key{get;}   ///要監控的注冊表鍵中的值的名字   public string ValueName{get;}///確定是否注冊了命名的通知  ///<param name=″appLaunchId″>通知名</param>  ///<returns>如果通知已注冊則為真</returns>  public static bool AppLaunchIdExists(string appLaunchId){}  ///沒有條件的構造函數(永遠引發事件)  ///<param name=″key″>要監視的注冊表鍵</param>  ///<param name=″valueName″>要監視的注冊表鍵中的注冊表值的名字</param>  public RegistryValue(RegistryKey key,string valueName){}  ///為何時應當引發事件設置條件的構造函數  ///<param name=″key″>要監視的注冊表鍵</param>  ///<param name=″valueName″>要監視的注冊表鍵中的注冊表值的名字</param>  ///<param name=″comparisonType″>如何比較</param>  ///<param name=″comparisonValue″>比較什么</param>  public RegistryValue(RegistryKey key,string valueName,ComparisonType comparisonType,object comparisonValue){}  ///加載先前注冊的通知的構造函數  ///<param name=″existingAppLaunchId″>先前注冊的通知的名字</param>  public RegistryValue(string existingAppLaunchId)  {   if(!AppLaunchIdExists(name))  throw new ArgumentException();  }   }   public delegate void ChangeNotificationEventHandler(object sender,ChangeNotificationEventArgs e);   public class ChangeNotificationEventArgsEventArgs   {   public object CurrentValue{get;}   }   }]]></pre>已管理API的示例使用<pre listing-type="program-listing"><![CDATA[  //查詢系統屬性  int signal=SystemState.PhoneSignalStrength;  //或者……  int signal=(int)SystemState.GetValue(SystemProperty.PhoneSignalStrength);  //或者……  SystemState state=new SystemState(SystemProperty.PhoneSignalStrength);  int signal=(int)state.CurrentValue;  //注冊暫時通知  SystemState state=new SystemState(SystemProperty.PhoneSignalStrength);  state.Changed+=new ChangeNotificationEventHandler(…);  //注冊有條件的持久通知  SystemState state;  if(SystemState.AppLaunchIdExists(″MyApp.GoodSignal″))  {   state=new SystemState(″MyApp.GoodSignal″);  }  else  {   state=new SystemState(SystemProperty.PhoneSignalStrength,ComparisonType.Greater,75);   state.EnableAppLaunch(″MyApp.GoodSignal″);  }  state.Changed+=new ChangeNotificationEventHandler(…);  //注冊已調度的通知  ScheduledNotification daily;  if(ScheduledNotification.AppLaunchIdExists(″MyApp.Daily″))  {   daily=new ScheduledNotification(″MyApp.Daily″);  }  else  {   daily=new ScheduledNotification(DateTime.Now,new TimeSpan(24,0,0));   daily.EnableAppLaunch(″MyApp.Daily″);  }   daily.Occurred+=new EventHandler(…);]]></pre>上述說明,示例和數據提供了本發明的組成的制作和使用的完整描述。因為能在不脫離本發明的精神和范圍的情況下作出許多本發明的實施例,因此本發明蘊含在所附權利要求書中。
            權利要求
            1.一種用于響應于狀態屬性改變向客戶機提供通知的方法,其特征在于,它包括從客戶機接收一響應于與狀態屬性關聯的變化接收通知的通知請求;確保所述狀態屬性向通知系統注冊,其中,所述通知系統至少包括由設備中不同組件更新的部分狀態屬性;確定所述狀態屬性何時改變;確定所述客戶機何時應接收所述狀態屬性變化的通知;以及在確定之后向所述客戶機通知所述狀態屬性的變化。
            2.如權利要求1所述的方法,其特征在于,它還包括利用API來執行涉及所述狀態屬性的行動,其中,所述行動包括以下的至少一個注冊狀態屬性、查詢所述狀態屬性和設置所述狀態屬性。
            3.如權利要求2所述的方法,其特征在于,確定所述客戶機何時應接收所述通知包括對所述狀態屬性應用條件表達式,并在所述條件滿足時向所述客戶機通知所述狀態屬性的變化。
            4.如權利要求3所述的方法,其特征在于,所述條件表達式包括以下條件的至少一個所有、相等、不等、大于、大于等于、小于等于、小于、包含、以……開始和以……結束。
            5.如權利要求2所述的方法,其特征在于,它還包括響應于以下的至少一個起動所述客戶機狀態屬性改變和已排定事件。
            6.如權利要求2所述的方法,其特征在于,它還包括響應于由所述客戶機確定的時間表通知所述客戶機。
            7.如權利要求2所述的方法,其特征在于,確定所述狀態屬性何時改變還包括在發生在預定時間周期內的對所述狀態屬性的變化上執行分批處理操作。
            8.如權利要求1所述的方法,其特征在于,從所述客戶機接收響應于與所述狀態屬性關聯的變化而接收所述通知的通知請求還包括,當與所述請求關聯的標識符標識一類狀態屬性時,將一組狀態屬性與來自所述客戶機的所述通知請求關聯,其中,所述狀態屬性在所述通知系統中排列成層次結構。
            9.如權利要求2所述的方法,其特征在于,它還包括跨越設備的重啟而持久保存所述通知請求。
            10.一種用于狀態管理和通知的系統,其特征在于,它包括一數據存儲,被安排來存儲涉及狀態屬性的信息,其中,所述狀態屬性的至少部分由不同的組件修改;一API,被配置成執行涉及所述狀態屬性的操作;客戶機,被配置成注冊通知請求并響應于它們所注冊的狀態屬性的變化接收通知,其中,通知請求表明,響應于與所述狀態屬性關聯的變化,客戶機應當何時接收通知;一通知列表,被安排來存儲已注冊來接收通知請求的所述客戶機;一通知代理程序,耦合至所述數據存儲、所述通知列表和所述客戶機,其中,所述通知代理程序包括一被配置成執行以下行動的應用程序接收將至少一個客戶機添加到所述通知列表的通知請求;將所述至少一個客戶機添加到所述通知列表;以及確定注冊的狀態屬性何時改變,并且當所述狀態屬性改變時,確定要接收通知的客戶機,并向所確定的客戶機通知所述狀態屬性變化。
            11.如權利要求10所述的系統,其特征在于,所述API還被配置成執行以下行動的至少一個注冊狀態屬性、查詢所述狀態屬性和設置所述狀態屬性。
            12.如權利要求11所述的系統,其特征在于,確定要接收所述通知的客戶機包括向所述狀態屬性應用條件表達式,并在所述條件滿足時向所述客戶機通知所述狀態屬性。
            13.如權利要求12所述的系統,其特征在于,所述條件表達式包括以下條件的至少一個所有、相等、不等、大于、大于等于、小于等于、小于、包含、以……開始和以……結束。
            14.如權利要求11所述的系統,其特征在于,它還包括響應于狀態屬性變化和已排定事件的至少一個起動所述客戶機。
            15.如權利要求11所述的系統,其特征在于,它還包括響應于由所述客戶機確定的時間表通知所述客戶機。
            16.如權利要求11所述的系統,其特征在于,確定所述狀態屬性何時改變還包括在發生在預定時間周期內的對所述狀態屬性的變化上執行分批處理操作。
            17.如權利要求10所述的系統,其特征在于,所述狀態屬性被排列成一層次結構。
            18.如權利要求10所述的系統,其特征在于,所述數據存儲中的內容跨越設備重啟而持久保存。
            19.一種具有用于在狀態屬性上執行操作的計算機可執行指令的計算機可讀媒質,其特征在于,所述操作包括接收標識一組狀態參數中的至少一個狀態屬性的標識符參數,其中,所述狀態參數組中的某些狀態參數由設備中的不同組件更新;確定執行涉及所述狀態參數的操作;以及執行所述操作。
            20.如權利要求19所述的計算機可讀媒質,其特征在于,所述操作包括以下操作的至少一個注冊狀態屬性、查詢所述狀態屬性、將條件表達式與所述狀態參數關聯和設置所述狀態屬性。
            21.如權利要求20所述的計算機可讀媒質,其特征在于,執行所述操作包括向所述狀態屬性應用所述條件表達式,并在所述條件滿足時向所述客戶機通知所述狀態屬性。
            22.如權利要求21所述的計算機可讀媒質,其特征在于,所述條件表達式包括以下條件的至少一個所有、相等、不等、大于、大于等于、小于等于、小于、包含、以……開始和以……結束。
            23.如權利要求20所述的計算機可讀媒質,其特征在于,執行所述操作還包括響應于以下的至少一個起動客戶機應用程序所述狀態屬性變化和已排定事件。
            24.如權利要求20所述的計算機可讀媒質,其特征在于,執行所述操作還包括響應于由所述客戶機確定的時間表通知所述客戶機。
            25.如權利要求20所述的計算機可讀媒質,其特征在于,執行所述操作還包括在發生在預定時間周期間內的對所述狀態屬性的變化上執行分批處理操作。
            全文摘要
            描述了一種用于存儲設備、應用程序和服務狀的統一機制的方法和系統,以及一種豐富的通知代理體系結構。客戶機向通知代理程序注冊以接收對狀態屬性變化的通知。當注冊的狀態屬性改變時,通知代理程序確定向哪一客戶機通知狀態變化,并向客戶機提供關于該變化的通知。一旦狀態改變,當狀態改變滿足預定條件時,或根據時間表通知客戶機。響應于狀態改變也能裝入應用程序。提供了一種應用編程接口(API),它提供了一種在設備的不同組件之間訪問狀態改變信息的統一的方法。
            文檔編號G06F13/00GK1617501SQ20041008770
            公開日2005年5月18日 申請日期2004年10月22日 優先權日2003年10月23日
            發明者A·阿拉克, B·克羅斯, J·卡拉恰爾, J·W·福勒, R·里維, Z·科克, O·M·阿米加 申請人:微軟公司
            網友詢問留言 已有0條留言
            • 還沒有人留言評論。精彩留言會獲得點贊!
            1
            婷婷六月激情在线综合激情,亚洲国产大片,久久中文字幕综合婷婷,精品久久久久久中文字幕,亚洲一区二区三区高清不卡,99国产精品热久久久久久夜夜嗨 ,欧美日韩亚洲综合在线一区二区,99国产精品电影,伊人精品线视天天综合,精品伊人久久久大香线蕉欧美
            亚洲精品1区 国产成人一级 91精品国产欧美一区二区 亚洲精品乱码久久久久久下载 国产精品久久久久久久伊一 九色国产 国产精品九九视频 伊人久久成人爱综合网 欧美日韩亚洲区久久综合 欧美日本一道免费一区三区 夜夜爽一区二区三区精品 欧美日韩高清一区二区三区 国产成人av在线 国产精品对白交换绿帽视频 国产视频亚洲 国产在线欧美精品 国产精品综合网 国产日韩精品欧美一区色 国产日韩精品欧美一区喷 欧美日韩在线观看区一二 国产区精品 欧美视频日韩视频 中文字幕天天躁日日躁狠狠躁97 视频一二三区 欧美高清在线精品一区二区不卡 国产精品揄拍一区二区久久 99久久综合狠狠综合久久aⅴ 亚洲乱码视频在线观看 日韩在线第二页 亚洲精品无码专区在线播放 成人亚洲网站www在线观看 欧美三级一区二区 99久久精品免费看国产高清 91麻豆国产在线观看 最新日韩欧美不卡一二三区 成人在线观看不卡 日韩国产在线 在线亚洲精品 亚洲午夜久久久久中文字幕 国产精品成人久久久久久久 精品国产一区二区在线观看 欧美精品国产一区二区三区 中文在线播放 亚洲第一页在线视频 国产午夜精品福利久久 九色国产 精品国产九九 国产永久视频 久久精品人人做人人综合试看 国产一区二区三区免费观看 亚洲精品国产电影 9999热视频 国产精品资源在线 麻豆久久婷婷国产综合五月 国产精品免费一级在线观看 亚洲国产一区二区三区青草影视 中文在线播放 国产成人综合在线 国产在线观看色 国产亚洲三级 国产片一区二区三区 久久99精品久久久久久牛牛影视 亚洲欧美日韩国产 四虎永久免费网站 国产一毛片 国产精品视频在 九九热在线精品 99精品福利视频 色婷婷色99国产综合精品 97成人精品视频在线播放 精品久久久久久中文字幕 亚洲欧美一区二区三区孕妇 亚洲欧美成人网 日韩高清在线二区 国产尤物在线观看 在线不卡一区二区 91网站在线看 韩国精品福利一区二区 欧美日韩国产成人精品 99热精品久久 国产精品免费视频一区 高清视频一区 精品九九久久 欧美日韩在线观看免费 91欧美激情一区二区三区成人 99福利视频 亚洲国产精品91 久热国产在线 精品久久久久久中文字幕女 国产精品久久久久久久久99热 成人自拍视频网 国产精品视频久久久久久 久久影院国产 国产玖玖在线观看 99精品在线免费 亚洲欧美一区二区三区导航 久久久久久久综合 国产欧美日韩精品高清二区综合区 国产精品视频自拍 亚洲一级片免费 久久久久久九九 国产欧美自拍视频 视频一区二区在线观看 欧美日韩一区二区三区久久 中文在线亚洲 伊人热人久久中文字幕 日韩欧美亚洲国产一区二区三区 欧美亚洲国产成人高清在线 欧美日韩国产码高清综合人成 国产性大片免费播放网站 亚洲午夜综合网 91精品久久一区二区三区 国产无套在线播放 国产精品视频网站 国产成人亚洲精品老王 91在线网站 国产视频97 欧美黑人欧美精品刺激 国产一区二区三区免费在线视频 久久久国产精品免费看 99re6久精品国产首页 久久精品91 国产成人一级 国产成人精品曰本亚洲 日本福利在线观看 伊人成综合网 久久综合一本 国产综合久久久久久 久久精品成人免费看 久久福利 91精品国产91久久久久久麻豆 亚洲精品成人在线 亚洲伊人久久精品 欧美日本二区 国产永久视频 国产一区二 一区二区福利 国产一毛片 亚洲精品1区 毛片一区二区三区 伊人久久大香线蕉综合影 国产欧美在线观看一区 亚洲国产欧洲综合997久久 国产一区二区免费视频 国产91精品对白露脸全集观看 久久亚洲国产伦理 欧美成人伊人久久综合网 亚洲性久久久影院 久久99国产精一区二区三区! 91精品国产欧美一区二区 欧美日韩亚洲区久久综合 日韩精品一二三区 久久久夜色精品国产噜噜 国产在线精品福利91香蕉 久久久久久久亚洲精品 97se色综合一区二区二区 91国语精品自产拍在线观看性色 91久久国产综合精品女同我 日韩中文字幕a 国产成人亚洲日本精品 久久国产精品-国产精品 久久国产经典视频 久久国产精品伦理 亚洲第一页在线视频 国产精品久久久久三级 日韩毛片网 久久免费高清视频 麻豆国产在线观看一区二区 91麻豆国产福利在线观看 国产成人精品男人的天堂538 一区二区三区中文字幕 免费在线视频一区 欧美日韩国产成人精品 国产综合网站 国产资源免费观看 亚洲精品亚洲人成在线播放 精品久久久久久中文字幕专区 亚洲人成人毛片无遮挡 国产一起色一起爱 国产香蕉精品视频在 九九热免费观看 日韩亚洲欧美一区 九九热精品在线观看 精品久久久久久中文字幕专区 亚洲欧美自拍偷拍 国产精品每日更新 久久久久国产一级毛片高清板 久久天天躁狠狠躁夜夜中文字幕 久久精品片 日韩在线毛片 国产成人精品本亚洲 国产成人精品一区二区三区 九九热在线观看 国产r级在线观看 国产欧美日韩精品高清二区综合区 韩国电影一区二区 国产精品毛片va一区二区三区 五月婷婷伊人网 久久一区二区三区免费 一本色道久久综合狠狠躁篇 亚洲综合色站 国产尤物在线观看 亚洲一区亚洲二区 免费在线视频一区 欧洲精品视频在线观看 日韩中文字幕a 中文字幕日本在线mv视频精品 91精品在线免费视频 精品国产免费人成在线观看 精品a级片 中文字幕日本在线mv视频精品 日韩在线精品视频 婷婷丁香色 91精品国产高清久久久久 国产成人精品日本亚洲直接 五月综合视频 欧美日韩在线亚洲国产人 精液呈暗黄色 亚洲乱码一区 久久精品中文字幕不卡一二区 亚洲天堂精品在线 激情婷婷综合 国产免费久久精品久久久 国产精品亚洲二区在线 久久免费播放视频 五月婷婷丁香综合 在线亚洲欧美日韩 久久免费精品高清麻豆 精品久久久久久中文字幕 亚洲一区网站 国产精品福利社 日韩中文字幕免费 亚洲综合丝袜 91精品在线播放 国产精品18 亚洲日日夜夜 伊人久久大香线蕉综合影 亚洲精品中文字幕乱码影院 亚洲一区二区黄色 亚洲第一页在线视频 一区二区在线观看视频 国产成人福利精品视频 亚洲高清二区 国内成人免费视频 精品亚洲性xxx久久久 国产精品合集一区二区三区 97av免费视频 国产一起色一起爱 国产区久久 国产资源免费观看 99精品视频免费 国产成人一级 国产精品九九免费视频 欧美91精品久久久久网免费 99热国产免费 久久精品色 98精品国产综合久久 久久精品播放 中文字幕视频免费 国产欧美日韩一区二区三区在线 精品久久蜜桃 国产小视频精品 一本色道久久综合狠狠躁篇 91在线免费观看 亚洲精品区 伊人成综合网 伊人热人久久中文字幕 伊人黄色片 99国产精品热久久久久久夜夜嗨 久久免费精品视频 亚洲一区二区三区高清不卡 久久久久国产一级毛片高清板 国产片一区二区三区 久久狠狠干 99久久婷婷国产综合精品电影 国产99区 国产精品成人久久久久 久久狠狠干 青青国产在线观看 亚洲高清国产拍精品影院 国产精品一区二区av 九九热在线免费视频 伊人久久国产 国产精品久久久久久久久久一区 在线观看免费视频一区 国产精品自在在线午夜区app 国产精品综合色区在线观看 国产毛片久久久久久国产毛片 97国产免费全部免费观看 国产精品每日更新 国产尤物视频在线 九九视频这里只有精品99 一本一道久久a久久精品综合 久久综合给会久久狠狠狠 国产成人精品男人的天堂538 欧美一区二区高清 毛片一区二区三区 国产欧美日韩在线观看一区二区三区 在线国产二区 欧美不卡网 91在线精品中文字幕 在线国产福利 国内精品91久久久久 91亚洲福利 日韩欧美国产中文字幕 91久久精品国产性色也91久久 亚洲性久久久影院 欧美精品1区 国产热re99久久6国产精品 九九热免费观看 国产精品欧美日韩 久久久久国产一级毛片高清板 久久国产经典视频 日韩欧美亚洲国产一区二区三区 欧美亚洲综合另类在线观看 国产精品自在在线午夜区app 97中文字幕在线观看 视频一二三区 精品国产一区在线观看 国产欧美日韩在线一区二区不卡 欧美一区二三区 伊人成人在线观看 国内精品91久久久久 97在线亚洲 国产在线不卡一区 久久久全免费全集一级全黄片 国产精品v欧美精品∨日韩 亚洲毛片网站 在线不卡一区二区 99re热在线视频 久久激情网 国产毛片一区二区三区精品 久久亚洲综合色 中文字幕视频免费 国产视频亚洲 婷婷伊人久久 国产一区二区免费播放 久久99国产精品成人欧美 99国产在线视频 国产成人免费视频精品一区二区 国产不卡一区二区三区免费视 国产码欧美日韩高清综合一区 久久精品国产主播一区二区 国产一区电影 久久精品国产夜色 国产精品国产三级国产 日韩一区二区三区在线 久久97久久97精品免视看 久久国产免费一区二区三区 伊人久久大香线蕉综合电影网 99re6久精品国产首页 久久激情网 亚洲成人高清在线 国产精品网址 国产成人精品男人的天堂538 香蕉国产综合久久猫咪 国产专区中文字幕 91麻豆精品国产高清在线 久久国产经典视频 国产精品成人va在线观看 国产精品爱啪在线线免费观看 日本精品久久久久久久久免费 亚洲综合一区二区三区 久久五月网 精品国产网红福利在线观看 久久综合亚洲伊人色 亚洲国产精品久久久久久网站 在线日韩国产 99国产精品热久久久久久夜夜嗨 国产综合精品在线 国产区福利 精品亚洲综合久久中文字幕 国产制服丝袜在线 毛片在线播放网站 在线观看免费视频一区 国产精品久久久精品三级 亚洲国产电影在线观看 最新日韩欧美不卡一二三区 狠狠综合久久综合鬼色 日本精品1在线区 国产日韩一区二区三区在线播放 欧美日韩精品在线播放 亚洲欧美日韩国产一区二区三区精品 久久综合久久网 婷婷六月激情在线综合激情 亚洲乱码一区 国产专区91 97av视频在线观看 精品久久久久久中文字幕 久久五月视频 国产成人福利精品视频 国产精品网址 中文字幕视频在线 精品一区二区三区免费视频 伊人手机在线视频 亚洲精品中文字幕乱码 国产在线视频www色 色噜噜国产精品视频一区二区 精品亚洲成a人在线观看 国产香蕉尹人综合在线 成人免费一区二区三区在线观看 国产不卡一区二区三区免费视 欧美精品久久天天躁 国产专区中文字幕 久久精品国产免费中文 久久精品国产免费一区 久久无码精品一区二区三区 国产欧美另类久久久精品免费 欧美精品久久天天躁 亚洲精品在线视频 国产视频91在线 91精品福利一区二区三区野战 日韩中文字幕免费 国产精品99一区二区三区 欧美成人高清性色生活 国产精品系列在线观看 亚洲国产福利精品一区二区 国产成人在线小视频 国产精品久久久久免费 99re热在线视频 久久久久久久综合 一区二区国产在线播放 成人国产在线视频 亚洲精品乱码久久久久 欧美日韩一区二区综合 精品久久久久免费极品大片 中文字幕视频二区 激情粉嫩精品国产尤物 国产成人精品一区二区视频 久久精品中文字幕首页 亚洲高清在线 国产精品亚洲一区二区三区 伊人久久艹 中文在线亚洲 国产精品一区二区在线播放 国产精品九九免费视频 亚洲二区在线播放 亚洲狠狠婷婷综合久久久久网站 亚洲欧美日韩网站 日韩成人精品 亚洲国产一区二区三区青草影视 91精品国产福利在线观看 国产精品久久久久久久久99热 国产一区二区精品尤物 久碰香蕉精品视频在线观看 亚洲日日夜夜 在线不卡一区二区 国产午夜亚洲精品 九九热在线视频观看这里只有精品 伊人手机在线视频 91免费国产精品 日韩欧美中字 91精品国产91久久久久 国产全黄三级播放 视频一区二区三区免费观看 国产开裆丝袜高跟在线观看 国产成人欧美 激情综合丝袜美女一区二区 国产成人亚洲综合无 欧美精品一区二区三区免费观看 欧美亚洲国产日韩 日韩亚州 国产欧美日韩精品高清二区综合区 亚洲午夜国产片在线观看 精品久久久久久中文字幕 欧美精品1区 久久伊人久久亚洲综合 亚洲欧美日韩精品 国产成人精品久久亚洲高清不卡 久久福利影视 国产精品99精品久久免费 久久久久免费精品视频 国产日产亚洲精品 亚洲国产午夜电影在线入口 精品无码一区在线观看 午夜国产精品视频 亚洲一级片免费 伊人久久大香线蕉综合影 国产精品久久影院 久碰香蕉精品视频在线观看 www.欧美精品 在线小视频国产 亚洲国产天堂久久综合图区 欧美一区二区三区不卡 日韩美女福利视频 九九精品免视频国产成人 不卡国产00高中生在线视频 亚洲第一页在线视频 欧美日韩在线播放成人 99re视频这里只有精品 国产精品91在线 精品乱码一区二区三区在线 国产区久久 91麻豆精品国产自产在线观看一区 日韩精品成人在线 九九热在线观看 国产精品久久不卡日韩美女 欧美一区二区三区综合色视频 欧美精品免费一区欧美久久优播 国产精品网址 国产专区中文字幕 国产精品欧美亚洲韩国日本久久 日韩美香港a一级毛片 久久精品123 欧美一区二区三区免费看 99r在线视频 亚洲精品国产字幕久久vr 国产综合激情在线亚洲第一页 91免费国产精品 日韩免费小视频 亚洲国产精品综合一区在线 国产亚洲第一伦理第一区 在线亚洲精品 国产精品一区二区制服丝袜 国产在线成人精品 九九精品免视频国产成人 亚洲国产网 欧美日韩亚洲一区二区三区在线观看 在线亚洲精品 欧美一区二区三区高清视频 国产成人精品男人的天堂538 欧美日韩在线观看区一二 亚洲欧美一区二区久久 久久精品中文字幕首页 日本高清www午夜视频 久久精品国产免费 久久999精品 亚洲国产精品欧美综合 88国产精品视频一区二区三区 91久久偷偷做嫩草影院免费看 国产精品夜色视频一区二区 欧美日韩导航 国产成人啪精品午夜在线播放 一区二区视频在线免费观看 99久久精品国产自免费 精液呈暗黄色 久久99国产精品 日本精品久久久久久久久免费 精品国产97在线观看 99re视频这里只有精品 国产视频91在线 999av视频 亚洲美女视频一区二区三区 久久97久久97精品免视看 亚洲国产成人久久三区 99久久亚洲国产高清观看 日韩毛片在线视频 综合激情在线 91福利一区二区在线观看 一区二区视频在线免费观看 激情粉嫩精品国产尤物 国产成人精品曰本亚洲78 国产成人精品本亚洲 国产精品成人免费视频 国产成人啪精品视频免费软件 久久精品国产亚洲妲己影院 国产精品成人久久久久久久 久久大香线蕉综合爱 欧美一区二区三区高清视频 99热国产免费 在线观看欧美国产 91精品视频在线播放 国产精品福利社 欧美精品一区二区三区免费观看 国产一区二区免费视频 国产午夜精品一区二区 精品视频在线观看97 91精品福利久久久 国产一区福利 国产综合激情在线亚洲第一页 国产精品久久久久久久久久久不卡 九色国产 在线日韩国产 黄网在线观看 亚洲一区小说区中文字幕 中文字幕丝袜 日本二区在线观看 日本国产一区在线观看 欧美日韩一区二区三区久久 欧美精品亚洲精品日韩专 国产日产亚洲精品 久久综合九色综合欧美播 亚洲国产欧美无圣光一区 欧美视频区 亚洲乱码视频在线观看 久久无码精品一区二区三区 九九热精品免费视频 久久99精品久久久久久牛牛影视 国产精品成久久久久三级 国产一区福利 午夜国产精品视频 日本二区在线观看 99久久网站 国产亚洲天堂 精品国产一区二区三区不卡 亚洲国产日韩在线一区 国产成人综合在线观看网站 久久免费高清视频 欧美在线导航 午夜精品久久久久久99热7777 欧美久久综合网 国产小视频精品 国产尤物在线观看 亚洲国产精品综合一区在线 欧美一区二区三区不卡视频 欧美黑人欧美精品刺激 日本福利在线观看 久久国产偷 国产手机精品一区二区 国产热re99久久6国产精品 国产高清啪啪 欧美亚洲国产成人高清在线 国产在线第三页 亚洲综合一区二区三区 99r在线视频 99精品久久久久久久婷婷 国产精品乱码免费一区二区 国产在线精品福利91香蕉 国产尤物视频在线 五月婷婷亚洲 中文字幕久久综合伊人 亚洲精品一级毛片 99国产精品电影 在线视频第一页 久久99国产精品成人欧美 国产白白视频在线观看2 成人精品一区二区www 亚洲成人网在线观看 麻豆91在线视频 色综合合久久天天综合绕视看 久久精品国产免费高清 国产不卡一区二区三区免费视 欧美国产中文 99精品欧美 九九在线精品 国产中文字幕在线免费观看 国产一区中文字幕在线观看 国产成人一级 国产精品一区二区制服丝袜 国产一起色一起爱 亚洲精品成人在线 亚洲欧美精品在线 国产欧美自拍视频 99精品久久久久久久婷婷 久99视频 国产热re99久久6国产精品 视频一区亚洲 国产精品视频分类 国产精品成在线观看 99re6久精品国产首页 亚洲在成人网在线看 亚洲国产日韩在线一区 久久国产三级 日韩国产欧美 欧美在线一区二区三区 国产精品美女一级在线观看 成人午夜免费福利视频 亚洲天堂精品在线 91精品国产手机 欧美日韩视频在线播放 狠狠综合久久综合鬼色 九一色视频 青青视频国产 亚洲欧美自拍一区 中文字幕天天躁日日躁狠狠躁97 日韩免费大片 996热视频 伊人成综合网 亚洲天堂欧美 日韩精品亚洲人成在线观看 久久综合给会久久狠狠狠 日韩精品亚洲人成在线观看 日韩国产欧美 亚洲成aⅴ人片在线影院八 亚洲精品1区 99久久精品免费 国产精品高清在线观看 国产精品久久久免费视频 在线亚洲欧美日韩 91在线看视频 国产精品96久久久久久久 欧美日韩国产成人精品 91在线亚洲 热久久亚洲 国产精品美女免费视频观看 日韩在线毛片 亚洲永久免费视频 九九免费在线视频 亚洲一区网站 日本高清二区视频久二区 精品国产美女福利在线 伊人久久艹 国产精品久久久久三级 欧美成人精品第一区二区三区 99久久精品国产自免费 在线观看日韩一区 国产中文字幕一区 成人免费午夜视频 欧美日韩另类在线 久久99国产精品成人欧美 色婷婷中文网 久久天天躁夜夜躁狠狠躁2020 欧美成人伊人久久综合网 国产精品福利资源在线 国产伦精品一区二区三区高清 国产精品亚洲综合色区韩国 亚洲一区欧美日韩 色综合视频 国语自产精品视频在线区 国产高清a 成人国内精品久久久久影 国产在线精品香蕉综合网一区 国产不卡在线看 国产成人精品精品欧美 国产欧美日韩综合精品一区二区三区 韩国电影一区二区 国产在线视频www色 91中文字幕在线一区 国产人成午夜免视频网站 亚洲综合一区二区三区 色综合视频一区二区观看 久久五月网 九九热精品在线观看 国产一区二区三区国产精品 99久热re在线精品996热视频 亚洲国产网 在线视频亚洲一区 日韩字幕一中文在线综合 国产高清一级毛片在线不卡 精品国产色在线 国产高清视频一区二区 精品日本久久久久久久久久 亚洲国产午夜精品乱码 成人免费国产gav视频在线 日韩欧美一区二区在线观看 欧美曰批人成在线观看 韩国电影一区二区 99re这里只有精品6 日韩精品一区二区三区视频 99re6久精品国产首页 亚洲欧美一区二区三区导航 欧美色图一区二区三区 午夜精品视频在线观看 欧美激情在线观看一区二区三区 亚洲热在线 成人国产精品一区二区网站 亚洲一级毛片在线播放 亚洲一区小说区中文字幕 亚洲午夜久久久久影院 国产自产v一区二区三区c 国产精品视频免费 久久调教视频 国产成人91激情在线播放 国产精品欧美亚洲韩国日本久久 久久亚洲日本不卡一区二区 91中文字幕网 成人国产在线视频 国产视频91在线 欧美成人精品第一区二区三区 国产精品福利在线 久久综合九色综合精品 欧美一区二区三区精品 久久国产综合尤物免费观看 久久99青青久久99久久 日韩精品免费 久久国产精品999 91亚洲视频在线观看 国产精品igao视频 色综合区 在线亚洲欧国产精品专区 国产一区二区三区在线观看视频 亚洲精品成人在线 一区二区国产在线播放 中文在线亚洲 亚洲精品第一国产综合野 国产一区二区精品久久 一区二区三区四区精品视频 99热精品久久 中文字幕视频二区 国产成人精品男人的天堂538 99精品影视 美女福利视频一区二区 久久午夜夜伦伦鲁鲁片 综合久久久久久久综合网 国产精品国产欧美综合一区 国产99视频在线观看 国产亚洲女在线精品 婷婷影院在线综合免费视频 国产亚洲3p一区二区三区 91成人爽a毛片一区二区 亚洲一区二区高清 国产欧美亚洲精品第二区首页 欧美日韩导航 亚洲高清二区 欧美激情观看一区二区久久 日韩毛片在线播放 亚洲欧美日韩高清中文在线 亚洲日本在线播放 国产精品一区二区制服丝袜 精品国产一区二区三区不卡 国产不卡在线看 国产欧美网站 四虎永久在线观看视频精品 国产黄色片在线观看 夜夜综合 一本色道久久综合狠狠躁篇 欧美亚洲综合另类在线观看 国产91在线看 伊人久久国产 欧美一区二区在线观看免费网站 国产精品久久久久三级 久久福利 日韩中文字幕a 亚洲午夜久久久久影院 91在线高清视频 国产亚洲一区二区三区啪 久久人精品 国产精品亚洲午夜一区二区三区 综合久久久久久 久久伊人一区二区三区四区 国产综合久久久久久 日韩一区精品视频在线看 国产精品日韩欧美制服 日本精品1在线区 99re视频 无码av免费一区二区三区试看 国产视频1区 日韩欧美中文字幕一区 日本高清中文字幕一区二区三区a 亚洲国产欧美无圣光一区 国产在线视频一区二区三区 欧美国产第一页 在线亚洲欧美日韩 日韩中文字幕第一页 在线不卡一区二区 伊人久久青青 国产精品一区二区在线播放 www.五月婷婷 麻豆久久婷婷国产综合五月 亚洲精品区 久久国产欧美另类久久久 99在线视频免费 伊人久久中文字幕久久cm 久久精品成人免费看 久久这里只有精品首页 88国产精品视频一区二区三区 中文字幕日本在线mv视频精品 国产在线精品成人一区二区三区 伊人精品线视天天综合 亚洲一区二区黄色 国产尤物视频在线 亚洲精品99久久久久中文字幕 国产一区二区三区免费观看 伊人久久大香线蕉综合电影网 国产成人精品区在线观看 日本精品一区二区三区视频 日韩高清在线二区 久久免费播放视频 一区二区成人国产精品 国产精品免费精品自在线观看 亚洲精品视频二区 麻豆国产精品有码在线观看 精品日本一区二区 亚洲欧洲久久 久久中文字幕综合婷婷 中文字幕视频在线 国产成人精品综合在线观看 91精品国产91久久久久福利 精液呈暗黄色 香蕉国产综合久久猫咪 国产专区精品 亚洲精品无码不卡 国产永久视频 亚洲成a人片在线播放观看国产 一区二区国产在线播放 亚洲一区二区黄色 欧美日韩在线观看视频 亚洲精品另类 久久国产综合尤物免费观看 国产一区二区三区国产精品 高清视频一区 国产精品igao视频 国产精品资源在线 久久综合精品国产一区二区三区 www.五月婷婷 精品色综合 99热国产免费 麻豆福利影院 亚洲伊人久久大香线蕉苏妲己 久久电影院久久国产 久久精品伊人 在线日韩理论午夜中文电影 亚洲国产欧洲综合997久久 伊人国产精品 久草国产精品 欧美一区精品二区三区 亚洲成人高清在线 91免费国产精品 日韩精品福利在线 国产一线在线观看 国产不卡在线看 久久99青青久久99久久 亚洲精品亚洲人成在线播放 99久久免费看国产精品 国产日本在线观看 青草国产在线视频 麻豆久久婷婷国产综合五月 国产中文字幕一区 91久久精品国产性色也91久久 国产一区a 国产欧美日韩成人 国产亚洲女在线精品 一区二区美女 中文字幕在线2021一区 在线小视频国产 久久这里只有精品首页 国产在线第三页 欧美日韩中文字幕 在线亚洲+欧美+日本专区 精品国产一区二区三区不卡 久久这里精品 欧美在线va在线播放 精液呈暗黄色 91精品国产手机 91在线免费播放 欧美视频亚洲色图 欧美国产日韩精品 日韩高清不卡在线 精品视频免费观看 欧美日韩一区二区三区四区 国产欧美亚洲精品第二区首页 亚洲韩精品欧美一区二区三区 国产精品视频免费 在线精品小视频 久久午夜夜伦伦鲁鲁片 国产无套在线播放 久热这里只精品99re8久 欧美久久久久 久久香蕉国产线看观看精品蕉 国产成人精品男人的天堂538 亚洲人成网站色7799在线观看 日韩在线第二页 一本色道久久综合狠狠躁篇 国产一区二区三区不卡在线观看 亚洲乱码在线 在线观看欧美国产 久久福利青草精品资源站免费 国产玖玖在线观看 在线亚洲精品 亚洲成aⅴ人在线观看 精品91在线 欧美一区二三区 日韩中文字幕视频在线 日本成人一区二区 日韩免费专区 国内精品在线观看视频 久久国产综合尤物免费观看 国产精品系列在线观看 一本一道久久a久久精品综合 亚洲免费播放 久久精品国产免费 久久人精品 亚洲毛片网站 亚洲成a人一区二区三区 韩国福利一区二区三区高清视频 亚洲精品天堂在线 一区二区三区中文字幕 亚洲国产色婷婷精品综合在线观看 亚洲国产成人久久笫一页 999国产视频 国产精品香港三级在线电影 欧美日韩一区二区三区四区 日韩国产欧美 国产精品99一区二区三区 午夜国产精品理论片久久影院 亚洲精品中文字幕麻豆 亚洲国产高清视频 久久免费手机视频 日韩a在线观看 五月婷婷亚洲 亚洲精品中文字幕麻豆 中文字幕丝袜 www国产精品 亚洲天堂精品在线 亚洲乱码一区 国产日韩欧美三级 久久999精品 伊人热人久久中文字幕 久热国产在线视频 国产欧美日韩在线观看一区二区三区 国产一二三区在线 日韩国产欧美 91精品国产91久久久久 亚洲一区小说区中文字幕 精品一区二区免费视频 国产精品视频免费 国产精品亚洲综合色区韩国 亚洲国产精品成人午夜在线观看 欧美国产日韩精品 中文字幕精品一区二区精品