详细说明
例子1-示范性系统概述
图3A显示示范性系统300,通过该系统,将用于共享资源306的通知316导向适当的客户326。例如,可以根据和通知316相关的特性以及与客户326相关的特性的比较前传通知316到客户326。虽然仅显示一个共享资源306,一个通知316和一个客户326,在实际应用中,一个系统可以包括多个资源306,多个通知316,多个客户326,或它们的组合。
例子2-另一个示范性系统概述
图3B显示示范性系统330,通过该系统,从一个或多个共享资源332发送一个或多个通知到通知服务器334,通知服务器334发送至少一个该通知的指示(例如前传通知)到一个或多个客户340A,340B。在通知前传中还可以涉及其他中介物,通知服务器控制(例如运行在相同程序)共享资源或客户。
在该例中,通知服务器334包括涉及并考虑何时从共享资源332接收注册的发送者注册336。类似的,接收者注册338A和客户340A相关,并参考注册338A确定接收的通知是否和客户340A匹配并被前传到客户340A。类似的,接收者注册338A和客户340B相关。
注册336,338A,338B分别包括特性337,339A,339B。可将发送者特性337和接收者特性339A,339B比较以确定是否存在匹配以控制通知路由。可用多种方式定义匹配,例如特性的子集是否相同。某些特性可被定义为匹配任何值。
例子3-另一个示范性系统概述
图3C显示另一个示范性系统350,通过该系统发送通知到客户。在示范性系统350中,一个或多个客户352,354使用一个或多个服务器356,358来访问一个或多个共享资源357,359(例如通过请求360,362)。此外,客户352可向通知服务器364注册为接收者以创建接收者注册366,服务器356可向通知服务器364注册为发送者,以创建发送者注册368。
在该例中,当具有发送者注册368的共享资源服务器356产生通知时,在通知服务器364的滤波器方法370确定是否存在接收该通知指示的客户注册。例如,如果滤波器370确定注册用于通知的客户和接收者注册366特性匹配,客户352具有用于在特定服务器356的共享资源的相关接收者注册366,并接收该通知指示。
在该例中,图3C显示的实体(例如,客户352,354,服务器356,358,以及通知服务器364)不是依赖地址空间处理的。例如,实体可以是运行在相同处理空间内的目标,运行在相同处理空间内的线程,或运行在网络内不同机器上不同处理空间内的分离的处理。本方案还可以包括共享和分离处理或地址空间的置换和组合。在任何例子中,共享资源,客户,或服务器可以是程序、处理、线程、组件(例如在目标模型中)、复合程序、复合组件(例如动态连接或封装)等。
例子4-示范性共享资源
在任何例子中,一个或多个服务器可以提供一个或多个客户到一个或多个共享资源的访问。示范性共享资源包括文件服务,邮件服务,打印服务或任何其他共享应用程序、程序或服务。
虽然例如打印机的物理装置有时被称为共享资源,通常存在合适的软件对应物(例如打印队列)。
在任何例子中,共享资源可以本地运行或在相关服务器外部运行。例如一个服务器可能容纳多个共享资源的运行。
例子5-打印方案中的示范性共享资源
在应用到任何例子的示范性打印机方案中,打印假脱机程序可用作运行在控制台会话(即“0”)内终端服务器环境中的通知服务器,共享资源可以是由通知服务器控制的打印机驱动程序。
在这样的方案中,打印假脱机程序/通知服务器为假脱机程序控制的组件,例如打印驱动器、打印处理器、或打印监测器提供发送通知到(并从那里接收应答)运行在不同会话和安全环境内的应用程序的方法。从而,运行在假脱机程序处理内的打印组件可以发送用户接口通知到会话或环境,正是从这里开始了打印作业。还可以采用该方案用于发送通知到任何注册的客户/组件,而不管该客户/组件在假脱机程序地址空间之内或之外。
在另一方案中,打印处理器手动双向组件可以是共享资源,并使用通知系统发送通知到客户组件,从而显示用户接口,告诉用户翻转页面。在另一个方案中,驱动器自动配置组建可以是共享资源,并使用通知系统更新驱动器满载(rich)状态。在另一个方案中,传真组件可以是共享资源,并使用通知系统发送接收到传真的通知。
例子6-示范性接收者和发送者特性
接收者和发送者特性可采取多种形式。在一个实施方案中,至少一个识别环境特性和通知有关。和通知相关的识别环境特性(例如通过注册)然后可以和那些用于潜在接收者(如果存在)(例如那些和用于接收者的注册相关的)的特性比较,以寻找匹配。
识别环境特性可包括用户识别符,安全环境识别符(例如安全id或“SID”),会话识别符(例如终端服务器会话识别或快速用户交换会话识别),或它们的组合。
终端会话识别符可包括一个或多个足以识别其他会话中的会话的识别符。在某些例子中,这样一个识别符可以区别多个终端服务器上的多个会话。
另一个示范性接收者和发送者特性可用于代替或添加到识别环境特性,包括通知类型(例如全球唯一识别符,消息格式识别符,类型版本编号,类型期满日期等),通信类型或协议类型(例如双向信道,单向信道,异步消息等),处理识别符,共享资源识别符,机器识别符,网络位置信息,另一个识别或网络拓扑识别符,其他消息路由或识别信息,或它们的组合。
通过指定适当特性,接收者可以规定他想要接收的通知。在某些例子中,可由发送者/接收者规定特性,但在另一些例子中(例如当指定用户识别符或会话时),可从发送者/接收者收集、或验证或收集、验证特性。
例子7-处理通知的方法的示范性概述
图4A显示用于实现发送通知的示范性方法400。在此显示的该方法和任何其他方法可用计算机可执行指令的软件实现。
在402,从共享资源接收通知。在422,根据并响应该通知,根据特性(例如发送者和接收者的)比较结果,发送至少通知的指示(例如前传通知)到适当的客户。可以在例如注册发送者(例如共享资源或服务器)和接收者(例如该服务器或共享资源的客户)期间确定这样的特性。
422的发送通知可以包括或和402(例如前传通知)的接收通知相同形式或不同形式。图4A所示动作可由通知服务器或其他软件执行。
例子8-涉及注册的示范性方法
图4B显示用于实现经注册发送通知的示范性方法405。在456,注册(例如向通知服务器)发送者(例如服务器或其他共享资源)用于发送作为注册请求结果的通知。在实际应用中,这样的注册请求由想要发送通知的实体(例如服务器或其他共享资源)发送,但可代表发送者执行注册(例如由用于共享资源的服务器)。
发送者注册可包括获得发送者特性,可在注册请求中提供(例如经过参数)或以某些其他方式(例如通过确定关于请求源的信息)确定发送者特性。发送者特性可以指在此描述的任何示范性发送者特性。
发送者注册可包括将发送者特性和发送者相连。在一个例子中,创建发送者注册组件,在容纳特性和与该发送者(例如经过识别符)相关的发送者识别符(例如共享资源识别符)的组件(例如作为数据结构)内包含该联系。
在458,接收者(例如客户)进行注册(例如注册到通知服务器上),用于接收作为注册请求结果的注册。在实际应用中,由接收者发送这样的注册请求,但也可代表接收者执行注册。
接收者注册可包括获得接收者特性,可在注册请求本身(例如经过参数)或以某些其他方式(例如通过确定关于请求源的信息)确定接收者特性。接收者特性可以指在此描述的任何示范性接收者特性。
接收者注册可包括将接收者特性和接收者相连。在一个例子中,创建接收者注册组件,在该组件(例如作为数据结构)中存储特性,并将该特性和接收者(例如通过识别符)相联系。
在460,接收到(例如从)用于共享资源的通知。在任何例子中,通知可包括由共享资源发送的目标的指示。该目标可代表通知并包括用于通知的数据。
响应接收到通知,该方法在466比较发送者特性(例如由共享资源发送通知注册)和注册的接收者特性。在468,至少发送(例如前传该通知)该通知的一个指示到,如果有,一个或多个具有和注册发送者特性匹配的注册接收者特性的接收者(例如客户)。
某些具有特许权的客户(例如由管理员运行的组件)可以注册特定类型的通知,或注册发送到其他用户的通知。在此例子中,可以规定特性之间的匹配,从而适当的发送者特性(例如用户识别符)对于任何用于相同特性(例如任何用户)的任何值或特定值(例如特定用户)都是匹配的。
还可以允许具有特许权的用户创建注册,以使某些组件接收某种通知(例如,用于其他会话的通知),甚至客户组件自身没有此种通知的注册特性。
如果期望,可以关闭注册,或可以发送额外的通知。在474,关闭发送者注册。在478,关闭接收者注册。
虽然在附图中没有明确显示,在某些方案中,在接收不同请求之间,本方法可在等待状态中。如果期望,动作的顺序(例如456/478和474/478)可以重新排列或是相反的。从而可以支持异步操作。
例子9-在打印方案中涉及注册的示范性方法
图4b显示的方法可以用在不同的打印方案中。在一个方案中,当运行在客户组件安全环境中时,客户组件注册由打印驱动器组件创建的通知。在另一个方案中,客户组件注册由运行在某个终端会话(例如和客户的终端会话相同的会话)中的打印监测器组件创建的通知。在另一个方案中,客户组件注册某种通知类型的假脱机程序通知。
这样,可为客户提供期望的通知。客户可运行在作为打印服务器的相同机器上或不同机器上。客户机器可以是终端服务器,在此用户远程连接到终端服务器会话。
例子10-示范性客户注册和通知方法
图5显示由注册接收者特性用于从通知服务器接收通知的客户程序实施的示范性方法500。在一个方案中,客户和运行在终端服务器内的会话相联系。在另一个方案中,客户和多个用户(例如用户状态)之一相联系,其中这些用户可以在计算机环境的登录和注销之间切换。
在502,客户向通知服务器注册一个或多个接收者特性。接收者特性可从客户经参数或其他方式(例如通过确定客户正运行何种会话)获得。如上所述,代表管理员运行的组件可具有额外的功能。然后客户可以继续其他处理任务,直至从通知服务器接收到匹配注册特性的通知。
在504,客户接收到通知。这样的一个通知可根据客户注册特性和与该通知相关的特性(例如,注册通知的发送者)之间的匹配被前传到客户来发起。
在506,当接收到通知时,客户处理该通知。在该例中,客户组件产生用于显示的用户接口图像(例如对话框或某些其他图形用户接口元素)。例如,用户接口图像可指示共享资源(例如给用户呈现错误条件以校正错误)的条件。但是,通过指定适当的功能,其他处理是可能的。
在一个方案中,位于接收者特性内或位于通知目标自身内具有通知类型识别符(例如全球单独识别符)的客户组件标识适当的用户接口。在涉及运行在终端服务器会话内的客户的例子中,可在远程终端呈现产生的用户接口。
可以执行接收504和处理506的多个重复操作。如果期望,并且没有来自通知服务器的更进一步的通知,客户可以请求通知服务器在512关闭注册接收者特性。可通过重新注册接收到额外的通知。在一个方案中,客户处理其他计算任务,组件的生命周期不是由客户多长时间注册以从任何一个共享资源接收通知来限定的。
例子11-示范性共享资源注册和通知方法
图6显示由共享资源实现的用于注册发送通知的发送者特性的示范性方法600。在一个方案中,共享资源是运行在打印假脱机程序的打印组件。在另一个方案中,假脱机程序是控制打印组件共享资源的通知服务器。在另一个方案中,共享资源是运行在由若干用户共享的计算机上的打印驱动器,用户可在登录和注销的用户状态之间切换。共享资源通常提供资源给多个注册来自通知服务器的通知的请求客户。
在602,共享资源向通知服务器注册一个或多个发送者特性。发送者特性可从共享资源(例如通过参数)或其他方式获得(例如通过确定共享资源正运行那个会话)。
在604,共享资源发送通知到通知服务器。前传通知到一个或多个具有适当注册特性的客户可以结束这样的通知。可经发送604的重复操作发送多于一个的通知。
如果期望,并且没有要发送的进一步的通知,该方法在610关闭向通知服务器的注册。可通过重新注册发送额外的通知。
例子12-获得发送者/接收者特性的示范性技术
在任何例子中,存储用于注册的发送者/接收者特性可以多种方式获得。例如,可将特性作为参数在注册接收者或发送者的呼叫中传送。
然而,在某些例子中,从不是呼叫客户的源获得特性可能是有利的。例如,可从关于来自客户(例如,注册接收者或发送者的呼叫)或客户主叫用户(例如注册主叫用户)的呼叫信息中获得该信息。还可从系统服务(例如安全或RPC服务)中收集这样的信息。例如,在识别环境特性的例子中,也可以获得这样的特性。
在会话识别符的例子中,呼叫通知服务(例如通知服务器)的客户可以指定他希望注册用于和他运行的相同会话的通知。可通过获得关于注册呼叫或注册主叫用户(例如来自RPC子系统)的信息确定该会话。用户识别符或安全环境也可使用类似方法。
当用于请求服务的呼叫被注册发送者(例如共享资源或服务器控制的共享资源)接收时,可以存储(例如在存储器中)关于客户呼叫或呼叫客户的信息,以备稍后检索。例如,当共享资源随后期望注册为发送者时,它可以指定使用这样的存储特性。这样,共享资源可以指定它希望注册来发送通知到共享资源正在其上运行的相同会话。
还可以从其它源收集特性,例如安全环境。例如,安全环境可指示系统服务正执行哪个用户(例如服务正体现哪个用户)。
此外,从注册呼叫或注册主叫用户收集信息可以提供额外的安全,因为可将其用于确保主叫用户确实指定了他希望收听来自另一会话、用户或安全环境的通知。在某些例子中(例如对于和管理权相联系的呼叫),这样的方案是可以接受的,但在其他的中,允许这样的窃听可能是对安全和隐私不期望的违背。
例子13-具有注册的示范性系统概述
在图7显示示范通知系统700。在方案700中,一个或多个客户702,704使用一个或多个服务器706,708,其中该服务器提供一个或多个共享资源给客户。在该例中,多个客户702,704请求来自多个提供共享资源的服务器706,708的服务。此外,客户704经接收者注册716,718向通知服务器720注册它自己,服务器706经发送者注册722向通知服务器720注册自己,另一个服务器708经发送者注册724向通知服务器注册自己。在本方案中,当具有注册722的服务器706产生通知时,通知服务器720比较存储用于注册722的特性和存储用于注册718,716,726的特性,以确定是否可以发送该消息的指示到0个或多个客户。
在例子中,通知服务器720控制一个服务器706并支持具有相关注册724的远程服务器708。在另一个方案中,通知服务器控制多个服务器,支持多个远程服务器或控制并支持多个服务器。在本例中,客户704具有若干接收者注册716,718。这样的多个客户注册可用于(1)从相同服务器接收不同类型的通知,(2)从由相同服务器控制的多个不同共享服务接收多个不同通知,(3)从相同通知服务器控制的多个服务器接收通知,(4)从多个服务器控制的共享资源接收多个通知,或它们的组合。
虽然没有显示,服务器可以在相同通知服务器注册多个发送者注册,例如,发送不同通知类型的通知,或发送来自服务器控制的多个共享资源的通知。此外,服务器可在多个通知服务器(没有显示)注册为发送者,例如,当共享服务器为之提供资源的客户被期望在潜在的不同通知服务器注册为接收者时。
例子14-示范性终端服务器通知系统
另一个用于终端服务器环境中的示范性通知系统800显示在图8中。在系统800中,终端服务器814执行多个会话802,804,806以及控制服务器820(例如提供共享资源)的通知服务器822。通知服务器822可选的在终端服务器814之外执行。
当用户登录终端服务器启动的计算机时,开始用户会话。对该会话的处理执行和单独的会话识别符相关。特定会话识别符(即“0”)和控制台有关,用于控制台会话802的用户接口通常本地显示。某种会话(例如打印之类的系统服务)的处理执行和控制台相关,甚至代表另一个会话执行。
在该例中,远程用户从远程终端810通过网络816登录到终端服务器,并在分配了会话识别符“1”的会话804(例如处理)中完成了处理。另一个远程用户从远程终端812通过到终端服务器814的专用连接登录到终端服务器,并在分配有会话识别符“2”的会话806(例如处理)中完成处理。在此终端服务器方案中,在终端服务器814上执行的多个客户会话802,804,806访问818共享资源820。在该例中,共享资源820由通知服务器822控制。
会话802,804,806可创建接收者注册830来接收适当的通知(例如用于会话注册的通知)。当接收到创建注册的请求时,可以确定(例如,通过RPC子系统)来自请求发起方的会话。这样,可以防止会话注册来自其他会话(例如在其他会话上窃听)的通知,除非该注册是创建用于管理员的。同样,会话可以指定它希望接收用于相同用户的通知,而不考虑会话。再次的,可以确定和请求相关的用户,从而防止注册用于其他用户的通知,除非为管理员创建该注册。
随后,当会话处理访问服务器820,和服务器820相关的共享资源可能希望产生通知。可以预先创建或在发送通知时创建适当的发送者注册826。然后经注册826发送通知。
如果服务器820或共享资源和控制台802(例如它是系统服务)相关,可代表另一会话804,806启动它。当会话进行到服务器820的呼叫时,可以存储(例如在线程本地存储器中)和开始呼叫的会话相关的会话识别符。然后通过获得关于呼叫的信息来确定该会话。随后,当和服务器820相关的共享资源想要注册为发送者时,通过参考存储的识别符,将适当的会话识别符和该发送者注册相联系。这样,共享资源可以发送通知到启动它的会话,而不是发送到控制台。
当从任何一个用于服务器820的共享资源接收到通知时,通知服务器822比较在发送者注册826中用于共享资源820的注册特性和由会话向接收者注册830注册的特性,从而确定是否前传该通知的指示到具有匹配接收者特性的注册会话。例如,如果接收者注册表明期望和作为接收者的相同会话相关的通知,则发送此种通知。或者,如果接收者注册表明期望和作为接收者的相同用户相关的通知,则发送此种通知。
这允许多个客户会话共享共享资源,并当它产生通知时仍然接收通知,而不管共享资源正执行哪个会话。例如,会话804通过发送适当请求到服务器820提供的相关共享资源(例如用于外部资源的服务器),请求由外部资源828执行的任务。随后,发送消息到和会话804相关的用户接口810,请求共享资源而不是会话“0”控制台。
在某些例子中,这样的方法可以提供增强的安全性。例如,如果会话804的用户不希望其他人知道和外部资源828相关的活动,发送有关资源828的消息到控制台,用户接口808可以是安全或隐私必不可少的。进一步的,如果发送该消息到控制台而不是开始处理的用户,则控制台用户接口808的用户在某些例子中可被提供和处理相关的选项(例如取消或删除处理)。通过能呈现消息给开始处理的用户接口808,可以提供增强的安全性和隐私。
例子15-在打印环境中的示范性终端服务器通知系统
图8显示的示范性通知系统800可用于打印环境中,在终端服务器环境中路由和打印相关的消息到适当的用户或会话。
例如,当开始新会话804时,创建用于外壳(例如桌面)的接收者注册824,指示该外壳希望接收任何用于和打印(例如,通过指定指示打印通知的通知类型)相关的会话的消息。
随后,当开始打印(例如通过用户请求)时,激活打印服务器820并运行在会话0中。然而,激活打印服务代表不同的会话804,和激活会话804相关的识别符可以存储在存储器(例如线程本地存储器)中。
外部资源828可以是发送消息(例如无纸通知)到打印机服务820(例如包括打印驱动器)的打印机,从而指示打印机无纸。打印机服务820可创建发送者注册826,并发送和打印(例如通过指定指示打印通知的通知类型)相关的通知。该通知表明用于会话804的打印被启动了(例如通过检索存储的会话识别符)。该通知可包括图形消息的指示(例如,“打印机无纸”GUI),前传该通知到适当的接收者(例如用于启动打印的相同会话)。
然后会话处理通知,以发送适当的用户接口(例如对话框)到和请求共享资源(例如打印作业)的会话804而不是会话“0”控制台相关的用户接口810。在正确的会话用户接口上显示用户接口图像。
如果希望,可通过以下描述的特点实现双向通信。这样,用户可以选择选项,该选项可被传送回通知始发者820。
例子16-用于交换用户方案的示范性多会话通知系统
在图9中显示用在交换用户方案中的示范性通知系统900。在例子900中,计算机902执行当前会话904,并具有为其他会话906,908保存的状态。用户可以通过激活切换命令(例如通过指示光标或键盘动作)切换到另一个活动会话906,908。在实际应用中,每个会话都和不同用户名相关,但切换可在不注销当前用户下完成。
当计算机产生使用共享资源912,916的新的会话时,会话904,906,908创建适当的注册922以接收通知(例如和它的会话相关的)。如图所示,共享资源912,916对会话904,906,908可用。如果共享资源912,916希望发送通知到任何会话904,906,908之一(例如激活它的会话),共享资源912,916创建适当的发送者注册918,920。当共享资源产生消息时,通知服务器914确定共享资源918,920注册的特性是否和会话922(例如会话时别符是否匹配)注册的特性匹配。如果是,前传通知的指示(例如通知自身)到对应会话904,906,908。
例如,活动会话可请求访问共享数据库资源,然后变为无效的(例如,计算机902切换到另一用户)。数据库然后产生导致无效会话的用户接口通知消息的通知。在此事件中,通知服务器从注册特性确定该消息(例如通知)不应当被传递到当前活动会话,而应当传送到当前无效会话,并这样做。下次预定会话变为活动,并显示在活动显示910中,重新激活的会话显示该消息的指示。
例子17-示范性滤波器
图10显示示范性通知服务器1000。在该例中,客户(未示出)创建接收者注册1002以接收来自共享资源的通知,共享资源(未示出)创建发送者注册1004,以发送通知到注册接收者。在在此描述的任何例子中,当共享资源产生了通知时,可使用滤波器1006确定该通知是否匹配用于对应接收者注册的特性。滤波器考虑的特性可包括在此描述的任何接收者或发送者特性。
可用多种方式规定匹配。例如,如果特性的子集相同可以规定两个注册匹配。匹配可基于至少一个识别环境特性(例如注册是否具有相同特性)。在某些例子中,任何特性都可被考虑为匹配。例如,注册可表示前传在任何会话中用于特定用户的通知。在任何会话中用于该用户的注册在此情况下可被认为匹配。
在一个方案中,客户组件可指定他对所有通知类型感兴趣(例如通过指定用于接收者注册的“空”通知类型)。滤波器然后前传所有类型的通知到注册接收者。
此外,某些特性可以影响注册和相关通知的行为。例如,发送者注册特性(例如通知类型)可以表明接收者怎样处理接收的通知,并影响接收者怎样注册通知。例如,在注册期间,当建立接收者注册(例如通过和发送者注册协商何种类型的通知是可用或期望的)时,客户可使用此种信息。通信类型特性可以指示客户和共享资源之间的通信是双向的还是单向的。通知类型特性指示通知类型,是否期望共享资源的应答或指示二者。通知类型特性还可用于识别处理通知的逻辑。
在一个方案中,客户以客户安全环境识别符的形式注册接收者特性。可通过检查来自客户的呼叫(例如通过远程程序呼叫“RPC”子系统)来确定安全环境识别符。当共享资源接受来自客户的服务请求,共享资源可运行在客户的安全环境(例如经体现)中。当共享资源产生通知时,该通知和安全环境(例如安全环境识别符)相联系,在此环境中运行共享资源(例如通过包括消息中的识别符或当共享资源呼叫注册时确定该识别符)。在此方案中,因为共享资源的安全环境和请求服务的客户的安全环境匹配,前传通知的指示到客户。
客户可使用通知来产生代表通知的屏幕上的用户接口。在一个这样的例子中,客户使用包含在消息内的通知类型来识别显示正确消息的程序(例如通过指定动态链路库“DLL”)。代表通知的屏幕上的接口可在和客户相连的终端上显示,不管该终端是本地还是远程。
体现是线程在不同于拥有线程的处理的安全环境的线程安全环境中执行的能力。当运行在客户安全环境中时,服务器好像是客户。这允许相对于客户识别符执行存储检验。基于客户许可级别,使用客户识别符进行存取检验可使存取受限或扩展。
在另一个方案中,客户以客户安全环境和终端会话识别符的形式注册接收者特性。可根据来自客户(例如经过RPC子系统)的呼叫获得该特性。在这样的方案中,当共享资源接受来自客户的服务请求时,共享资源运行在客户的安全环境中。然而,分配的会话可能是控制台会话。从而,可存储呼叫客户的会话识别符以备后面检索。
随后,当共享资源产生通知时,通知消息和/或用于共享资源的发送者注册包括共享资源在其中运行的安全环境,以及请求共享资源的终端会话(例如终端会话代表共享资源正执行的)。因为共享资源的安全环境和存储用户共享资源的终端会话和注册接收者特性匹配,通知服务器滤波,导致前传该通知指示到客户。
例子18-示范性用户滤波
下面的例子显示在不同打印方案中的滤波,但该技术也可应用到其他方案中,在这些方案中,用于共享资源的通知是有用的。在图11中显示了示范通知系统1100。在该方案1100中,客户具有接收者注册1122,1124,接收来自共享资源的由打印假脱机服务器1102的通知服务器控制的打印组件形式(例如打印驱动器,端口监测器,语言监测器等)的通知。
在该例中,接收者注册1122,1124用用户识别符形式(显示为“Joe”和“Mary”,但可以是其他识别用户的形式)的识别环境识别符建立。用户Joe运行两个请求使假脱机服务器1102内组件1112,1114运行(例如在相同或不同时刻)的服务的终端会话。组建1112,1114模拟Joe,并和不同于“0”的会话联系,但因为它们由系统服务控制,它们运行在控制台会话(即“0”)。在该例中,当组件1112,1114期望发送通知时,它们创建适当的注册并发送通知。用于组件1112,1114之一或二者的通知被传送到和接收者注册1112相关的客户,因为该注册指定了用户Joe。
例子19-示范性安全环境滤波器
图12显示示范性通知系统1200。在此方案1200中,客户具有接收者注册1222,1224来接收来自共享资源的由打印假脱机服务器1202形式的通知服务器控制的打印组件形式(例如打印驱动器,端口监测器,语言监测器等)的通知。
在该例中,接收者注册1222,1224用安全识别符形式(例如SID,显示为“ABC”和“DEF”,但可以是识别安全环境的其他形式)的识别环境识别符建立,以指定要接收的用户特定安全环境的通知。两个终端会话在安全环境ABC下运行,两个会话都请求使假脱机程序服务器1202内组件1212,1214运行(例如在相同或不同时刻)的服务。组件1212,1214运行在安全环境ABC中,但和控制台会话(即“0”)相联系,因为它们由系统服务控制。
在该例中,当组件1212,1214想发送通知时,它们可以创建适当的注册并发送通知。用于组件1212,1214之一或二者的通知被传送到和接收者注册1212相关的客户,因为该注册指定了安全环境ABC。
例子20-示范会话滤波器
在图13中显示示范通知系统1300。在此方案中,客户具有接收者注册1322,1324来接收来自共享资源的由打印假脱机服务器1302形式的通知服务器控制的打印组件形式(例如打印驱动器,端口监测器,语言监测器等)的通知。
在该例中,接收者注册1322,1324用会话识别符形式(例如对于终端服务器,它显示为“1”和“2”,但可以是识别会话的其他形式,该会话指定要接收用于特定会话的通知)的识别环境识别符建立。两个组件1304,1312运行在假脱机1302内,组件运行在(例如同时或不同时刻)控制台会话下,因为它们和系统服务相关。然而,组件1304,1312代表不同会话运行(例如具有在除了假脱机程序1302正运行的外,相同或不同机器上呈现的用户接口),并且存储组件正为之运行的会话(例如如在此例子中描述的)。
在该例中,当组件1312,1314想发送通知时,它们可以创建适当的注册并发送通知。代表第一会话用于组件1312的通知被前传到和用于第一会话的注册1322相关的客户,代表第二会话用于组件1314的通知被前传到和用于第二会话的注册1324相关的客户,因为该注册指定了和通知相关的会话匹配。
例子21-注册混合特性滤波器
滤波器还可以指定多于一个的在此描述的示范性特性的任何组合。示范性通知系统1400在图14中显示。在该方案1400中,客户具有接收者注册1422,1424来接收来自共享资源的由打印假脱机服务器1402形式的通知服务器控制的打印组件形式(例如打印驱动器,端口监测器,语言监测器等)的通知。
在该例中,如果在会话1并且类型是“打印”,建立接收者注册1422以接收和用户Joe相关的通知。实际特性值(例如Joe,Mary,1和打印)可以是不同形式。两个组件1404,1412运行在假脱机程序1402中,组件在控制台会话下运行(例如在相同或不同的时间),因为它们和系统服务相关。然而,组件1404,1412代表不同会话运行,并存储组件为之运行的会话(例如,如在此描述的例子中的)。
在该例中,当组件1412,1414希望发送通知时,它们可以创建适当注册并发送通知。作为注册处理的一部分,作为通知自身的一部分,或经过某些其他机制,组件1412,1414可指定通知类型。在该例中,组件1412,1414都发送“打印”类型的通知。
用于组件1412的通知代表用户Joe并代表第一会话运行,并被前传到和用于第一会话的注册1422相关的客户,因为存在通知匹配。用于组件1414的通知代表用户Mary并代表第二会话运行,并被前传到和用于第二会话的注册1424相关的客户,因为存在通知匹配。如果发送不是“打印”类型的其他通知,不会将这些通知前传到注册1422,1424,因为不匹配。
在另一个没有显示的方案中,客户组件向多个滤波器注册接收者,共享资源向多个滤波器注册发送者。在这样的方案中,滤波器方法要求在前传通知之前多个特性匹配。例如,客户可以建立注册,从而仅仅那些具有以下匹配滤波器特定的通知被前传:会话识别符,安全环境识别符,计算机识别符以及通知类型。
例子22-管理员和特性滤波器
图15显示图14的示范性通知系统1400。然而,在该例中,具有管理员权限的用户创建了注册1526,该注册可以接收任何会话中用于任何用户的任何类型的注册。可选的,可以创建管理员注册(例如,接收用于特定用户、特定会话等的通知)。系统1400根据管理员的特许权允许管理员创建这样的注册。
系统1400如上所述进行处理,但还发送通知到和注册1526相关的客户。这样,管理员可以监测注册,而不考虑用户、安全环境或会话。
此外,允许管理员注册非管理客户以接收用于其他用户/会话的通知。
这样,产生用于通知的相关用户接口可被导向和终端会话相关的本地或远程机器,管理员在终端会话中注册以接收此类通知。
例子23-信道和独立生命周期
可使用称为“信道”的机制来容纳通知传送。如果期望,可以建立双向信道,从而在客户和共享资源之间可以实现双向通信。还可将信道实施为发送者注册的部分。还可以在发送者注册(例如发送者注册组件)上执行描述的信道特点。
共享资源组件可以打开信道组件,而不管是否存在接收者注册。在打开信道之后,共享资源可以经信道组件发送通知。如果没有注册接收者,信道组件接口仍会成功,但是呼叫输出(例如HRESULT)会指示没有接收通知的接收者。
例如,由假脱机程序加载的打印组件可向打印机或服务器(本地或远程)注册发送通知,而不管是否存在任何打开的信道。类似的,客户组件可向打印机或服务器(本地或远程)注册接收通知,而不管是否存在任何打开信道。一旦打开信道并发送通知,接收客户会接收到通知,对于双向通信,信道组件接口用于返回应答。因此,接收组件和信道组件的生命周期是独立的。
信道特点可被用作滤波处理(例如可建立信道发送特定类型的通知)的一部分。在双向方案中,滤波器可被用于指定发送者有兴趣接收的应答类型。
例子24-用于共享资源和接收者的接口
在图16中显示示范性通知系统1600。在该例子中,显示了控制共享资源1604的通知服务器1602。客户组件1606,1608以及共享资源1604基于注册在接收者和信道内的特性比较是匹配的,不论是在相同或不同机器上。
在一个方案中,客户组件请求来自服务器共享资源的服务,该服务器异步处理从客户接收的请求。客户组件1606,1608发送请求到服务器然后当服务器执行服务时并不等待。而是,客户组件1606注册可能稍后会从该服务器到来的通知。在一个例子中,客户组件1606注册包括接收者特性的接收者注册1610,1612。客户组件可在服务器本地运行或通过网络运行。在一个这样的方案中,通过运行时间环境建立通信1614,以支持工序间通信,不论是本地或在网络上(例如RPC,COM,DCOM等)。
客户组件可运行在共享资源的处理空间中或在另一个处理空间中。客户组件可运行在相同机器上或和共享资源不同的机器上。在一个这样的方案中,假脱机程序支持允许假脱机程序控制组件(例如打印处理器,驱动器,监测器等)的接口,以发送通知到运行在本地不同会话中的应用程序;在另一个方案中,组件可以发送通知到本地和远程客户。在一个这样的方案中,通知是基于打印处理的,意思是控制组件的假脱机程序可以请求发送通知到打开打印处理的会话。假脱机程序提供一组允许打印组件发送通知的接口,以及一组允许应用程序(例如会话,客户组件等)注册以接收通知的接口。
在此方案中,共享资源1604由(例如内部运行)通知服务器1602控制。当它想发送通知时,共享资源1604创建信道组件1616。当想要接收通知目标时,客户组件创建接收者注册1610,1612。共享资源1604保持打开的信道的逻辑列表1618以及注册用于接收来自共享资源的通知的接收者注册(某些时候称为“接收者组件”)的逻辑列表1620。在此例子中,在处理期间使用工序间通信1614发送通知数据。
接收者组件1612和信道组件1616明了和它们相关的通知类型,通信类型,用户识别符,会话识别符,以及机器识别符(例如注册接收者/发送者特性)。通知服务器1602实现信道和接收者组件之间特性的逻辑匹配,并仅发送数据到那些和信道特性匹配的接收者。
在此方案中,接收者组件提供通知服务器呼叫以传送通知数据的ICallBack接口1622。信道组件提供共享资源1604呼叫以发送通知数据的INotifyChannel接口1626。为支持双向通信,信道组件提供通知服务器呼叫以传送由接收者发回的通知数据的ICallBack接口1624。
在此方案中,在共享资源和客户组件之间发送的通知数据用通知类型识别。共享资源和客户组件之间的通信是单向的或双向的,由通信类型确定。
在此方案中,通知服务器知道共享资源和客户组件执行的安全环境。在这样的方案中,通知服务器知道终端会话识别符以及发送或注册以接收通知的用户模仿(impersonation)呼叫。在此方案中,在信道组件和接收者组件内存储该信息。
在特定方案中,通知服务器规定并实现一组允许客户组件注册和注销用于接收通知的接口。该注册和通知服务器内部组件相关,但客户组件可存在于网络上的任何地方。支持每个共享资源有多个注册。在这样的方案中,通知服务器支持一组允许共享资源发送通知数据的接口。通知服务器支持一组接口,客户组件在注册时执行并通告。这些接口由通知服务器调用以通过注册接收者传送通知数据到客户组件。对于双向通信,通知服务器通过接收者通知客户组件关于通知数据通过哪个信道组件到达的信息。在这样的方案中,客户组件经接收者发送应答通知到共享资源。
在一个这样的方案中,共享资源指定它需要和潜在接收者建立的通信类型,要发送的数据的通知类型,以及请求服务的接收者的期望安全环境。在此方案中,客户组件通过接收者组件指定,通信类型,通知类型,以及共享资源的安全环境。通知服务器和标准匹配,仅发送通知到那些满足此标准的接收者组件。
例子25-用于发送通知目标的接口
在图17中显示示范性通知系统1700。在此方案中,显示控制共享资源1704的通知服务器1702。在此方案中,客户程序1706和共享资源基于注册在接收者和信道组件内的特性比较相匹配。
例如,当信道1705注册时,它“通告”可用于注册的滤波器特性类型。当客户稍后注册接收者1710,1712时,在注册期间客户可以使用这些通告的滤波器特性。在一个例子中客户确定信道正通过该信道通告可用的滤波器特性(例如通知类型)。当由注册信道的共享资源1704发送此种类型的通知时,客户使用该“通告”滤波器特性以注册该类型通知。
在一个方案中,通知目标1714在共享资源1704和客户程序1706之间流动。通知目标通过INotifyChannel接口1708被传送到信道组件1705。通知服务器1702匹配信道组件1705的特性和接收者组件1712的特性,并前传通知目标1714到接收者组件1710。在下面的附图中的接收者组件1710,1712表示相同逻辑注册。虽然工序间通信,传送通知目标1714到接收者组件1712,可由客户程序1706访问接收者组件1712。在客户端,如果通信是双向的,为接收者提供信道组件1718的逻辑表现。
使用描述的接口,通知目标1714从共享资源被发送到客户程序1706。在一个方案中,通知服务器会以指针形式发送给它提供的任何内容到二进制目标(例如,二进制大目标或BLOB)。在此方案中,客户和共享资源的开发者可以预先同意通知目标的内容以及数据格式。该格式可由客户和共享资源根据全球唯一识别符确定。该全球识别符可以是用于注册和接收通知类型的滤波器特性。这样,通知服务器可发送数据,而不用知道(例如具有检查或识别逻辑)内容或格式,客户和共享资源开发者预先配置内容和格式。在这样的方案中,通知服务器被称为数据内容和格式不可知。
在一个方案中,假脱机程序不知道在接收者和信道之间发送的数据的类型。客户组件和共享资源规定通过信道发送数据的计划。在实际应用中,标记语言(例如XML)被用于规定数据计划,但假脱机程序无需确认数据的完整性,除了可能使用通知类型(例如GUID)进行滤波。这给了组件程序员(例如共享资源组件,接收者组件,信道组件以及客户组件)选择不同数据类型和格式的自由。在此方案中,通知数据被规定为BLOB,假脱机程序不对数据内容进行确认。为处理通知数据,可以激活适当的逻辑(例如和通知类型相关)。例如,通知类型和具有处理通知数据功能的代码库(例如DLL)相联系。
例子26-用于发送通知应答的接口
图18显示支持双向通信通知的示范性通知系统1800。如图所示,对于双向通信,客户程序1801经提供的逻辑信道组件1806发送应答通知到共享资源。信道组件调用逻辑接收者组件1808上的ICallBack接口,使得应答通知传送回通知服务器1802,其中接收者组件1810调用信道组件1812上的ICallBack接口,该接口传送应答通知1814到共享资源1816。在此方案中,客户程序1801发送应答通知目标1804到控制共享资源1816的通知服务器1802。
例子27-支持注册和通知的接口
示范性通知系统包括一组接口和类型。讨论的接口可在支持多种目标模型(例如遵守华盛顿Redmond微软公司支持的组件目标模型“COM”的目标)的环境中实施。在支持COM的环境中,讨论的接口可从IUnknown继承而得。然而,该技术也可应用到其他可能支持也可能不支持接口(例如任何C++或类似C++目标模型)的目标模型中。
在该例中,服务是通用术语,指的是由或者作为服务本身一部分(例如假脱机程序可执行为Spoolsv.exe)或者作为客户组建一部分或链接可执行(例如Winspool.drv)的假脱机程序实施的功能。打印组件指的是载入假脱机程序可执行内的组件,例如打印处理器,驱动器和监测器。接收客户是具有注册以接收打印通知的客户组件或假脱机程序终端组件。通知是通过打印组件和接收客户之间的通知信道发送的数据。信道组件是当它想发送通知时,由打印组件创建的组件。
如下表1所示,当共享资源请求通知服务器创建信道组件时,共享资源(例如诸如打印处理器,驱动器,监测器的打印组件)使用会话滤波器。因此,会话滤波器是打印组件和假脱机程序处理之间的示范接口。
表1——会话滤波器 |
typedef enum{kAllNotification=0,kPerSessionFilter=1,kPerUserFilter=2,}ESessionFilter |
在此方案中,参考表1,当在共享资源(例如打印组件)到通知服务器(例如假脱机程序)的接口呼叫内指定会话滤波器,请求创建信道组件时,在创建请求中给会话滤波器分配一个值。当共享资源设定会话滤波器的值为“1”(即ESessionFilter=1),当接收到通知时,假脱机程序发送通知到运行在作为打开打印处理的客户组件的相同会话和用户账户(或模仿相同用户账户)内的任何接收者。当共享资源设定会话滤波器值为“2”(即ESessionFilter=2),当接收到通知时,假脱机程序发送通知到作为打开打印处理的客户组件的运行在相同用户帐户内(或是模仿同一用户帐户)的任何接收者。当共享资源设定会话滤波器值为“0”(即ESessionFilter=0),当接收到通知时,假脱机程序发送通知到对接收来自打印组件或服务器的通知感兴趣(也就是所注册)的任何接收者。
在此方案中,参考表1,当由请求创建接收者组件的客户调用的接口内指定会话滤波器时,为创建请求内的会话滤波器分配一个值。如果客户组件设定会话滤波器的值为“1”(即ESessionFilter=1),当从会话“1”接收到通知时,假脱机程序发送通知到具有注册会话“1”的客户组件。当客户组件设定会话滤波器值为“2”(即ESessionFilter=2),当从共享资源接收到通知时,假脱机程序发送通知到运行在作为进行注册的客户组件的相同账户(或模仿相同账户)内的任何接收者。当客户组件设定会话滤波器值为“0”(即ESessionFilter=0),当接收到通知时,接收者接收发送到任何会话或接收者组件的通知。
在此方案中,管理员是具有用于指定打印组件的打印机管理权限(例如PRINTER_ADMIN_RIGHTS)的用户。这样,管理员可以发送通知到并从任何组件接收通知。然而,仍然实施通知类型滤波器。例如,当从会话“1”在注册具有kPerSessionFilter值的信道组件上发送通知时。根据kPerSessionFilter,否则通知应当被发送到会话“1”。然而,如果请求管理员运行在会话“2”,通知被发送到会话“2”,因为只要通知类型相同,则存在管理员接收。然而如果管理员设定通知类型为“空”,管理员会接收到通知,而不管通知类型是否匹配。
在此方案中,如表2所示,通过指定通信类型,打印组件指定是否期望来自接收者的应答通知。此外,通知类型可以指定当从多个客户发送回通知时,假脱机程序怎样处理此种情形。
表2——通信类型 |
Typedef enum{kBidirectional=1,//First response is handed to the//ICallback interface;//the client that first responded//will carry on the dialog.kUnidirectional=0,//No response is handed to the//Callback interface.}ECommunication |
在此方案中,有两种通信类型:双向和单向。在单向例子中,接收客户不发回应答通知。然而,由于多个客户组件可以注册以接收来自信道组件的通知,可能存在这种情形,即经过信道组件发送若干应答到共享资源。
在此方案中,当多个客户组件注册以接收通知时,接收来自第一响应客户组件的应答。在正进行对话(例如,通知,应答,通知等)的情形中,假脱机程序会关闭其他信道,继续和第一客户的对话。在另一个方案中,支持和对各客户组件的对话。例如,通知服务器或信道组件可提供某种方式以同步多个对话/接收者。
例如,如果两个用户,Joe和管理员,注册接收基于Joe的用户帐户滤波器的通知,Joe和管理员都接收到一个通知,接收的第一应答通知会被前传给打印组件。
在此方案中,假脱机程序使用通知类型(例如GUID)来滤波接收者。此外,打印组件和/或客户组件使用通知测定通知目标(notification object)数据计划(data schema)的标识。
在此方案中,客户组件(例如打印组件)向通知服务器(例如假脱机程序)注册。当客户注册通知时,服务器侧接收者组件会维护具有关于客户组件,例如接收者特性的信息的内部表。如表3所示,响应注册请求,一个不透明的注册处理指针返回到客户组件。客户组件使用注册处理来注销通知。
表3——注册处理 |
typedef struct_HNOTIFY{//opaque}*HNOTIFY; |
在此方案中,如表4所示,通知数据被处理为暴露INotifyDataObject接口的目标。通知服务器的客户组件和共享资源组件可以规定数据计划并发送和接收在规定计划中的数据。例如,假脱机程序的客户可以规定他们自己的数据计划并分配GUID给不同类型,以通知对给定通知系统采用哪一个,他们还可以来回发送任何数据类型。虽然通知服务器不必知道数据计划,可能要求大小以用于传送,通知类型(例如GUID)可能是接收者或发送者特性的一部分。例如,假脱机程序请求通知数据目标的BYTE*指针,数据长度以及通知类型。通知类型是GUID指针。
表4——数据通知接口 |
interface INotifyDataObject:IUnknown{typedef GUID*NotificationType;HRESULT AquireData([out]BYTE**,[in,out]ULONG*,[in,out]NotificationType*);HRESULT ReleaseData(VOID);}; |
在此方案中,打印组件将数据封装在INotifyDataObject内,接收客户调用AquireData以获得指向通知数据的raw指针,通知数据大小,以及通知类型。当接收客户使用完该数据时,接收客户调用ReleaseData。优选的,客户在调用接收者组件上的Release()之前执行INotifyDataObject调用ReleaseData()。在此方案中,AquireData调用递增目标的参考计数,ReleaseData递减目标的参考计数。
在此方案中,如表5所示,某些目标暴露ICallBack接口。
表5——ICallBack接口 |
interface ICallback:IUnknown{HRESULT OnEventNotify([in]IAsynchNotification*pIAsyncNotification,[in]INotifyDataObject*pNotification);HRESULT ChannelClosed([in]IAsynchNotification*pIAsyncNotification,[in]INotifyDataObject*pNotification);}; |
由打印组件和接收应用程序提供暴露(expose)ICallBack接口的目标。对接收通知感兴趣的组件暴露ICallBack接口。从而,接收客户在注册时提供指针给ICallBack接口。该指针用于发送通知。此外,共享资源暴露指针给ICallBack接口,从而接收应答通知。
当从共享资源(例如打印组件)发送通知给客户程序时,该服务会调用在信道客户程序末端的OnEventNotify方法,以传送通知。当信道在一端关闭时,服务会调用在另一端的ChannelClosed方法,宣布信道关闭。关闭信道的原因可作为通知发送。如果共享资源或通知服务器关闭,服务会调用ChannelClosed,传送Notification_Died类型消息。
在此方案中,如表6所示,响应当打印组件调用CreateNotificationChannel时打开通知信道,服务在客户程序策和通知服务器侧都提供暴露IAsynchNotification接口的组件。
表6——IAsynchNotification接口 |
interface IAsynchNotification:IUnknown{//Sends notification of a certain type.HRESULT SendNotification([in]INotifyDataObject*pNotification//Notification data.);//Closes the notification channel.HRESULT CloseChannel([in]INotifyDataObject*pNotification//Reason for closing);//Query notif.type that channel supports.HRESULT GetChannelNotificationType([out]INotifyDataObject**pNotificationType//Notification Channel type);}; |
IAsynchNotification接口标识一个信道,并可用于发送通知或关闭信道。发送者调用SendNotification来发送通知。可由打开信道并发送通知的打印组件或当希望发送回应答通知时的接收客户扮演发送者的角色。为关闭信道,发送者或接收者都可以调用CloseChannel。它们可传送含有关闭信道的原因的通知,或仅仅是空指针。如果信道创建者将通知类型和信道相联系,GetChannelNotificationType会将信道通知类型作为具有空数据的INotifyDataObject返回。
在此方案中,CreatePrintNotificationChannel由打印组件调用以创建通知信道。该信道可以是一个打印机处理或一个服务器处理。打印组件可以打开由假脱机程序加载的信道。例如,如果载入到假脱机程序中,驱动器(例如Winspool.drv)会显现此功能,从而允许打印驱动器打开信道。此外,在此方案中,假脱机程序库(例如Spoolss.lib)显现此功能,从而端口监测器和其他打印组件可以打开信道。因此,由假脱机服务器控制的组件,包括到假脱机程序库的链路,可以调用CreatePrintNotificationChannel。
在此方案中,如表7所示,CreatePrintNotificationChannel调用包括某些输入和输出。
表7——CreatePrintNotificationChannel |
HRESULT CreatePrintNotificationChannel([in]PCWSTR PrinterName,[in]NotificationType ChannelType,[in]ESessionFilter eSessionFilter,[in]ECommunication eCommunication,[in]ICallback*pCallback,[out]IAsynchNotification**pIAsyncNotification); |
如表7所示,信道将和打开打印处理(例如打印机名称)的会话相联系。会话滤波器指定接收通知(例如eSessionFilter)的会话。信道通知类型指定支持的通知类型。通信滤波器指定该信道是单向/双向的。ICallback接口指定当来自其他信道末端的通知返回时调用哪里。如果主叫用户对响应不感兴趣,这可以是空。
该方法返回标识信道的IAsyncNotification目标,并将该目标用于发送通知和关闭信道。例如,为关闭信道,可以调用IAsyncNotification接口的CloseChannel方法。
在此方案中,如表8所示,RegisterForPrintNotification调用包括某些输入和输出。
表8——RegisterForPrintNotification |
HRESULT RegisterForPrintNotifications([in]PCWSTR PrinterName,[in]NotificationType NotifyType,[in]ESessionFilter eSessionFilter,[in]ECommunication eCommunication,[in]ICallback*pCallback,[out]HNOTIFY*phNotify);HRESULT UnRegisterForPrintNotifications([in]HNOTIFY hNotify); |
RegisterForPrintNotification方法由接收客户调用,以注册用于接收通知。接收客户可在假脱机程序之内或在任何应用程序中。驱动器(例如Winspool.drv)会显现此功能,不管它是否被加载。假脱机程序库(例如Spoolss.lib)会显现此功能,从而端口监测器可以注册以用于通知。由假脱机程序控制的和假脱机程序库(例如Spoolss.lib)相连的组件可以调用RegisterForPrintNotification。如图所示,指定本地/远程打印机或服务器名称(例如打印处理)。通知类型表示要发送到接收者的通知的类型。会话滤波器表示要发送到接收者的会话通知。通信滤波器指定接收者是否对双/单向通信感兴趣。ICallback接口指定从哪里发送通知。本方法返回客户通过调用UnRegisterForPrintNotification使用来注销的不透明注册处理。该注册和进行注册呼叫的线程会话ID相关。在此方案中,假脱机程序会根据信道的会话滤波器和客户的注册会话及客户会话滤波器滤波接收客户。
例子28-示范性注册和通知服务器方法
图19显示用于根据通知服务器方法的发送通知和接收应答通知的示范性方法1900。在1902,该方法等待来自任何多个用户的请求。为避免等待,当请求时,通知服务器或示范方法1900可由运行时间环境例示。在实际应用中,等待不必是肯定动作(例如服务器无需执行等待指令)。描述的请求可以是在目标模型(例如COM,DCOM,JAVA,C++等)下的方法调用。
在1904从客户组件接收到注册接收者特性以接收通知的请求。在1906用于该请求的接收者特性(例如包含在内或可由之确定)和发送请求(例如经接收者注册)的客户组件相联系。在一个方案中,描述的联系包含在容纳接收特性和请求源的识别符的数据结构中。方法回到1908,等待下一请求1902。接收者特性指示至少在此描述的示范性特性之一。如果请求不是接收者注册请求,方法在1910继续。
在1910,从共享资源接收注册信道特性的请求。在1912,用于该请求的发送者特性(例如包含在内或可由之确定)和发送请求(即发送者注册)的共享资源相联系。在一个方案中,描述的联系包含在容纳接收特性和共享资源识别符的数据结构中。方法回到1908,等待下一请求1902。发送者特性指示至少在此描述的示范性特性之一。如果请求不是发送者注册请求,方法在1914继续。
在1914,从共享资源接收到通知(例如通知目标)。当该请求是通知时,在1916,方法比较发送通知的共享资源注册的发送者特性和注册接收者特性。如果比较是肯定的1916,前传通知到具有引起肯定比较的接收者特性的客户组件1918。在一个方案中,客户组件注册由同时运行在客户组件安全环境中的打印驱动器组件创建的通知。在另一个方案中,客户组件注册由运行在某个终端会话的打印监测器组件创建的通知。在另一个方案中,客户组件注册某种通知类型的所有假脱机程序通知。当肯定比较1916,通知被前传到具有对应肯定接收者特性的客户组件1918。如果没有肯定比较1918,方法返回1908,等待下一请求。然而,如果请求不是通知请求1914,方法在1920继续。
在1920,如果请求是来自客户组件发送应答通知的请求,返回应答通知到发送通知的共享资源1922,该应答是响应该通知的,然后方法返回1908,等待下一请求。然而,如果请求不是应答请求,方法在1924继续。
在1924,如果请求是来自客户组件关闭客户组件和接收者特性之间联系的请求,在1926关闭该联系,方法返回1908,等待下一请求1902。
在1928,如果请求是来自共享资源关闭共享资源和发送者特性之间的联系的请求,在1928关闭该联系,方法返回1908,等待下一请求1902。
该方法1900,和在此描述的其他任何方法类似,是分布的,并用在若干处理空间中。在这样的例子中,可在多个处理空间中执行本方法的动作。例如,通常在通知服务器空间接收通知,而通常在客户组件空间内接收应答通知。其他动作具有能在两个地址空间内执行的代码。例如,可在客户组件地址空间接收接收者注册请求,并部分在通知服务器空间内完成-假定工序间通信。
在实际应用中,比较动作(例如1904,1910等)不是必须执行。而是,可通过调用适当的可执行方法(例如适当接口的元函数)访问不同功能。
例子29-示范性客户注册和通知方法
图20显示了由客户程序和通知服务器相呼应处理同志逝世的示范性方法2000。在一个方案中,客户程序是运行在终端服务器内的会话。在另一个方案中,客户程序运行在多个用户状态之一,在单个计算机环境中,用户可以无需注销就在这些状态之间切换。客户程序通常是多个请求来自共享资源的服务的客户程序之一,并向通知服务器注册以接收从共享资源发起并传送到通知服务器的通知。
在2002,客户程序向通知服务器(例如经过接收者注册)注册为接收者。用于注册的接收者特性可包含在请求中或从请求确定。然后用户可选的继续处理其他任务,直至从通知服务器接收到和注册特性匹配的通知。例如,在一个方案中,客户程序是执行应用程序(例如字处理,电子数据表处理等)的终端会话,用于用户在远程终端登录。在请求打印服务之后,会话继续处理由远程终端用户产生的进一步的编辑请求。从而,终端会话在请求打印服务之后继续处理。
当接收到通知时,客户程序在2008处理(例如产生用于它的用户接口图像)通知。然后客户继续其他处理。在一个方案中,通知服务器响应确定通知和接收者特性匹配而发送通知。例如,在一个方案中,客户程序是终端会话,通知是关于打印组件的状态改变。在一个方案中,客户是终端会话,产生用于在远程终端站上显示通知的控制逻辑,并将其发送到远程终端。在另一个方案中,用户接口由具有通知类型识别符(例如全球唯一识别符)的客户程序识别,该通知类型识别符位于接收者特性内或位于通知目标自身内。在一个方案中,当客户是运行在终端服务服务器上的终端会话时,在远程终端上显示产生的用户接口。
在2012,客户确定发送应答通知到在2014的通知服务器。前传应答到共享资源。例如,在打印方案中,这样的应答可以指示要取消或重新路由某个作业。客户然后返回到其他处理并接收其他通知。
如果期望,注册客户可保持注册以接收多个通知。可以为某些但不是其他发送应答。
在2016,因为客户不再对接收额外的通知(例如客户正终止)感兴趣,关闭注册接收者。
显示的不同功能可通过调用适当可执行方法(例如适当接口的元函数)访问。
例子30-示范性共享资源注册和通知方法
图21显示由发送通知的共享资源执行的示范方法2100。在一个方案中,共享资源是运行在打印假脱机程序中的打印组件。在另一个方案中,假脱机程序是控制打印组件共享资源的通知服务器。在另一个方案中,共享资源是运行在由若干用户共享的计算机上的打印驱动器,用户可以在每次不登录/注销的情况下改变用户状态。通知通常被路由到请求来自共享资源的服务并注册用于来自通知服务器的通知的多个客户之一。
在2102,向通知服务器注册发送者特性。发送者特性可在注册请求中,或从注册请求中确定,并至少指示在此描述的示范发送者特性之一。共享资源然后可以继续其他处理。
在某些点(例如,当接收到打印机无纸的指示时),在2108发送通知到通知服务器。共享资源然后继续其他处理。
当接收到应答(如果有)时,在2112处理应答。在某些情况中,不期望应答,无需执行应答处理。共享资源然后继续其他处理。
在2114,关闭信道(例如关闭注册)。如果要进一步处理通知则无需关闭信道。
例子31-示范性打印机方案中的技术应用
在此描述的任何技术都可应用到打印方案中。在这样的方案中,打印机提供返回到用户的通知,指示打印机的状态通常是有帮助的。可通过在此描述的技术获得这样的通知。例如,打印组件可以发送通知。
这样的通知可以指示打印机的条件(例如打印机状态,错误消息等)。例如,无纸或手动送纸消息可经通知发送。还可以发送任意数目的其他和打印相关的消息。
如果采用双向通信,用户可以发回通知,指示采取的动作(例如取消或重新安排打印作业)。
例子32-示范性打印共享资源系统
图22是具有两个机器的示范系统2200:打印服务器2218和另一个机器2220,每个都显示终端会话用户接口。打印服务器2218包括打印资源2202,运行用于终端会话软件2204,并发送通知到在其它计算机2220上的注册客户应用程序2210。在此例子中,由打印假脱机程序2208使用通知系统,从而当打印提交的作业时发送通知到接收应用程序。在此方案中,三个打印应用程序2210,2212,2214运行,模仿领域外来用户,另一个会话2216监测打印装置状态通知。
运行为外来用户的应用程序2210,2212,2214注册以接收通知,当装置完成打印时。每个应用程序2210,2212,2214都和不同的会话相联系。该系统服务(例如打印资源2202和假脱机程序2208)和控制台会话相联系。
在该例中,甚至应用程序模仿相同用户运行,仅发送通知到发送文件的应用程序。在此例子中,使用会话滤波器来发送通知到提交作业的注册会话2210。同样,仅发送“无纸”通知2222到对装置状态通知感兴趣的注册应用程序。
例子33-在终端服务器环境的示范实施
由独立硬件厂商和独立软件厂商提供的组件可以使用在此描述的技术,从而在和请求打印或其他共享资源服务的客户组件相关的终端服务器会话中显示用户接口。这样,用户接口可在发起请求的位置(例如远程会话)显示,而不是控制台会话。
例如,打印机制造商或打印机开发商可以在打印驱动器中包括产生适当通知并和用户进行双向对话的功能。在终端服务器或快速用户交换环境中,可在适当会话或如所期望的为适当用户显示该消息的用户接口。
例子34-应答的示范使用
应答通知机制可以和在此描述的任何例子结合使用,以传送用户动作到共享资源。例如,当接收到通知时,客户可以在显示器上发送该通知的用户接口图像。用户接口图像可包括交互用户接口元素(例如按钮)。当激活用户接口元素时,可发送应答通知到共享资源。
例如,在打印方案中,用户可指示要取消、重试、或重新路由打印作业。在重新路由打印作业的例子中,可通过将目的地包括在应答通知中传送不同的目的地。
这样的方案可在终端服务器环境中得到支持。在这样的例子中,可在位于远程终端的远程显示器上呈现用户接口图像。
例子35-计算环境
图23以及下面的讨论是为了提供用于实施方案的适当计算环境的简洁的,一般的说明。虽然本发明在可运行在计算机和/或网络装置上的计算机程序的计算机可执行指令的一般环境中进行说明,本领域技术人员应当认识到本发明还可用在其他程序模块的结合中。通常,程序模块包括例程、程序、组件、数据结构等,可以执行特定任务或实现特定抽象数据类型。此外,本领域技术人员会欣赏,本发明可在其他计算机系统配置中实现,包括多处理器系统,基于微处理器的电子设备,迷你计算机,大型机,网络设备,无线装置等。扩展可在网络计算环境或独立的计算机上实现。
参考图23,用于实施方案的示范系统包括通用计算机2320(例如个人计算机,膝上型电脑,服务器,大型机,以及其他多种计算机),该计算机包括处理单元2321,系统存储器2322,系统总线2323,将包括系统存储器的不同系统组件连接到处理单元2321。处理单元是任何多种的商业可获得处理器,包括Intel x86,Pentium以及来自Intel和其他公司的可兼容微处理器,包括Cyrix,AMD以及Nexgen;来自Digital的Alpha;来自MIPS技术,NEC,IDT,Siemens的MIPS;以及来自IBM和Motorola的PowerPC。双微处理器和其他多个处理器结构也可用作处理单元2321。
系统总线可以是任何一个若干类型的总线结构,包括存储总线或存储控制器,外围总线,以及使用任何多种通用总线结构,例举其中一些,例如PCI,VESA,AGP,Microchannel,ISA和EISA的本地总线。系统存储器包括只读存储器(ROM)2324和随机访问存储器(RAM)2325。基本输入/输出系统(BIOS),包含有助于在计算机2320内部元件之间传送信息的基本例程,例如在启动期间,存储在ROM2324中。
计算机2320进一步包括硬盘驱动2327,磁盘驱动2328,例如从可拆卸盘2329读取或写入,光盘驱动2330,例如从CD-ROM盘2331读取或从其他光介质中读取或写入。硬盘驱动2327,磁盘驱动2328,以及光盘驱动2330分别通过硬盘驱动接口2332,磁盘驱动接口2333,以及光盘驱动接口2334连接到系统总线2323。驱动和他们相关的计算机可读介质为计算机2320提供数据、数据结构、计算机可执行指令等的非易失性存储。虽然以上计算机可读介质的描述指的是硬盘,可拆卸磁盘和CD,本领域技术人员会理解其他类型的计算机可读介质,例如磁带,闪存卡,数字视频盘,Bernoulli盒式磁带等也可用在示范操作环境中。
在驱动和RAM2325中存储除实施方案2356外的多个程序模块,包括操作系统2335,一个或多个应用程序2336,其他程序模块2337,程序数据2338。
用户可以通过键盘2340和指向装置,例如书表2342输入命令和信息到计算机2320中。这些和其他输入装置通常通过连接到系统总线的串行端口接口2346连接到处理单元2321,但也可以通过其它接口连接,例如并行端口,游戏端口或通用串行总线(USB)。监测器2347或其他类型显示设备也通过接口,例如视频适配器2348连接到系统总线。除监测器外,计算机通常包括其他外部输出装置(未示出),例如扬声器和打印机。
计算机2320使用到一个或多个远程计算机,例如远程计算机2349的逻辑连接操作在联网环境中。远程计算机2349可以是服务器,路由器,同样的装置或其他通用网络节点,通常包括许多或所有相关计算机2320描述的元件,虽然仅仅显示了存储装置2350。描述的逻辑连接包括局域网(LAN)2351和广域网(WAN)2352。这样的联网环境在办公室、企业范围计算机网络、内部网络以及互联网中是常见的。
当用在LAN联网环境中,计算机2320通过网络接口或适配器2353被连接到局域网络2351。当用在WAN联网环境中,计算机2320通常包括调制解调器2354或其他用于在广域网络2352,例如互联网上建立通信(例如经过LAN2351和网关或代理服务器2355)的装置。调制解调器2354可以是内部或外部的,通过串行端口接口2346连接到系统总线2323。在联网环境中,相关计算机2320或它的部分描述的程序模块可存储在远程存储器存储装置中。应当理解,显示的网络连接是示范性的,可以使用在计算机之间建立通信链路的其他方法。
可选方案
参考图示的实施例描述和说明了本发明的原理,应当认识到,可在配置和细节上修改在此说明的实施例,而不背离该原理。应当理解,在此描述的程序、处理或方法不是相关的,或限于某种特定类型的计算机设备,除非明确指出。不同类型的通用或专用计算机设备可用于或根据在此的教导执行操作。以软件显示的说明实施例的元件可用硬件实施,反过来也一样。
来自一个例子的技术可结合到任何其他的例子中。某些例子说明“前传”通知。这样的例子可以包括发送至少通知的指示,前传(例如中继)通知自身,或它们的某些组合。
由于本发明原理可应用的多种可能实施例,应当认识到详细的实施仅仅是说明性的,不应当用于限制本发明的范围。而是,我们要求所有可能落入在随后的权利要求极其等同物的范围和精神中的本发明的实施例。