專利名稱:向應用程序通知狀態變化的靈活體系結構的制作方法
相關申請本實用專利要求序號為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·阿米加 申請人:微軟公司