利用插件来扩展测验驱动器功能的基于计算机的测验方法和系统
相关申请的交叉引用
本申请涉及和要求2001年11月13日申请的美国临时专利申请第60/331,228号的优先权,并在此将其结合作为参考资料,本申请进一步涉及:题为“EXTENSIBLE EXAM LANGUAGE(XXL)PROTOCOLFOR COMPUTER BASED TESTING(用于基于计算机的测验的可扩展测验语言(XXL)协议)”、发明人有Clarke Daniel Bowers、TronsterMaxwell Hartley、Kyle Michael Kvech和William Howard Garrison的美国专利申请(档案号26119-146);题为“METHOD AND SYSTEM FORCOMPUTER BASED TESTING USING CUSTOMIZABLETEMPLATES(利用可定制模板的基于计算机的测验的方法和系统)”、发明人有Clarke Daniel Bowers的美国专利申请(档案号26119-143);题为“METHOD AND SYSTEM FOR COMPUTER BASED TESTINGUSING A NON-DETERMINISTIC EXAM EXTENSIBLE LANGUAGE(XXL)PROTOCOL(利用非确定性测验可扩展语言(XXL)协议的基于计算机的测验的方法和系统)”、发明人有Clarke Daniel Bowers的美国专利申请(档案号26119-144);以及题为“METHOD AND SYSTEMFOR COMPUTER BASED TESTING USING AN AMALGAMATEDRESOURCE FILE(利用一个合并资源文件的基于计算机的测验的方法和系统)”、发明人有Clarke Daniel Bowers的美国专利申请(档案号26119-145),所有这些申请均与本申请同时提交,并且在此将其全部结合作为参考资料。
发明背景
技术领域
本发明概括地涉及基于计算机的测验的领域,且本发明特别是涉及一种用以向应试者传送基于计算机的测验的可扩展测验驱动器,其中在所述基于计算机的测验的进行过程中,用插件来扩展测验驱动器的功能。
背景技术
多年来,标准化测验已经是一种与教育定位、技能评价等有关的评价应试者的通用方法。由于标准化测验的盛行和大量分布,基于计算机的测验已经发展成为一种提供标准化测验、保证准确评分、并确保向应试者及时反馈测验结果的最佳方法。
测验是基于测验开发者的需求和细节而开发出来的。通常,测验开发者聘用心理测验学家或统计学家和心理学家,来确定对特定人员评价的特殊要求。关于应该如何进行一个测验,以及关于该测验的必要内容包括测验的视觉形式和测验的资料内容,这些专家通常有他们自己的独特想法。因此,不得不定制一个特别的基于计算机的测验以满足客户的需求。
图1示出现有技术的计算机化测验定制过程,该过程概括地用参考编号10表示。首先,一个客户详述所期望的测验要求和规定(步骤12)。然后,计算机化测验发行者创建工具,这些工具使测验发行者得以编辑要用来满足需求的项目、展示等(步骤14)。然后,测验发行者编写一个项目浏览器,该项目浏览器允许测验发行者预览正被编辑的内容(步骤16)。
然后编写一个项目演示器(item presenter),以便举例来说向测验驱动器展示新的项目(步骤18)。向测验驱动器展示新项目要求修改测验驱动器的可执行代码。测验驱动器必须被修改,以使其知道新的项目,并能够与新项目演示器进行通信(步骤20)。然后,测验封装器也必须被修改(步骤22)。测验封装器也可以是一个编译器,其获得测验发行者已创建的项目,并将结果编写为适合于新语法的新对象代码。随后,计分器也必须被修改,以便能够对新项目类型进行计分(步骤24)。最后,必须修改结果处理器,以便能够接受得自新项目的新结果(步骤26)。这一过程要求对于现有软件进行不少于七次软件创建或修改。
美国专利第5,827,070号(Kershaw等人)和美国专利第5,565,316号(Kershaw等人)都在此引用作为参考资料。上述′070和′316号专利具有相似的说明书,公开了一种基于计算机的测验系统,其包括测验开发系统和测验提供系统。测验开发系统包括一个规定测验内容的测验文挡创建系统,一个将测验中的每项条目计算机化的项目准备系统,一个预备计算机化测验的测验准备系统,以及一个将所有项目和测验组件合成为一个计算机化测验包的测验封装系统。然后,计算机化测验包被测验提供系统提供给工作站的授权应试者。
图2A和2B示出上述′070和′316号专利中公开的测验准备过程。测验开发者装配测验,如图中的32所示。如图中的36所示,利用测验开发/文档创建(“TD/DC”)系统或等效的测验文档创建系统,项目选择最好被自动执行(AIS)。利用“TD/DC”,测验开发者将测验规定输入到“TD/DC”系统内。基于这些规定,“TD/DC”在其中心数据库中搜索满足测验规定的项目,例如50个数学题,其中25个是代数题,而25个是几何题。然后,测验开发者对应于背景部分中所描述的灵敏度和重叠限制而检查由“TD/DC”选择的各个项目。如果测验开发者判定当前选择的项目不满足灵敏度或重叠限制,则可能特定的项目被指定由得自数据库的另一个项目来代替。此外,测验开发者提供一个测验描述,规定该测验的说明、信息、各部分的定时、各部分的数量等,如图中的42所示。如果要运行一个计算机自适应测验(CAT),则测验开发者可运行在图中34的计算机自适应测验模拟,这是熟练测验开发者所公知的。利用测验准备工具(TPT)和TOOLBOOK 46,测验准备系统(“TPS”)准备测验级别组件,如图中50所示。TOOLBOOK可从Asymetrix公司购到。测验级别组件包括脚本66、项目表数据块组56、一般信息屏幕58、指示屏幕60、消息屏幕62和教导单元64。下面将详细描述每个测验组件。当准备各个组件时,TPT将它们存储在一个TPS网络目录52中。然后,各个组件被输入到TPS生产数据库54。存储在TPS生产数据库54中的各个组件将在测验封装过程中被恢复。
在此引用作为参考资料的美国专利第5,513,994号(Kershaw等人)公开了一种对多个应试者的标准化测验进行管理的集中式管理系统和方法。该管理系统在中心管理工作站和位于测验中心的不同房间内的至少一个测验工作站上实施。提供实际管理功能的管理系统软件是在中心管理工作站上执行的。而提供与一个测验期间所完成的功能有关的管理系统软件在测验工作站上执行。
可见Kershaw等人的专利均未述及如何对基于计算机的测验系统进行修改,以便加入特定客户的测验规定。所需要的是这样一个系统,该系统举例来说允许测验驱动器被扩展以支持新的项目类型、计分算法等,而不用对测验驱动器的执行进行任何修改或重新编译测验驱动器以便支持下文所述的与本发明有关的新功能。对上文所述是附加的其它特点和优点,或是对上文所述是替代性质的其它特点和优点,描述于下面所提供的本发明内容和具体实施方式中。
发明内容
本发明的一个特点和优点是能够扩展基于计算机的测验提供系统中的测验驱动器,而不必改变该测验驱动器的可执行代码,而且不必重新编译或再连接测验驱动器。
本发明的另一个可选的特点和优点是使测验驱动器能够支持新的项目类型、导航算法、信息显示、计分算法、计时算法、测验单元选择算法、结果持久性报告、打印分数报告和/或指导类型,而不必改变测验驱动器的可执行代码。
本发明的另一个可选的特点和优点是利用一个扩展模块以便于测验驱动器的扩展。
本发明的另一个可选的特点和优点是上述扩展模块基于测验定义语言内的一个类别名而被实例化(instantiated),该测验定义语言是以可扩展标置语言格式为基础的。
本发明的另一个可选的特点和优点是利用组件对象模型接口来方便测验驱动器与扩展模块之间的通信,从而使扩展模块能够实现测验驱动器的扩展。
本发明的另一个可选的特点和优点是多种类型的扩展模块可实现一个特定的组件对象模型接口。
本发明的另一个可选的特点和优点是所述扩展模块可以在测验驱动器被构建之后再被编写。
在一种用于产生测验并向应试者提供该测验的基于计算机的测验系统中,实现了本发明的这些和其它特点和优点。所述测验具有确定了测验的视觉演示的展示格式,以及确定了测验的功能属性的数据内容。该系统包括一个测验驱动器,它具有控制测验驱动器的可执行代码。基于该可执行代码以及由测验定义语言所定义的测验规定和内容,测验驱动器利用显示装置向应试者提供该测验并且管理测验。测验驱动器基于测验规定和内容的导航特点而控制测验的进度。测验驱动器还控制测验的计分并控制测验的结果报告,该结果报告可选地包括测验中的各单元的定时、项目的定时、项目的回答、测验单元的得分、应试者的人数统计、指定信息、项目得分等等。
所述系统还包括一个资源文件,该文件存储与测验的数据内容、展示格式、进度、计分和/或结果报告有关的信息。该信息对测验驱动器来说是可访问的,从而使测验驱动器能够检索测验规定和内容,并将测验提供给应试者。该系统进一步包括一个扩展模块,它从所述资源文件中检索与测验的数据内容、展示格式、进展、计分和/或结果报告有关的信息,并在测验的提供过程中将上述信息提供给测验驱动器。有利的是扩展模块扩展了测验驱动器的功能,而不必改变测验驱动器的可执行代码。在一个可选实施例中,该扩展模块是一个插件。
在一个可选实施例中,本发明的系统进一步包括一个源文件,该文件存储与测验的数据内容、展示格式、进度、计分和/或结果报告有关观的信息。测验发行者编写存储在该源文件中的信息。所述系统进一步包括一个测验封装器,它从源文件检索信息。上述资源文件存储被测验封装器从源文件中检索到的信息。在一个实施例中,测验封装器将来自源文件的信息传送给扩展模块,从而允许扩展模块确认存储在该源文件中的测验定义语言。所述系统还包括一个存储测验状态信息的实例文件,该测验状态信息包括在测验期间应试者对展示给该应试者的项目所提供的回答。测验状态信息对扩展模块来说是可访问的,为的是当测验在提供期间举例来说因断电而中断时,使得测验能够重新开始。
在另一个实施例中,本发明的系统例如使用九个不同的扩展模块来增强测验驱动器的功能。每个扩展模块可选择地控制测验的一个不同特征,从资源文件检索不同类型的信息,并在测验的提供过程中将该信息提供给测验驱动器。第一扩展模块从资源文件中检索与非交互式显示资料有关的信息。第二扩展模块检索与测验导航有关的信息。第三扩展模块检索与测验导航控制有关的信息。第四扩展模块检索与测验期间提供给应试者的项目或问题有关的信息。第五扩展模块检索与测验的定时有关的信息。第六扩展模块检索与选择有关的信息,其中该选择信息确定展示给应试者的项目和顺序。第七扩展模块检索与测验计分有关的信息。第八扩展模块检索与结果有关的信息。最后,第九扩展模块检索与报告有关的信息,如打印应试者的分数报告。当然,在可选实施例中扩展模块的功能可被合并和/或被分离。
在本发明的另一个实施例中,提供了一种用于测验的基于计算机的测验方法,其中所述测验具有确定该测验的视觉展示的展示格式和确定该测验的功能属性的数据内容。测验的提供由具有可执行代码的测验驱动器来控制,该代码使测验驱动器能够利用显示装置向应试者提供测验、管理测验、控制测验的进度、控制测验的计分、及控制测验的结果报告。
该方法包括下列有序的、无序的和/或顺序独立的步骤:实例化(instantiating)一个扩展模块,给该扩展模块提供在一个资源文件内的资源存储元素,并在测验的提供过程中将来自该资源存储元素的信息加载到扩展模块。来自资源存储元素的信息涉及测验的数据内容、展示格式、进度、计分和/或结果报告。该方法还包括在测验的提供过程将来自上述扩展模块的信息提供给测验驱动器。扩展模块扩展测验驱动器的功能,而不需要对测验驱动器的可执行代码进行程序设计变化。在该方法的一个实施例中,所述扩展模块是在测验提供过程中被实例化的。
在进一步的实施例中,一种用于测验的基于计算机的测验方法包括使一个扩展模块实例化,并且将来自一个源文件的信息加载到该扩展模块,其中所述信息涉及测验的数据内容、展示格式、进度、计分和测验结果的报告。该方法还包括确认来自所述源文件的信息,并且将来自确认扩展模块的信息卸载到一个资源文件内的资源存储元素。扩展模块扩展了测验驱动器的功能,而不必对测验驱动器的可执行代码进行程序设计变化。在该方法的一个可选实施例中,扩展模块是在测验的生产过程中被实例化的。
在本发明的另一个可选实施例中,一种用于测验的基于计算机的测验方法包括在该测验的生产过程中实例化一个扩展模块,并且将来自一个源文件的信息加载到该扩展模块,其中所述信息涉及非交互式显示资料、测验导航、测验导航控制、项目、定时、选择、计分、结果和/或报告中的至少一个。该方法还包括确认来自上述源文件的信息,并且将该信息从确认扩展模块卸载到一个资源文件内的资源存储元素。该方法还包括在测验提供过程中实例化扩展模块,给该扩展模块提供上述在资源文件内的资源存储元素,在测验的提供过程中将来自该资源存储元素的信息加载到扩展模块,并且在测验提供过程中将来自扩展模块的信息提供给测验驱动器,从而使扩展模块扩展测验驱动器的功能,而不需要对测验驱动器的可执行代码进行程序设计变化。在一个可选实施例中,所述扩展确认模块确认来自源文件的信息。
在另一个实施例中,一种基于计算机的测验方法包括在测验产生过程中实例化一个扩展模块,并且将来自资源文件的信息加载到该扩展模块,该信息涉及非交互式显示资料、测验导航、测验导航控制、项目、定时、选择、计分、结果和/或报告中的至少一个。该方法还包括确认来自资源文件的上述信息,并且将信息从确认扩展模块卸载到一个资源文件内的一个资源存储元素。该方法还包括在测验提供过程中实例化所述扩展模块,给该扩展模块提供在一个资源文件内的一个资源存储元素,在测验提供过程中将信息从该资源存储元素加载到扩展模块,并且在测验提供过程中将来自扩展模块的信息提供给测验驱动器。
在本发明的另一个实施例中,一种基于计算机的测验的方法包括编辑与测验的数据内容、展示格式、进度、计分和/或结果报告中的至少一个有关的信息,并将该信息初始存储在一个源文件中。该方法还包括以一个测验封装器从该源文件中检索所述信息,而以一个扩展模块从测验封装器接收上述存储在源文件中的信息,以所述扩展模块确认从测验封装器接收到的信息,并且以一个资源文件存储上述被扩展模块所确认的信息。该方法还包括以测验驱动器来控制功能,以便利用显示装置向应试者提供测验、管理测验、控制测验的进度、控制测验的计分、和/或控制测验的结果报告。所述方法还包括以扩展模块来检索上述存储在资源文件中的信息,并在测验提供过程中将由扩展模块所检索到的信息提供给测验驱动器。该方法进一步包括:以一个实例文件存储测验状态信息,该测验状态信息包括应试者对于在测验过程中展示给该应试者的项目的回答,如果测验被中断,则所述测验状态信息使测验能够重新开始;并且以扩展模块和测验驱动器从该实例文件检索测验状态信息。
以上就这样相当概括地略述了本发明的较重要的特点和若干(而不是所有的)实施例,为的是下面的详细描述可以被更好地理解,也为的是本发明对这项技术的贡献可以被更好地认识。当然,下文中会描述本发明的其它特征,并且它们将构成所附权利要求的主题。
在这一方面,在详细解释本发明的至少一个实施例之前,应认识到,本发明并不将其应用限制于构造细节以及对下文描述中所阐明的或附图中所示意的组件的安排。本发明可以有其它实施例,并可用不同方式来实践和实施。同样应认识到,这里所使用的措词和术语是为了描述的目的,不应该被视为是限定。
同样地,本领域技术人员将理解到,本公开所依据的概念易被作为实现本发明的多个目的其它结构、方法和系统的设计基础。因此,在不脱离本发明的精神和实质的情况下,重要的是将本发明权利要求视为涵盖了这类等效方案。
此外,上述概括的目的是使美国专利商标局和普通公众,尤其是本领域的不熟悉专利或法律术语或措词的科学家、工程师和从业人员,能够借助粗略审查即快速确定本申请的技术公开的性质和实质。本概要既不打算限定本申请的发明(它被权利要求所界定),也不打算以任何方式来限制本发明的范围。
这些目的和本发明的其它目的以及具有新颖性的标志本发明特征的各种特点,在所附加的并构成本公开的一部分的权利要求中被特别指出。为了较好地理解本发明、其有效的优点以及借助其应用而实现的特定目标,应该参考示出了本发明的优选实施例的附图及说明。
附图说明
图1是一种现有技术的计算机化测验定制方法的流程图;
图2A和2B是一种现有技术的测验产生过程的方框图;
图3是一种根据本发明的基于计算机的测验系统的示意图;
图4是一个方框图,其示出根据本发明的基于计算机的测验系统中所使用的不同类型插件;
图5示出各种组件,包括测验源文件;
图6A和6B是示意图,示出根据本发明的组件、类别和接口,包括一个测验定义语言编译器;
图7是一个示意图,示出根据本发明的组件,包括测验驱动器和测验管理系统;
图8A和8B是示意图,示出包括测验驱动器的类和接口;
图9示出根据本发明包含结构化存储的各接口;
图10A和10B是示意图,示出包括结构化存储和相关操作的类别和接口;
图11是根据本发明的一个测验资源文件的主存储分支的方框图;
图12是示出测验资源文件的一个测验分支的方框图;
图13A和13B是示出测验资源文件的一个窗体分支的方框图;
图14是示出测验资源文件的一个项目分支的方框图;
图15是示意测验资源文件的一个范畴分支的方框图;
图16是示意测验资源文件的一个模板分支的方框图;
图17是示意测验资源文件的一个区段分支的方框图;
图18是示意测验资源文件的一个组分支的方框图;
图19A、19B、19C和19D是示意测验资源文件的组分支的一个事件子分支的方框图;
图20是示意测验资源文件的一个插件分支的方框图;
图21是示意测验资源文件的一个数据分支的方框图;
图22是示意测验资源文件的一个窗体组(formGroups)分支的方框图;
图23是示意测验资源文件的一个属性分支的方框图;
图24是示意测验资源文件的一个脚本分支的方框图;
图25是示意测验资源文件的一个消息框分支的方框图;
图26A、26B、26C和26D是示意根据本发明的一个测验实例文件的方框图;
图27是一种根据本发明的计算机化测验定制方法的流程图;
图28是一种根据本发明的测验产生和测验提供方法的流程图;
图29是一种根据本发明的测验规定和内容的确认方法的流程图;
图30是一种根据本发明的测验提供方法的流程图;
图31是一种根据本发明的中断后重新开始测验的方法的流程图;
图32是根据本发明的一个插件的一个生命周期的示意图;
图33是根据本发明的编译插件的一个过程的流程图;和
图34A、34B、34C和35D是在一个基于计算机的测验过程中向一个应试者提供插件的过程的流程图。
具体实施方式
现在将详细说明本发明目前的优选实施例。提供这样一些实施例为的是解释本发明,本发明并非要受此限制。实际上,那些本领域普通技术人员通过阅读本说明及浏览本附图,可以认识到能够做各种各样的修改和变化。
例如,作为一个实施例的一部分所示出或描述的特征可被用于其它实施例中,从而产生一个更进一步的实施例。此外,一些特定特征可与未曾述及的执行相同或类似功能的类似装置或特征互换。所以应将这类修改和变化包括在整个本发明中。
本发明公开了一种利用测验驱动器的基于计算机的测验系统和方法,其例如是面向对象的,并被设计为例如通过使用扩展模块且最好通过使用插件来动态地增加功能。所述测验驱动器最好利用标准接口来访问组件对象模型服务器,并且例如使用在一种名为可扩展测验语言(“XXL”)的、基于可扩展标置语言(“XML”)格式的用户测验定义语言中所定义的类别名(可以是一个活动文档),与现有应用程序交互作用,同时提供了允许开发新插件的灵活性。这些新插件可根据客户的需要而定制,而不改变核心测验驱动器。XXL的指定格式和协议同样描述于与本发明在同一日期提交的题为“EXTENSIBLE EXAMLANGUAGE(XXL)PROTOCOL FOR COMPUTER BASED TESTING(用于基于计算机的测验的可扩展测验语言(XXL)协议)”的共同待审的美国专利申请中,在此将其引用作为参考资料。
插件使测验驱动器能够有利地支持例如新项目类型、导航算法、信息显示、计分算法、计时算法、测验单元选择算法、结果持久性报告、打印分数报告和/或指导类型,而不改变测验驱动器的执行。插件还允许测验驱动器的功能扩展,而不要求测验驱动器被重新编译或重新链接,并且不要求测验发行者去学习编程。由于插件和测验驱动器是分别独立编写的,所以可在构建测验驱动器很长时间之后再编写插件。
客户和软件开发者可设计和测试插件,并将插件分配到每个测验站点。通过使用这种方法,其它测验的大范围回归测试通常就会是不必要的,除非要对许多测验所使用的插件进行变化。
I.基于计算机的测验提供系统的概述
图3示出本发明的基于计算机的测验提供系统的软件体系结构的一个概观,该系统概括地用参考编号100来表示。测验驱动器110负责控制基于计算机的测验的所有方面:测验驱动器110识别被安排参加基于计算机的测验的应试者,并识别和产生恰当的测验。然后,测验驱动器利用一个显示装置(未示出)如计算机显示器来向应试者展示所有测验组件,并使应试者能够通过使用输入装置(未示出)如键盘、鼠标等来输入对测验问题的回答。测验驱动器110还监控测验的安全。例如,测验驱动器110可阻止对因特网的访问并且可以确认应试者,不过这些功能最好由测验中心管理系统来执行。测验驱动器110还监控测验的定时,为应试者提供关于该测验的一个特定部分或整个测验的已用时间和剩余时间的相关警告。测验驱动器110还负责在完成测验后或在测验进行中对于测验进行计分,并且通过使用打印机182来物理打印输出,或利用候选者测验结构文件180而以文件的方式,来报告测验的结果。如果测验在进行中例如因电力故障而中断,则测验驱动器110重新开始测验,最好是在测验的中断点开始测验,如下文的详细描述。最后,如果测验未完成,则测验驱动器110清除未完成的测验。一个未完成测验将在应试者目录中具有一个测验实例文件,但将不会产生一个结果文件。通常即使应试者失败,仍会产生一个结果文件。提供给应试者的项目数量被记录在结果文件中。测验驱动器110拾取事件中断的位置,并不可见地提供该测验的其余单元。
由测验发行者根据客户的规定来编写一个测验规定,并将其存储在测验源文件130中。测验源文件130包括数据文件132、XXL文件134、多媒体文件136和超文本标记语言(“HTML”)文件138。XXL文件134包括测验规定,该规定包含:客户对测验的要求,一组测验项目或问题,决定测验的物理外观的模板,插件,以及为实施测验所必需的任何附加数据。附加数据还被存储在数据文件132中。例如,一个自适应选择插件可能需要a、b和c的θ值。这些值被存储在以统计包产生的一个二进制文件中。
例如,HTML文件130包括测验的任何可视组件,如测验项目或问题的外观,在显示装置上的展示外观,任何客户指定定制的外观,和/或分数报告的外观。HTML文件130最好还包括脚本,例如VB脚本和J脚本(Jscript)或Java脚本。HTML文件130最好是利用微软的FrontPage2000来编辑。FrontPage 2000同样最好被用于管理由测验发行者所选择的一个分层结构中的源文件。例如,多媒体文件136包括在测验中所使用的任何图像(.jpg、.gif等)和/或声音(.mp3、.wav、.au等)文件。
XXL编译器140利用接口190从测验源文件130中检索XXL文件134,并编译存储在XXL文件134中的XXL测验内容。XXL编译器140将经过编译的测验文件存储在测验资源文件120中。在另一个实施例中,测验源文件130不包含XXL文件134,而举例来说只包含多媒体文件。在这一实施例中,XXL编译器140只是一个测验封装器,其将数据直接写入测验资源文件120中而不作修改或确认。数据以一个流的形式出现在测验资源文件120的“数据”分支下。该流的名称由测验创作者来指定。
在一个优选实施例中,XXL文件134还包括定义插件150的XXL语言,在此情况下,插件150辅助XXL编译器140编译XXL文件134。例如,测验驱动器110最好支持九种不同类型的插件150,举例来说包括:显示插件152;指导插件154;项目插件156;计时器插件158;选择插件160;导航插件162;计分插件164;结果插件166;以及报告插件168。插件150还被包括在XXL文件134中,被编译为测验资源文件120中的第一XML文件。
插件150使一个测验设计者得以定制测验驱动器110的行为,而插件150举例来说被分为两种类型:可视插件和不可视插件,如图4所示。可视插件包括显示插件152、指导插件154和项目插件156,其使得测验驱动器能够控制显示装置上可视地显示给应试者的内容。不可视插件包括计时器插件158、选择插件160、导航插件162、计分插件164、结果插件166、和报告插件168,其使得测验驱动器能够控制测验的更多的功能性方面。插件150用于确认存储在测验源文件130中的数据,该数据在向应试者提供测验的过程中将被其中一个插件150所使用,如下文更详细的描述。插件150最好如下文所描述的,是组件对象模型(“COM”)对象。插件150也可使用Java实现。插件150的编写最好使用微软Visual C++或Visual Basic6.0或任何完全为COM所允许的语言。插件150可在进程内或进程外,因此可作为可执行(“.EXE”)文件或动态链接库(“.DLL”)文件存在。
使用由另一个组件所提供的对象的一个应用程序或组件被称为一个客户。组件是以它们相对于客户的位置为特征的。一个进程外组件是一个依其自身进程运行的.exe文件,具有其自身的执行线程。因此,一个客户与一个进程外组件之间的通信被称作交叉进程或进程外通信。
诸如一个.dll或.ocx文件这样的进程内组件以与客户相同的进程运行。它提供访问对象的最快方式,因为属性和方法调用没有必要跨过进程边界来安排。然而,一个进程内组件必须使用客户的执行线程。
如果可行的话,测验资源文件120从XXL编译器140和插件150接收经过编译的测验内容,并以被称为POLESS的对象链接与嵌入(“OLE”)结构化存储格式来存储经过编译的测验内容,下文将对其进行较详细的描述。也可使用其它存储格式。OLE允许不同的对象将信息写入到相同文件中,例如将一个Excel电子表格嵌入到一个Word文档中。OLE支持两种类型的结构,即嵌入和链接。在OLE嵌入中,上述示例的Word文档是一个容器应用程序,而Excel电子表格是一个嵌入对象。容器应用程序包含嵌入对象的一个拷贝,而且对嵌入对象所做的变化仅影响到容器应用程序。在OLE链接中,上述示例的Word文档是容器应用程序,而Excel电子表格是一个链接对象。容器应用程序包含一个指向链接对象的指针,而且对链接对象所做的任何变化都改变原始链接对象。链接到被链接对象的任何其它应用程序同样被更新。POLESS支持结构化存储,从而使得对一个存储在测验资源文件120中的对象所做的仅一个变化是全局有效的。测验驱动器110包括用于可视插件的活动文档容器应用程序112、显示插件152、指导插件154和项目插件156,它们起嵌入对象的作用,最好是COM对象。
如果任何插件150被正在使用,则XXL编译器140和插件150都涉及到将经过编译的测验内容存储到测验资源文件120中。例如,测验资源文件120包括一个分层存储结构,如下文所将进一步详细描述的。也可使用其它存储结构。XXL编译器140确定要将经过编译的测验内容的一个特定段存储到哪一个存储位置。然而,如果用任何插件150确认来自测验源文件130的任何数据部分,则插件150就基于XXL编译器140的定向而将数据直接存储到测验资源文件。XXL编译器使用与图3中I-Plugin接口167位于同一位置的IPersistResource接口192,来控制数据对测验资源文件120的持久性。XXL编译器140和插件150利用POLESS接口191将数据写入到测验资源文件120内。
图5示出测验源文件130的内容,它们被XXL编译器140和插件150编译为测验资源文件120。例如,FrontPage2000Web被用于编辑测验。测验源文件130包含媒体文件210、可视文件220和逻辑文件230。媒体文件210是用于增强测验展示的多媒体文件,举例来说包括XML数据文件212,声音文件214,图像文件216,以及二进制文件218。XML数据文件212包含XXL测验定义语言和由使用XML的插件150得到的XXL扩展。测验规定、展示、计分和其它信息是在XML文件中被指定的。声音文件214包括任何要测验过程中使用的声音,例如.mp3文件、.au文件等。图像文件216包括任何要测验过程中使用的图像,例如.jpg文件、.gif文件等。二进制文件218包括任何为插件150所需要的不是XXL格式的数据。可视文件220是HTML文件,其将测验的可视展示指定为在显示装置上对测验的展示,包括项目文件222、展示文件224、分数报告文件226、和客户查看文件228。项目文件222包括HTML文件,用以指定测验问题的可视组件,例如问题主干(stem)和扰乱选项(distractor)。项目文件222还能够引用外部显示。显示可以是一个图表、图解或照片。显示的格式例如包括:jpg、.png等等。展示文件224规定在测验过程的特定瞬间应试者在显示装置上所看到的内容。分数报告文件226通常是带有一个嵌入脚本的HTML文件,举例来说包括候选者统计、约定信息、和候选者成绩。成绩可能包括通过/不及格,在不同内容范围的成绩,等等。客户查看文件228通常是带有嵌入脚本的HTML文件,举例来说用来布置标题条及其所包含的信息。逻辑文件230是指定测验的功能方面的XML文件,包括测验规定文件232、插件文件234、项目组文件236和模板文件238。测验规定文件232指定客户所提供的测验的内容和进度。插件文件234定义插件150,并且包含为实现插件150所需的任何数据。项目组文件236包括要在测验过程中展示给应试者的项目或测验问题的数据内容和特性。一个项目的特性包括对于该项目的正确答案,被给予该项目的加权,等等。模板文件238定义在测验过程中显示屏上所使用的可视布局。
再参照图3,一旦测验开始,测验驱动器110就利用POLESS接口193访问测验资源文件120,以取得为实现测验所需要的指令和文件。测验驱动器110还访问插件150以在下列范围获取使测验驱动器110的功能扩展的附加数据:项目、导航算法、信息显示、计分算法、计时算法、测验单元选择算法、结果持久性报告、打印分数报告和/或指导类型。测验驱动器110利用各种COM接口169与插件150通信。COM接口有利于OLE链接。如前面所阐述的,测验驱动器110是一个活动文档容器应用程序而插件150是嵌入对象。COM接口起上述容器应用程序与对象之间的通信路径的作用。
例如,基于计算机的测验的提供系统100使用了10个COM接口。IPlugin接口167也是一个COM接口,它由所有的插件150支持。因此COM接口169包括IPlugin接口。IPlugin接口包含所有插件150所需要的一般操作,如加载和卸载。除了全局IPlugin接口之外,每个插件150举例来说还使用一个第二专用COM接口169与测验驱动器110进行通信。也可使用IPlugin接口的各种替代结构。表1示意出每个插件150与该特定插件150所使用的COM接口169之间的关系。
表1:用于插件的COM接口
插件 |
COM接口 |
描述 |
所有插件150 |
IPlugin |
在测验驱动器与所有插件之间传递关于一般操作例如加载和卸载的数据。 |
显示152 |
IDisplay |
在测验驱动器与处理标题条、显示、非回答项目和内容 |
| |
的可视插件之间传送数据。 |
指导154 |
IHelm |
在测验驱动器与显示导航控制或检查的可视插件之间传送数据。与导航插件进行通信,以执行实际的导航。也充当一个对测验驱动器的用户接口连接。 |
项目156 |
IItem |
在测验驱动器与管理测验项目或模拟的可视插件之间传送数据。 |
计时器158 |
IUnitTimer |
在测验驱动器与用于执行测验区段的定时的不可视插件之间传送数据。 |
选择160 |
ISelection |
在测验驱动器与用于选择提供给应试者的表格、区段、组或项目的不可视插件之间传送数据。 |
导航160 |
INavigate |
在测验驱动器与用于控制区段导航和定义穿过测验的规则的不可视插件之间传送数据。 |
计分164 |
IScore |
在测验驱动器与用于控制被提供测验单元的计分的不可视插件之间传送数据。 |
结果166 |
IResults |
在测验驱动器与控制,例如向候选者测验结果文件180写应试者结果的不可视插件之间传送数据。 |
报告168 |
IReport |
在测验驱动器与控制分数报告和其它资料的打印,例如打印参考资料,以及向打印机182传送测验指令的不可视插件之间传送数据。 |
如果测验例如因电力故障而中断,则测验实例文件170被用于重新开始一个测验。在测验的提供过程中,测验实例文件170从测验驱动器110和插件150接收关于用来提供测验的所有运行对象的状态的测验状态信息。测验状态信息包括中断前正在被提供到显示装置上的展示、应试者已在该展示中输入的回答,等等。当重新开始测验时,测验实例文件170将状态信息加载回测验驱动器110和插件150,从而使测验得以返回到测验被中断位置的操作。最好是所有对象的运行状态而不仅是某些对象的运行状态被保存到测验实例文件170。仅将某些对象的状态保存到测验实例文件170会导致在测验中断后仅有一部分测验信息被恢复的潜在问题。测验实例文件170还可存储关于测验的附加信息,其例如包括:测验的各个单元的已使用时间和剩余时间的计时,提供的当前单元,候选者得分,等等。测验驱动器110和插件150利用POLESS接口195与测验实例文件170进行通信。测验驱动器110利用与图3中的COM接口169并置的IPersistInstance接口196来控制测验驱动器110与插件150之间的通信。
多个管理环境执行基于计算机的测验提供系统100的管理功能,例如:测验中心管理器(“TCM”)桥172;教育测验服务(“ETS”)桥174;以及统一管理系统(“UAS”)174。管理功能则例如包括:登记应试者,开始测验,异常终止测验,暂停测验,继续测验,以及传送结果。
最好有两种方式运行测验驱动器110。第一种是通过一系列命令行选项,第二种是使用描述约定信息的COM接口。在标准ETS环境程序和TCM环境程序中存在用于向后兼容性的命令行选项。表2示出一个测验驱动器110支持的命令行选项的列表。举例来说,有四个通过COM接口启动测验的程序,例如为:1)LaunchTest.exe(用于产生测验和客户检查);2)UAS;3)UTD2ETS.dll(用于ETS管理环境的一个内部兼容模块);和4)UTD2TCM(用于测验中心管理器环境)。还可选择性地使用其它数量的环境和/或程序。
开关(Switch) |
选项(Option) |
目的(Purpose) |
/?/help |
n/a |
在对话框中显示命令行开关 |
/UnregServer |
n/a |
不注册测验驱动器核心COM服务器 |
/Regserver |
n/a |
注册测验驱动器核心COM服务器 |
/T |
form name |
测验中运行的窗体或窗体组的名称 |
/F |
resource file |
要使用的测验资源文件 |
/S |
n/a |
禁止任何打印 |
/W |
n/a |
以日期关闭模式运行 |
/Tl |
n/a |
设置信息的跟踪级别。(很大的实例文件) |
/TW |
n/a |
设置警告的跟踪级别。(大实例文件) |
/TE |
n/a |
设置错误的跟踪级别。(平均大小实例文件) |
/K |
resource dir,SKSID,Candidate director |
用于指向目录。一个空格分开三个选项中的每一个。 |
管理环境程序使用几个接口与测验驱动器110通信。IAppointment接口176是UAS 174的一部分,并且允许测验驱动器110访问参加测验的应试者的应试者信息,例如人口统计信息。应试者信息包含在由测验驱动器110所创建的候选者测验结果文件180中。ILaunch2接口177充当UAS 174的主控制接口,并使UAS 174得以控制测验中心中的各种组件,如测验驱动器110、屏幕分辨率变化、对残疾候选者的调节、应试者登记,等等,该测验中心是应试者参加测验所在的物理位置。ITransfer接口199将候选者测验结果文件180和其它文件传送回UAS 174。IPrint接口198向打印机182发送关于任何报告的信息。
II.XXL编译器接口和类别
图6A和6B示出XXL编译器140的主要视图。XXL编译器140举例来说包括下列类别:cCompile 2000;cData 2004;cArea 2006;cTemplate2008;cCategory 2010;cItem 2012;cPresentation 2014;cGroup 2016;cSection 2018;cForm 2020;cFormGroup 2022;cExam 2024;cMsgBox2026;cChecksum 2028;cEvent 2030;cResult 2032;cReport 2024;cPlugin2036;和cXXL 2038。
XXL编译器140的主接口是ICompile接口2002。ICompile接口2002由cCompiler类2000来实现。将测验源文件130编译为测验资源文件120的所有控制和初始化都借助这个单一的公共接口发生。XXL测验定义语言的核心的非插件相关元素,与存储在XXL文件134中的一样,是以XXL编译器140中的类来编译的。例如,cSection类2018编译区段元素,而cGroup类2016编译组元素。
ICompile接口2002举例来说支持下列操作:creatResource();addSource();addDate();closeResource();about();linkResource();openResource()和getCryptoObject()。CreatResource()创建一个资源文件,举例来说,一个像测验资源文件120这样的基于XXL的资源文件。AddSource()将一个XXL文件编译为资源文件。AddDate()直接向该资源文件的一个数据分支添加一个文件。CloseResource()关闭资源文件。LinkResource()链接资源文件中的资源,并在完成资源文件的所有编译后才执行。GetCryptoObject()返回包含当前加密设置的POLESS的ICrypto对象,如下文所述。
XXL编译器1040的类,例如cForm2020与cItem2012,处理单个的XXL核心语言元素。全部这些类将特定的XXL源元素编译到测验资源文件120内。全部这些类的语言元素也就是在后面引用中所使用的符号。因此,这些类都由cSymbol类2040派生。cSymbol类2040允许XXL编译器140的这些类驻存在一个符号表中。
例如,XXL元素插件150在XXL文件134中表示如下:
<plugin name=“helmNextPrevious”
progid=“UTDP.cNextPrevious”/>
这个XXL调用导致产生cPlugin类2036的一个实例,编译该源,向测验资源文件120写入编译结果。插件150的名称与ID也可添加到符号表中以便以后引用。
XXL编译器140同样包含下面的令牌类,例如:cToken 2042;cTokenCreatorNoRef 2044;cTokenCreator 2046;CtokenCreatorRef 2048;cTokenCreatorBase 2050;以及cTokenFactory 2054。这些令牌类别包含令牌的标识。在识别后,令牌转成符号。符号可以是由cSymbol派生的任何类,如cTemplate,cSection等等。
XXL编译器140还包含下面的符号表类,例如:cPluginSymbolTable2058;cTemplateSymbolTable 2060;cSymbolTable 2062;cFFGSymbolTable 2064;cSGPSymbolTable 2066;和cSymbolTableBase2068。这些类别是各种符号表。对于不同组的符号有不同的符号表。一个组的符号定义该符号的一个名称空间。通用的符号表函数位于基本的符号表类和模板中。
指定对应于一个插件150的所有内容和规定出现于XXL的数据元素中。例如,以下是XXL中的一个项目定义:
<item name=“wantABreak1”skipAllowed=“false”>
<data>
<multiChoice
correctAnswer=“A”
maxResponses=“1”
minResponses=“1”
autoPrompt=“false”
URI=“itembank/info_item.htm#wantABreak”/>
</data>
</item>
项目元素由一个cItem类2012对象来处理。XXL定义中的数据元素由cData类2004对象来处理。插件150的项目插件156从cData类2004对象接收要编译的源,在本示例中,其为一个多项选择(multiChoice)元素。
cWrapXML类2052是用于一个XML DOM节点的包装(wrapper)类,支持错误处理。cCustomAttributes类2056编译用户属性XXL元素。cWrapPropertySet类2070是用于POLESS特性存储的一个包装类。
III.测验驱动器接口和类
A.接口
图7展示出测验驱动器110,UAS 174,以及用以提供测验的介于测验驱动器110和UAS 174二者之间的接口。UAS 174定义ILaunch2接口177,该接口被UAS 174用于启动测验事件。ILaunch2接口177是ILaunch接口178的扩展,在本发明的其它实施例中,ILaunch接口178也被UAS174用来启动测验事件。UAS 174也定义并实现其它接口,例如:IAppointment接口176;IPrint接口198;及ITransfer接口199。IAppointment接口176将来自UAS 174的应试者的候选者信息以及约定细节传送到测验驱动器110,如连接IAppointment接口176与测验驱动器110的虚箭头所示。IPrint接口198允许UAS 174向打印机198传送与报告例如分数报告有关的打印请求。ITransfer接口199允许UAS 174要求来自候选者测验结果文件180的信息返回到UAS 174。
测验驱动器110定义各种接口,以使测验驱动器110得以与基于计算机的测验提供系统100的各不同部分进行通信。例如,测验驱动器110包括10个COM接口169,用以与插件150通信和传送数据。(参见以上表1)在图7中的COM接口169指的举例来说是下列接口:IDisplay接口169a;IHelm接口169b;IItem接口169c;IUnitTimer接口169d;ISelection接口169e;INavigate接口169f;IScore接口169g;IResults接口169h;IReport接口169i;以及IPlugin接口169i。
测验驱动器110和插件150例如使用以下三个IPersistResource接口192与测验资源文件120传递和传送数据:IPersistResourceStream192a;IPersistResourceSet接口192b;以及IPersistResourceStore接口192。IPersistResource接口192是在测验源文件130的编译过程中由插件150使用、并在测验的提供过程中由测验驱动器110和插件150共同使用的。在测验源文件130的编译过程中,XXL编译器140将插件150引导到测验资源文件120的存储地址,以存储插件150已确认有效的任何信息。然后,插件150可在测验的提供过程中从测验资源文件150中检索所存储的信息。也可选择使用其它数目的接口以及各种功能的不同组合。
来自插件150或来自XXL编译器140的信息举例来说作为一个数据流、作为一组数据、或是作为一个存储装置,一般被存储到测验资源文件120中,这取决于三个IPersistResourceStore接口192中,被实现的用于将来自插件150的信息存储到测验资源文件120中的是哪一个接口。例如,IpersistResourceStream 192a以数据流或其它数据存储格式来保存该信息。数据流仅仅是以线性顺序存储的比特流。例如,IPersistResourceSet接口192b将信息作为一组数据来保存。一组数据最好是一个名称-数值特性对。例如,项目的特定特性的名称是扰乱选项,而数值则是需要用于这一项目的扰乱选项的数量。IPersistResourceSet接口192允许在测验资源文件120中将名称-数值特性对保存在一起。举例来说,IPersistResourceStore接口192c以目录格式借助存储区保存信息。该目录格式允许在存储区内保存其它数据流,允许在存储区内保存其它特征组,并且保存在该存储区之下次一级的存储。
IPersistInstance接口196举例来说同样包括三个不同接口,例如:IPersistInstanceStream接口196a;IPersistInstanceSet接口196b;以及IPersistInstanceStore接口196c。测验状态信息被保存在测验实例文件170中,例如作为数据流、作为数据组或作为存储元素,这取决于所实现的是三个IPersistResource接口192中的哪一个接口。
两个接口,即IContainerNotify接口200和IContainerNotifyHelm接口206,用作从插件150到测验驱动器110的调用返回接口。举例来说,IContainerNotify接口200允许一个可视插件告知测验驱动器110,该插件是被显示的并准备用于应试者的交互。IContainerNotifyHelm接口206允许指导插件154在接收到来自应试者的转移到测验的另一部分的输入后,要求来自测验驱动器110的导航。IMore接口202被用于传达应试者是否已看到一个展示中的所有内容。例如,在所述内容超出窗口的长度时,在下一个按钮的位置就出现一个“更多(more)”按钮。当应试者滚动到最底部时,该“更多”按钮消失,并代之以“下一个(Next)”按钮。测验驱动器110使用选择(Collection)接口204以保持任何群实体(groupentity),如测验的类别或部分。
其余接口例如是Microsoft定义的活动文档(Active Document)接口,用以实现测验驱动器110与可视插件即显示插件152、指导插件154及项目插件156的OLE链接功能。IOleInPlaceFrame接口210控制所述容器的最高一级帧窗口,这涉及到允许该容器向复合菜单内插入其菜单组,将该复合菜单安装到适当的窗口帧中,以及从该复合菜单中删去所述容器的菜单元素。IOleInPlaceFrame接口210设置和显示与终止位置的对象有关的状态文本。IOleInPlaceFrame接口210也允许或禁止各帧无模式对话框,并翻译要用于该容器的帧的加速键敲击。IOleInPlaceUI窗口接口211由容器应用程序实现,并由对象应用程序使用,以设法在文档或帧窗口上有更广空间。所述容器提供一种RECT结构,在该结构中,对象可放置工具栏和其它类似的控制工具,确定工具在实际上可否安装在对象的窗口帧周围,为边界分配空间,并在对象、每个帧以及文档窗口之间建立连接通道。IAdviseSync接口212使得容器和其它对象能够接收数据变化的报告,检查变化以及在关心的对象中所发生的复合文档变化。例如,容器应用程序要求这些报告来保持其链接和嵌入对象的高速缓存的展示得到更新。
对IAdviseSync接口212方法的调用是同步的,因此不等待调用的返回信息即发送该调用并且随后执行下一个指令。IOleWindow接口213提供了下面的方法:允许一个应用程序获得参与现场激活的各窗口的句柄,并且进入和退出上下文有关的帮助模式。IOleInPlaceSite接口214管理现场客户站点在所述容器与对象之间的交互作用。客户站点是嵌入对象的显示站点,并提供关于该对象的位置和概念化信息。IOleClientSite接口215是一个主要工具,嵌入对象借助于该工具获得有关其显示站点的位置和范围、其别名、其用户接口以及其它为其容器所提供的资源的信息。测验驱动器110调用IOleClientSite接口215为的是请求来自容器的服务。容器必须为其包含的每一个复合文档提供IOleClientSite接口215的一个实例。IOleDocumentSite接口216使一个已被实现的文件作为文档对象,从而绕过现场激活对象的正常激活序列,而直接指示其客户站点将其作为文档对象进行激活。具有这一能力的客户站点被称为“文档站点”。
B.核心类
图8A和8B示出测验驱动器110和测验驱动器110与插件150之间的接口的主类。图上还显示了连接UAS 174的类。如先前描述的,ITransfer接口199、IPrint接口198、ILaunch2接口177和IAppointment接口176代表从测验驱动器110到UAS 174的连接。图8中所描画的一些线是实线,一些是虚线。实线,例如是在IcResults接口240与cEvent类252之间的,代表继承。而虚线,例如在IExam接口222与IPlugin接口169j之间的,则代表实例化(instantiation)。
继承或广义化涉及到类之间的广义关系,其显示出子类共有在一个或多个超类中所定义的结构或特点。一个广义关系是一条以箭头指向超类的实线。实例化或依赖性代表两个类之间或类与接口之间的关系,表示客户类依赖于供给类/接口来提供特定服务。箭头指向供给类/接口。供给类给予客户类的一些服务举例来说包括:客户类存取在供给类/接口中定义的一个值(常量或变量);客户类的方法调用供给类/接口的方法;以及使客户类方法具有签名,其返回类或参数是所述供给类/接口的实例。为了实例化,在图8中展示出当关系表示包容性时该关系的基数。基数指定了一个类中可以有多少实例与另一个类中的单一一个实例相关。可显示出关系的基数以表明一个类的一个实例与其它类的各实例之间所允许的链接的数量。
测验驱动器110也具有几个接口和实现类。例如,测验驱动器110接口包括:IExam接口222;IMsgBox接口224;ICategory接口232;IForm接口238;IcResults接口240;IcReport接口242;IScript接口246;ISection接口250;IPresentation接口248;和/或IcItem接口256。例如,实现主接口的类包括:cScreenMinimum类226;cFormGroup类228;cPlugin类230;cArea类234;cTemplate类236;cActivePlugin类250;和cEvent类252。前缀以“Ic”的接口具有已存在的、举例来说用以使项目插件156实现IItem接口169c的插件150的名称。然而,IcItem接口256是以测验驱动器110类cItem(未示出)实现的接口。当然,可使用任意数量的接口,这取决于所需要的功能。
核心类cExam(未示出)实现ILaunch2接口177,以使得UAS 174可以控制测验驱动器110。实现IAppointment接口176的约定对象是UAS174提供给测验驱动器110的主对象。该约定对象借助于IPlugin接口169i而对插件150是可用的。而且,所有插件150也都利用IPlugin接口169取得(IExam)。
cExam类利用cFromGroup类228和IForm接口238选择和提供表格。表格则利用IcResults接口240提供结果,利用IcReport接口242提供报告,并利用ISection接口250提供包含在测验中的各部分。处于测验提供链中的各类最好由cEvent类252派生。
cResults类(未示出)提供一个结果插件166,该插件实现IResult接口169i。cReport类(未示出)提供一个实现IReport接口169h的报告插件168。cSection、cGroup和cFrom类(未示出)使用几个不可视的插件150来控制提供测验。这些插件150是实现IUnitTime接口169d的计时器插件158、实现ISelection接口169e的选择插件160、实现IScore接口169g的计分插件164、实现INavigate接口169f的导航插件162。CPresentation类(未示出)向其模板供应数据以显示所述展示。三个可视的插件150是通过cTemplate类236和子对象cArea类234来创建和控制的。项目插件156在cItem类(未示出)具有一个扩展类,其包装项目插件156,并提供所有项目插件156所实现的通用的扩展服务。测验驱动器110中的cItem类是一个包装类。cItem类提供两种基本服务,例如:通用的项目功能以及对项目插件156的访问(这是包装功能)。项目通用功能举例来说包括:具有一个项目名称,具有一个项目标题,确定该项目是否被计分或未被计分,确定该项目是否已被展示给应试者,等等。这些服务对所有项目是通用的,并且是由测验驱动器110提供的。项目插件150完成项目的实际计分,这对每一个项目类型是唯一的。项目插件150展示项目的内容并允许应试者与项目交互动作。这些服务对每个项目类型是唯一的。
除了上文所描述的接口,测验驱动器110还实现IRegistry接口220,其允许VB代码访问Windows注册表。测验驱动器110也实现ILegacyItem接口258和ILegacyScore接口260,它们是为测验驱动器110所定义并由特定的项目插件156和计分插件154来实现的。ILegacyItem接口258和ILegacyScore接口260允许已存在于原有测验驱动器中的旧项目类型,以便报告类似于原先测验驱动器的结果。对于有些测验,测验驱动器110必须为旧项目类型报告结果,而其具有非常特别的报告结果的方式。ILegacyItem接口258和ILegacyScore接口260允许表示旧项目类型的新项目插件156努力模仿原有的测验驱动器而向结果插件166报告这种原有格式的信息。
对测验驱动器110类和接口的完整描述包含在附录A中。
IV.POLESS
所有的持久性存储、测验资源文件120和测验实例文件170都最好利用POLESS。POLESS允许数据是嵌入的、链接的,或作为从持久性存储到测验驱动器110和活动文档容器应用程序112(图3)的外部文件的引用。POLESS支持分层的树形结构,其带有节点或分支层的添加、替代和删除。POLESS也支持在节点层的选择性数据加密。所采用的加密类型取决于持久性存储中的信息的目的地。例如,不同的加密键可选择性地用于被路由到测验中心的数据、被路由到管理数据中心的数据、和被路由供客户使用的数据(例如供客户检查)。最好应用MicrosoftCryto-API来完成持久性存储中的数据加密。最后,POLESS也支持在节点层的可选压缩,最好使用Lempal-Zev压缩。
POLESS是OLE结构化存储复合文档实现的一种扩展。一个复合文档是一个单个文档,其包含诸如文本、图形、电子数据表格、声音和视频剪辑的数据结构的一个组合。该文档可嵌入附加数据类型,或通过某种指针引用外部文件。对结构化存储而言有几个优点。结构化存储通过将单个文件视为一个被称作存储元素和流的各对象的结构化集合,来提供文件和数据的持久性。另一个优点是增量访问(incrementalaccess)。如果测验驱动器110或插件150需要访问在复合文件内的一个对象,则只有该特定对象需要被载入和存储,而不是整个文件。另外,结构化存储支持事物处理。测验驱动器110或插件150能够以事务处理模式读取或写入复合文件,其中所做的变化可随后被付诸实施或被恢复。
A.POLESS组件
图9示意支持POLESS的主要组件和连接各组件的接口。POLESS300可以是测验资源文件120或测验实例文件170。POLESS 300利用PKware库组件330进行存储压缩和解压缩。POLESS 300使用Crypto API组件332(其为一个微软应用程序)进行存储加密和解密。Crypto API组件332依赖于所提供的密码服务(“CSP”)334来执行实际的加密算法。对这些组件的服务的访问由这些组件暴露的标准(API)接口来实现。
OLE2SS组件310包含组成结构化存储的所有接口定义。这些接口可以通过任何结构化存储实现来获得,如复合文档实现OLE2 320和POLESS 300。所述接口例如包括:IStream接口340;ISequentialStream接口342;IStorage接口344;和IRootstorage接口346。另外,POLESS 300实现IStreamVB接口348和IStorageVB接口350。
IStreamVB接口348支持多个函数,例如:ReadVB();WriteVB();Clear();Reset();get_sName();get_oStream();和CopyTo()。ReadVB()将指定数量的字节读取到一个数据数组中。WriteVB()将字节数据写到流中。Clear()清除所有数据的流。Reset()将位置设定到流的开始。get_sName()是一个只读函数,它返回流的名称。get_oStream()是一个只读函数,它返回IStream接口348。而CopyTo()将一个源流拷贝到一个目的流。
IStorageVB接口350支持多个函数,例如:Clear();CommitVB();RevertVB();sElementName();bStorage();oElemen();CreateStream();OpenStream();CreateStorage();OpenStorage();get_sName();get_oStorage();get_nCount();GetCompression();GetEncryption();GetCRC();CreateStreamLinked();CreatePropertyStg();OpenPropertyStg();SetClass();RegisterAlias();Destroy();和get_ElemenType()。Clear()清除所有元素的存储。CommitVB()导致事务处理模式改变被反映在父带中。RevertVB()放弃自最后改变以来所做的变化。sElementName()返回元素的名称。bStorage()在元素是一个子存储时返回“真”。oElemen()返回元素的IStreamVB接口348或IStorage接口VB350。CreateStream()则创建和打开一个流,并返回IStreamVB接口348。
OpenStream()打开一个流并返回IStreamVB接口348。CreateStorage()创建和打开一个嵌套存储并返回IStreamVB接口348。OpenStorage()打开一个现有存储并返回IStreamVB接口348。get_sName()是一个只读函数,它返回存储名。get_oStorage()是一个只读函数,它返回IStorage接口350。get_nCount()是一个只读函数,它返回元素的一个计数。GetCompression()返回文件压缩的状态。GetEncryption()返回文件加密的状态。GetCRC()返回文件CRC校验的状态。CreateStreamLinked()创建和打开一个链接流,并返回IStreamVB接口348。CreatePropertyStg()创建和打开一个特性存储,并返回IPropertyStorageVB接口414。OpenPropertyStg()打开一个特性存储,并返回IPropertyStorageVB接口414。SetClass()设置存储的CLSID。RegisterAlias()注册一个可插协议(pluggable protocol)。Destroy()破坏指定元素。get_ElemenType()是一个只读函数,它返回元素的类型。
B.POLESS类
图10A和10B示出POLESS 300的主类、用于实现类的接口、及流424和存储426的创建流程。cFileRoot类400是被实例化的第一个对象,并被用于创建一个新的或打开一个现有的POLESS文件。cStorageRoot类406被返回,它是cStorage类410的一个略微过载的版本。由cStorageRoot类406创建或打开cStream类408和cStorage类410,而由它们又可分别创建或打开那些类的任何流或存储和子存储。例如,cStorage类410创建cPropertyStorage类412,它又创建特性组的存储。这些类实现执行操作和/或定义属性的接口,其中的属性又定义类的功能或特性。POLESS300类和接口的完整描述包含在附录B中。
1)cFileRoot类
cFileRoot类400是根POLESS类,并控制所有POLESS文件的创建和打开。在可创建任何其它POLESS对象之前,cFileRoot类400通常被首先实例化,不过其它顺序也是可能的。cFileRoot类400实现IFileRoot接口401,它在图10中与cFileRoot类400是并置的。IFileRoot接口401被用于每次打开一个文件,并且直到所有其它存储对象426、流对象424和特性存储接口被释放,并且准备关闭文件时才被释放。cFileRoot类400和IRoot接口支持下列操作,例如:StorageFileCreate();StorageFileOpen();CryptoGet();bStorageFile();StorageAmalgamatedGet();DeltaFileCreate();DeltaFileApply();GetObjectFromPath();CreateStreamFromBSTR();MemoryStreamFromStream();GetPicture();和Save Picture()。
StorageFileCreate()创建一个新的存储文件,将根存储返回到接口,通过将该类的类ID(“CLSID”)存储在根存储内的一个流中而将该新的结构化存储文件标记为POLESS文件。StorageFileOpen()打开一个现有的存储文件,并返回根存储接口。CryptoGet()获取一个被配置成默认的密码类,并且应该在存储文件的打开和创建时被设置和使用。如果被提供的文件是一个OLLE结构化存储文件而不是POLESS存储文件,则bStorageFile()返回为真。StorageAmalgamatedGet()获取一个空的小cStorageAmalgamated类404。DeltaFileCreate()通过将原始POLESS文件与经过更新的POLESS文件加以比较来创建一个POLESS差别文件。DeltaFileApply()应用一个POLESS增量文件,并且将原始POLESS文件应用到该增量文件,从而创建出一个经过更新的POLESS文件。GetObjectFromPath()使用别名来检索出以路径命名的对象,并返回一个指向被检索对象的指针。CreateStreamFromFile()创建一个结构化存储流,并以文件的内容将其填充。CreateStreamFromBSTR()创建一个结构化存储流,并以指定字符串将其填充。MemoryStreamFromStream()被用来将一个流拷贝到一个新创建的存储流对象。GetPicture()从流对象424载入一个图像。Save Picture()将该图像保存到流426内。
2)cCrypto类
cCrypto类402控制POLESS 300的加密/解密的配置。cCrypto类402具有下列属性,例如:sProviderName;eProviderType;sContainerName;和sPassword。sProviderName代表正用来执行加密/解密服务的CSP334的名称。eProviderType是CSP334的类型。密码学的范围广大并且正在成长中,有许多不同的标准数据格式和协议,它们一般被编成组或族,每一个都有其自身的数据格式设置和运行方式。即使两个族使用相同的算法,例如RC2分组密码,它们也通常会使用不同的填充机制、不同的密钥链接和不同的默认模式。Crypto API被设计如此:使CSP供给者类型代表一个特定的族。sContainerName是密钥名并且必须由cCrypto类402提供。sPassword是公共/私有密钥对的一个可选密码,并且仅能由一个操作员来输入。该密码可用于查阅磁盘及其资源文件。
cCrypto类402实现ICrypto接口401并且举例来说它们支持下列特性和方法:ProviderName;Password;FileType;Algorithm;EnumProviders();和EnumAlgorithms()。Get_ProviderName()返回密码供给者的名称。Put_ProviderName()设置密码供给者的名称。Get_Password()和Put_Password()仅用于发起者(sponsor)资源文件。Get_FileType()获取文件类型而Put_FileType()设置文件类型。Get_Algorithm()获取加密算法而Put_Algorithm()设置加密算法。EnumProviders()返回已安装的供给者列表的一个计数器。EnumAlgorithms()列举出一个用于当前供给者的算法列表。
3)cStorageAmalgamated类
cStorageAmalgamated类404是IStorage接口344的一个实现。cStorageAmalgamated类404拥有对IStorage对象的有序集合的引用。当一个流被打开时,为了找到具有所要求的流并且返回该流的第一个存储对象,cStorageAmalgamated类404搜索存储对象的集合。cStorageAmalgamated类404处理复合存储分解,并将所有其它工作委托给cStorage类410。例如,cStorageAmalgamated类404是只读的,cStorageAmalgamated类404将不允许创建流或存储,而主要是读取测验资源文件120。cStorageAmalgamated类404实现IStorageAmalgamated接口405。cStorageAmalgamated类404和IStorageAmalgamated接口405例如支持下列操作:StorageAdd();Clearstorage();OpenstorageAmalgamated();以及OpenPropertyStg Amalgamated()。StorageAdd()将一个新存储添加到存储的集合中。Clearstorage()从集合中清除所有存储对象。OpenstorageAmalgamated()以一种合并方式打开当前合并存储的一个子存储。OpenPropertyStg Amalgamated()则以一种合并方式打开当前合并存储的一个特性存储。与本发明共同待审的、在同一日期提交的、题为“EXTENSIBLE EXAM LANGUAGE(XXL)PROTOCOL FORCOMPUTER BASED TESTING(基于计算机的测验的可扩展测验语言(XXL))”的美国专利申请中详细描述了合并,在此将其引用作为参考资料。
4)cStorageRoot类
cStorageRoot类406是IStorage接口344和IRootstorage接口346的POLESS实现。cStorageRoot类406处理属于POLESS特定的任何存储对象426,然后将工作委托给cStorage类410。IRootstorage接口346支持SwitchToFile()操作,它将与存储对象相关的当前文件拷贝到一个新文件,该新文件然后被用于存储对象以及任何未作的改变。cStorageRoot类406还实现IPersistFile接口418,它提供方法,该方法允许对一个磁盘文件加载或保存一个对象、而不允许对一个存储对象或流加载或保存一个对象。因为打开一个文件所需要的信息对于不同的应用程序有很大的变化,所以关于对象的IPersistFile∷Load的实现最好还打开其磁盘文件。IPersistFile接口418从IPersist继承其定义,因此所有实现也必须包括IPersistFile接口418的GetClassID()方法。
5)cStream类
cStream类408是IStream接口340的POLESS实现。cStream类408处理属于POLESS特定的任何存储对象426,然后将工作委托给复合文档实现OLE2 320。该特定工作包括流对象424的压缩/解压缩和加密/解密。
IStream接口340例如支持下列操作:Seek();SetSize();CopyTo();Commit();Revert();LockRegion();UnlockRegion();Stat();和Clone()。Seek()将查找指针变为与流对象424的开始、流对象424的结束或当前查找指针有关的一个新位置。SetSize()改变流对象424的大小。CopyTo()将来自流对象424中的当前查找指针的指定数量的字节拷贝到另一个流对象424中的当前查找指针。Commit()确保对以事务处理模式打开的流对象424所做的任何变化被反映到父存储对象中。Revert()放弃自上次调用IStream∷Commit以来对一个事务处理流已做的所有改变。LockRegion()限制对于流对象424中指定范围的字节的访问。对这个功能的支持是可选的,这是因为有一些文件系统不提供这一操作。UnlockRegion()取消对于字节范围的访问限制(这是先前为IStream∷lockRegion限制的)。Stat()检索流对象424的STATSTG结构。Clone()创建一个新的流对象,它与原始流引用相同的字节,但提供一个独立的指向那些字节的查找指针。
IStreamVB接口348是IStream接口340的一个自动化友好版本。IStreamVB接口348举例来说支持下列操作:Read();Write();Clear();Reset();get_sName();get_oStream;和CopyTo()。Read()从流对象424读取数据。Write()将包括整个字节数组的数据写入流对象424。Clear()清除流对象424的所有数据。Reset()将流对象424的位置重置于流对象424的开始处。get_sName()返回流的名称。get_oStream返回IDispatch接口。CopyTo()将源流的内容拷贝到目的流。
6)cStorage类
cStorage类410是IStorage接口344和IcStorage接口411的POLESS实现。cStorage类410处理属于POLESS特定的任何存储对象426,然后将工作委托给复合文档实现OLE2 320。
IStorage接口344举例来说支持下列操作:CreateStream();OpenStream();CreateStorage();OpenStorage();CopyTo();MoveElementTo();Commit();Revert();EnumElements();DestroyElement();RenameElement();SetElementTimes();SetClass();SetStateBits();和Stat()。CreateStream()创建和打开一个包含在存储对象中的具有指定名称的流对象424。OpenStream()利用指定的访问许可,打开在一个存储对象中的一个现有的流对象424。CreateStorage()创建和打开在一个存储对象中的一个新的流对象424。OpenStorage()根据指定的访问模式,打开一个具有指定名称的现有存储对象426。CopyTo()将一个打开的存储对象426的全部内容拷贝到另一个存储对象。目的存储对象的布局可以与源存储对象的布局不同。MoveElementTo()将一个子存储或流对象424从存储对象426拷贝到或移动到另一个存储对象中。
Commit()将事务处理存储对象426的变化反映到父级。Revert()放弃自上一个IStorage∷Commit操作以来对存储对象426已做的所有改变。EnumElements()返回一个计数器对象,该计数器对象可被用于列举包含在一个存储对象中的存储对象426和流对象424。DestroyElement()从一个存储对象中删除指定的存储对象426或流对象424。RenameElement()给一个存储对象中的指定存储对象426或流对象424重命名。如果被底层文件系统支持,SetElementTimes()设置被指示存储元素的修改、访问和创建时间。SetClass()将指定CLSID分配给一个存储对象。SetStateBits()存储一个存储对象中的状态信息,例如可达32比特。Stat()返回一个用于打开存储对象的STATSTG结构。
IStorageVB接口350是IStorage接口344的一个自动化友好版本。IStorageVB接口350例如支持下列操作:Clear();Commit();Revert();sNameElement();bstorage();bElement():CreateStream();OpenStream();Createstorage();Openstorage();get_sName();getoStorage();get_nCount();GetCompression();GetEncryption();GetCRC();CreateStreamLinked();CreatePropertyStg();OpenPropertyStg();SetClass();RegisterAlias();Destroy();和get_ElementType()。Clear()清除所有元素例如子存储和流的存储。Commit()确保以事务处理模式对一个被打开的存储对象所做的任何变化被反映在父存储中。对于采用直接模式的非根存储对象,这种方法无效。对于一个根存储,它反映实际装置内例如一个磁盘上文件中的变化。对于以直接模式打开的根存储对象,Commit()方法总是在释放该对象之前被调用。Commit()刷新采用直接模式根存储的磁盘的所有存储缓冲区,并将在失败时返回一个错误代码。虽然释放对象对磁盘来说也就刷新了存储缓冲区,但是它不能在失败时返回任何错误代码。因此,在不是第一次调用Commit()的情况下,调用释放将导致不确定的结果。Revert()放弃自上次Commit()操作以来对存储对象已做的所有改变。
sElement()返回元素的名称。如果元素是一个子存储,则bstorage()返回为真。bElement()返回选定元素的iStreamVB接口412或iStreamVB接口414,或IStorageVB接口414或IStorageVB接口412。CreateStream()创建和打开一个包含在存储对象中的具有指定名称的流对象,如果不能创建该流,则返回为空。OpenStream()以指定访问模式打开这个存储对象内的一个现有流对象,如果不能打开该流,则返回为空。Createstorage()创建和打开嵌套在存储对象中的一个新存储对象。如果不能创建该存储,则返回为空。Openstorage()以指定访问模式打开具有指定名称的一个现有存储对象。如果不能打开该存储,则返回为空。Get_sName()返回存储的名称。GetoStorage()返回IDispatch接口,该接口将对象、方法和属性暴露给支持自动化操作的编程工具和其它应用程序。COM组件实现IDispatch接口,从而使自动化客户如Visual Basic能够访问。
Get_nCount()返回存储中的元素的计数。GetCompression()确定文件中的流当被创建时,是否可被压缩,以及被允许的流是否可被任意压缩。GetCRC()指明在文件中是要执行循环冗余码校验(“CRC”),还是要执行数字签名校验。CreateStreamLinked()创建对另一个POLESS文件中的流的链接。CreatePropertyStg()创建一个特性存储。OpenPropertyStg()打开一个特性存储。SetClass()将指定CLSID指派给一个存储对象。RegisterAlias()将一个别名注册到POLESS文件中的一个存储,以便由可插入协议访问。Destroy()破坏指定元素。Get_ElementType()是一个只读命令,它返回元素的类型。
7)cPropertyStorage类
cPropertyStorage类412实现IPropertyStorage接口413,它支持举例来说下列操作:ReadMultiple();WriteMultiple();DeleteMultiple();ReadPropertyNames();WritePropertyNames();DeletePropertyNames();SetClass();Commit();Revert();Enum();Stat();和SetTimes()。ReadMultiple()读取一个特性集中的特性值。WriteMultiple()写一个特性组中的特性值。DeleteMultiple()删除一个特性集中的特性值。ReadPropertyNames()获得给定的特性标识符的对应串名称。WritePropertyNames()创建或改变与给定特性标识符相对应的串名称。DeletePropertyNames()删除给定特性标识符的串名称。SetClass()将一个CLSID指派给一个特性集。Commit()刷新或完成对一个特性存储对象的改变,与先前描述的用命令IStorage∷Commit来实现的相同。当一个特性存储以事务处理模式被打开时,Revert()放弃自上次进行调用以来所做的所有变化。Enum()创建和获得一个指针,指向用于一个特性集内的特性的一个计数器。Stat()接收关于一个特性集的统计。SetTimes()设置一个特性集的修改、创建和访问时间。
IPropertyStorageVB接口414是IPropertyStorage接口413的一个自动化友好版本,它管理一个单个特性集的持久特性。IPropertyStorageVB接口414例如支持下列操作:ReadVB();WriteVB();Delete();CommitVB();RevertVB();SetClass();get_nCount();CopyTo();GetName();WriteMultiple();和ReadMultiple()。ReadVB()从特性集中读取一个指定特性的值。WriteVB()将一个指定特性的值写到特性集中。如果特性不存在,则创建特性/值对。如果特性已经存在,则其值将在以eAccess Write模式被打开时受到更新。Delete()从特性集中删除一个特性。CommitVB()刷新或完成如同先前描述的用命令IStorage∷Commit来实现的一个特性存储对象的变化。当一个特性存储是以事务处理模式而被打开时,RevertVB()放弃自上次进行调用以来所做的所有改变。SetClass()将指定的CLSID分配给一个特性存储对象。Get_nCount()返回特性集中的特性的计数。CopyTo()将源特性集的内容拷贝到一个目的特性集。GetName()返回指定特性的名称。WriteMultiple()写一个特性集中的特性值。ReadMultiple()读取一个特性集中的特性值。
8)cPropertyStorageAmalgamated类
cPropertyStorageAmalgamated类416实现IPropertyStorageAmalgamated接口417,它举例来说支持下列操作:PropertyStorageAdd()和ClearStorage()。PropertyStorageAdd()将一个特性集添加到特性集的集合中。ClearStorage()则清除特性集的集合。
C.POLESS测验资源文件
图11和图12-25示出根据本发明的测验资源文件120的POLESS布置。测验资源文件120存储来自测验源文件130的经过编译的信息的不同段,如图5所示。测验资源文件120包含提供测验所需要的所有内容。然而,在测验是媒体集中(media-intense)的情况下,测验资源文件120将包含用以使测验“链接”到外部内容的核心元素。XXL编译器140和插件150利用将经过编译的信息分别作为一个数据流、一个数据集或一个存储元素加以存储的IPersistResourceStream接口192a、IPersistResourceSet接口192b或IPersistResourceStore接口192中的一个接口,将经过编译的信息存储到测验实例文件120中。在一个优选实施例中,测验资源文件120的布局属于一种分层的POLESS格式,其直接实现XXL测验定义语言的格式。测验开发者使用XXL测验定义语言来创建测验源文件130的逻辑文件230和数据文件212(图5)。借助于拥有一个符合XXL测验定义语言格式的存储结构,POLESS的递增存取方面是易于实现的。XXL编译器140确定在测验资源文件120中存储着经过编译的信息的一个特定段的存储位置,即使信息由插件150中的一个插件存储到测验资源文件120内的。
图11示出测验资源文件120的主存储分支,该测验资源文件对应于XXL测验定义语言的顶层元素,以参考编号500表示。测验资源文件120的主存储分支例如有:测验分支550;窗体分支600;项目分支650;范畴分支700;模板分支750;区段分支800;组分支850;插件分支900;数据分支950;窗体组分支1000;属性分支1050;脚本分支1100;和消息框(“Msgbox”)分支1150。还可选择性地使用其它存储分支。
例如,图12中所示的测验分支550存储控制该测验的主要属性、特性和数据。测验分支550可存储不同测验的信息,这以三个垂直方向上的圆点来表示。一个特定的测验是根据存储在名称属性存储器552中的数据来识别的。此外,各种测验可以各自由一个不同的名称来识别,如名称属性存储器552周围的实线框所表示的,或是其它识别方法。例如,属性存储器554以数据流或其它数据存储格式来存储测验的版本信息555和标题信息556。标题信息556是可选的,以虚边框来表示。关于测验的任何可选择的定制信息都以特性存储或其它数据存储格式保存在自定义特性558中。关于测验窗体的信息可选择地存储在窗体特性存储器560中。一个窗体是测验事件的一个固定或实质固定的顺序。可将许多不同窗体存储在窗体存储器560中,给予测验驱动器110以控制测验进度的灵活性。窗体组存储器562以数据流或其它数据存储格式,可选择地存储关于测验窗体集合的信息。最好选择来自窗体组的一个单窗体来传送给应试者。从组中选择窗体是通过一个选择插件160来执行的。测验分支550最好包含至少一个窗体存储器560,其为独立的或是在窗体组存储器562中。关于测验的其它信息可被存储在测验分支550下。其它存储格式也可被选择使用。
图13A和13B中所示的窗体分支600,例如存储控制测验进度的主要属性、特性和数据。窗体分支600可存储各种不同窗体的信息,这以三个垂直方向上的圆点来表示。如同先前描述,一个窗体是测验事件的一个固定或实质固定的顺序。单一一个窗体是以存储在名称属性存储器602中的数据来识别的。可选择使用其它识别信息。此外,例如各种不同窗体可各自由一个不同名称来识别,以名称属性存储器602周围的实线框表示。例如,属性存储器604存储开始区段信息605、结尾区段信息606、事件信息607,以及可选择的存储版本信息608、标题信息609、允许跳过的信息610、可重新开始的信息611,它们带有信息612、高度信息613和比特深度信息614。存储在属性存储器604中的所有信息作为数据流或其它数据存储格式而被存储。开始区段信息605和结尾区段信息606举例来说分别指示测验开始和结束的区段。
例如,事件信息607指示出该窗体的测验事件顺序。每个事件有一个名称,并带有一个事件类型和一个冒号的前缀。其它格式也是可选择的。事件类型包括“区段”、“报告”和“结果”。版本信息608和标题信息609分别指示窗体的版本和标题。允许跳过的信息610指示出,例如,是否允许默认跳过区段。可重新开始的信息611指示出,例如,窗体是否可被重新启动。关于窗体的任何可选的定制信息均以一个特性集或其它数据格式,被存储在自定义存储器616中。定时器存储器628例如将有关窗体如何被计时的信息作为一个存储元素来存储。属性存储器630例如存储要与窗体使用的计时器插件158的名称。插件数据存储器632和插件数据存储器633将计时器插件158所必需的任何数据分别作为一个存储元素和一个数据流加以存储。插件数据存储器632和插件数据存储器633都是可选的。计分存储器634例如存储关于窗体的计分的信息。属性存储器636例如存储与窗体使用的计分插件164的名称。插件数据638和插件数据639将计分插件164所需要的任何数据分别存储为一个存储元素和一个数据流。
图14中所示的项目分支650例如存储主要的属性、特性和数据,它们控制要在存储控制测验过程中传送给应试者的项目或测验问题。项目分支650可存储各种不同项目的信息,这以三个垂直方向上的圆点来表示。一个单一窗体由存储在名称属性存储器652中的数据来识别。同样,不同项目可各自由一个不同名称来识别,以名称属性存储器652周围的实线框表示。例如,属性存储器654存储加权信息654、被计分信息655,以及可选择的存储允许跳过的信息656、标题信息657、开始信息658、结束信息659和条件信息660。加权信息654例如指示一个用来判断项目和对其计分的值。在一实施例中,一个项目通过默认而被给予与一个实施例对应的项目的加权,但也可使用其它值。被计分信息655例如指示项目是否被计分,与之相反的则是该项目是否被用作一个实例。默认的被计分信息655为真。允许跳过的信息656则例如指示出应试者是否可跳过项目而不作回答。
开始信息658例如指出项目开始时的脚本执行,而结束信息659例如指示出项目结束时的脚本执行。条件信息660例如指出项目是否有条件被提供给应试者。存储在属性存储器654中的信息是作为一个数据流或其它数据格式存储的。数据存储器662和数据流664存储关于项目的特性的任何信息。例如,数据存储器662或数据流664可存储一个多项选择项目的正确答案。数据存储器662和数据流664将信息分别存储为一个存储元素和一个数据流。
关于项目的任何可选的定制信息在自定义存储器中被作为数据流或其它数据格式来存储。例如,范畴存储器668存储关于项目所属于的每个范畴的信息。由于范畴分支700存储例如指定范畴内的所有项目,存储在范畴存储器668中的信息可选择而且优选是冗余的。这种可选择冗余的原因是这样测验驱动器110可快速查看任何项目的范畴。
图15中所示的范畴分支700例如存储控制测验范畴的主要属性、特性和数据。一个测验范畴提供一种分组机制,其独立于测验的提供,如必要的话,允许进行特殊的报告和计分。范畴分支700是可选择的,由虚线边框表示。范畴分支700可存储各个不同范畴的信息,这以三个垂直方向上的圆点来表示。单一一个范畴是由存储在名称属性存储器702中的数据来识别的。同样,各个不同范畴可各自由一个不同名称来识别,以名称属性存储器702周围的实线框来表示。属性存储器704存储例如完成信息705、复制信息706、内容信息707,以及任意存储例如描述信息708。完成信息705指示出例如是否范畴中的每个项目都必须出现在该范畴内或其子范畴内。复制信息706指示出例如项目是否可在该范畴内或其子范畴内出现一次以上。内容信息707确定什么可存在于一个范畴中。
描述信息708被应用在范畴内,它包含对该范畴的内容的一个描述。范畴存储器710存储例如关于名称属性存储器702中被识别的范畴下的子范畴的信息。项目存储器712指出例如存在于范畴中的任何项目。区段存储器714包含指出存在于范畴中的任何区段的信息。计分存储器716包含与范畴内项目的计分有关的信息。属性存储器718存储例如要用于项目的计分插件的名称。数据存储器720和数据流722包含为初始化计分插件164所需要的信息。数据存储器720和数据流722将信息分别存储为一个存储元素和一个数据流。
如图16所示的模板分支750存储例如控制测验中所使用的模板的主要属性、特性和数据。模板分支750可存储用于各种不同的主模板的信息,这以三个垂直方向上的圆点来表示。一个单个主模板是由存储在名称属性存储器752中的数据来识别的。同样,各种不同模板可各自由一个不同名称来识别,以名称属性存储器752周围的实线框来表示。属性存储器754存储例如拆分信息756、次序信息757,并且可选择地存储大小信息759。拆分信息656定义如何以行或列或者其它形状和/或尺寸(举例来说),将模板内的一个特定区域拆分开或者说间隔开。大小信息759指示出例如用于描述模板大小的可能值,例如像素、百分比或html语法。模板信息760存储例如关于任何要在模板之下使用的子模板的信息,其中该模板是由名称属性存储器752中的信息指定的。子模板由名称属性存储器762中的信息来识别。可存在许多子模板760,这以三个垂直方向上的圆点来表示。
区域存储器764例如指示出与模板中所使用的、由名称属性存储器752中的信息表示的区域有关的信息。在一个模板中可存在许多区域,这以三个垂直方向上的圆点来表示。每个区域都根据存储在名称属性存储器766中的信息来识别。属性存储器768例如存储可视插件名称信息760、大小信息770,并允许更多的信息771。插件名称信息760指示出例如要与区域使用的可视插件的名称。大小信息770指示出例如区域的大小,例如作为一个像素值、一个百分比值或HTML语法。插件数据772和插件数据774存储关于要在区域中使用的可视插件的信息。当模板被加载时,存储在插件数据存储器772或插件数据流774中的数据是被可视插件执行的。例如,插件数据存储器772和插件数据流774将信息分别作为一个存储元素或一个数据流存储。也可选择存储其它信息。
如图17中所示的区段分支800存储例如控制测验区段的主要属性、特性和数据。测验区段指示项目组的导航和定时,以及在该测验中的显示。区段分支800可存储各个不同区段的信息,这以三个垂直方向上的圆点来表示。一个单一区段由存储在名称属性存储器802中的数据来识别。同样,各个不同区段可各自由一个不同名称来识别,以名称属性存储器802周围的实线框来表示。属性存储器804存储例如群组信息805,并且可选择地存储标题信息806、允许跳过的信息807、开始信息808、结束信息809和条件信息810。群组信息805例如指示出区段所属的测验群组。允许跳过的信息807例如指示出区段中的项目是否可被跳过。开始信息808指出例如在区段开始时的脚本执行,而结束信息809则指出例如在区段结束时的脚本执行。条件信息810例如指示出所存在的关于区段的任何条件。与该区段有关的任何可选的定制信息在自定义特性存储器812中作为一个数据流或其它数据存储格式而被存储。自定义属性将被作为一个特性集来存储。每个属性的“关键字”将是一个字符串或其它可接受格式。
定时器存储器814存储例如与区段的定时有关的信息。属性存储器816存储例如标识要与一个区段使用的定时器插件158的信息。插件数据存储器818和插件数据存储器820存储例如定时器插件158所需要的数据。例如,插件数据存储器818和插件数据存储器820分别将信息存储为一个存储元素和一个数据串或其它可接受的格式。导航存储器822存储例如与区段中的显示和群组的传送有关的信息。属性存储器824存储例如指出哪个导航插件162要与该区段使用的信息。插件数据存储器826和插件数据流828存储导航插件162所需要的信息。插件数据存储器826和插件数据流828分别将信息存储为一个存储元素和一个数据流。图18中所示的群组分支850存储例如主要的属性、特性和数据,而上述主要的属性、特性和数据控制测验中的群组。一个群组确定测验中的事件顺序。群组分支850可存储各个不同群组的信息,这以三个垂直方向上的圆点来表示。单一一个群组是由存储在名称属性存储器852中的数据来识别的。各个不同群组可各自由一个不同名称来识别,由名称属性存储器852周围的实线框来表示。属性存储器854存储例如类型信息855、事件信息856、标题信息857和查阅名称信息858。类型信息855例如指示出群组是否是一个“群组持有者”(展示的群组)或一个“区段持有者”(“子区段群组”)。这些是互斥的。
事件信息856例如指示出测验中的事件d顺序。例如,查阅名称信息858指示出群组内的一个展示是否被用作一个查阅屏。与群组有关的任何可选的定制信息在自定义存储器860被存储为一个数据流或其它数据存储格式。例如,事件存储器862存储事件信息,如图9中所作的进一步描述。例如,计分存储器864存储与群组内的项目的计分有关的信息。例如,属性存储器866存储信息指示出哪一个计分插件164要被用于群组。例如,选择存储器872存储与群组内项目的选择有关的信息。例如,属性存储器874指示出哪个选择插件160要被用于群组。
图19A、19B、19C和19D详细示出根据本发明的一个实施例的群组分支850的事件子分支。在图19A中,事件子分支862可存储各种不同事件的信息。例如,事件子分支862将信息存储在事件名称子分支880、事件名称子分支890和事件名称子分支897中。图19B中,例如事件名称存储器880下的属性存储器881存储类型信息882、模板信息883,并且可选择性地存储标题信息884、计数信息885、开始信息886、结束信息887和条件信息888。例如,类型信息882指示事件是否是一个项目或一个显示。例如,模板信息883指示该事件所使用的模板。例如,计数信息885指示一个展示是否应该被包括在一个区段中所展示给应试者的展示总数中。一般地,带有项目或问题的展示被计数而介绍性的展示不被计数。
例如,开始信息886、结束信息887和条件信息888分别指示开始、结束和条件脚本。与事件有关的任何可选的定制信息被存储在自定义存储器889中。每个自定义属性的“关键字”将是一个字符串。再参照图19A,事件名称存储器890例如指示一个包含不同属性的不同事件。此外,图19B中的区域信息891例如指示哪个区域生成展示内容,而项目信息892在事件属于项目类型时,例如指示出关联项目的名称。另外,数据存储器893、数据流894、数据存储器895和数据存储器896包含在一个嵌套展示中所使用的信息。一个嵌套展示的关闭数据是项目或展示的内容。该数据可以是一个流、一个存储、一个对于流的链接、一个对于存储的链接或其它格式。图19C中的事件名称897例如指示图19D中的另一个事件,其包括一个子事件898。
例如,图20中所示的插件分支900存储主要的属性、特性和数据,它们控制测验所使用的任何插件150。插件分支900可存储各种不同插件的信息,这以三个垂直方向上的圆点来表示。单一年一个插件是由存储在名称属性存储器902中的数据来识别的。一个CLSID被标以插件150的名称。例如,属性存储器904存储信息以通过程序ID来识别插件150。数据存储器906和数据存储器908分别将用于插件的原始数据作为一个存储元素或一个数据流来存储。
例如,如图21所示的数据分支950存储测验所需要的任何全局数据。可选择性地存储在数据分支950下的数据可作为一个存储元素或一个数据流而被存储,其中该存储元素或数据流是由数据存储器952和数据存储器954所指示的。存储在数据分支950下的数据可以被一个插件150直接使用,或者该数据可以是被一个插件150内部使用的资源(.gif,.jpeg,.wab,.mpeg,等等)。
例如,图22中所示的窗体组分支1000存储主要的控制测验的窗体组的属性、特性和数据。窗体组分支1000可存储各个不同窗体组的信息,这以三个垂直方向上的圆点来表示。单一一个窗体组是由存储在名称属性存储器1002中的数据来识别的。不同窗体组则可各自由一个不同名称来识别,以名称属性存储器1002周围的实线框来表示。例如,属性存储器1004存储信息,指示出哪些窗体被使用于窗体组内。例如,选择存储器1006存储与窗体组内项目的选择有关的信息。例如,属性存储器1008指示哪个选择插件160要被用于窗体组。插件数据存储器1010和插件数据存储器1012存储为选择插件160所需要的任何信息。例如,属性存储器分支1050存储对测验资源文件120是全局性质的属性信息。这包括XXL编译器140[sMode]的最后执行状态、XXL语言的主[iXXLMajorVersion]和次版本[iXXLMinorVersion]。
例如,脚本分支1100存储与测验中所使用的脚本有关的信息。例如,属性存储器1102存储类型信息,该类型信息指定脚本所用的语言类型,例如VB脚本或J脚本。例如,脚本存储器1104存储测验中所使用的全局脚本,它们可被测验驱动器引用。例如,消息框分支1150存储与在测验过程中要提供给应试者的任何消息框的大小和内容有关的信息。在测验过程中,消息框可以被插件150触发。
D.POLESS测验实例文件
图26A、26B、26C和26D示出根据本发明的测验实例文件170的POLESS布局。测验实例文件170存储与当前应试者的测验有关的信息。当对一个应试者的测验开始时,即创建出测验实例文件170。当测验成功地完成时,测验实例文件170就被破坏。如果应试者因某一中断如电力故障而必须重新开始其测验时,即根据测验实例文件170恢复测验的状态。在一个优选实施例中,测验实例文件170的布局是采用一种分层的POLESS格式。如图26A所示,从根1200起的测验实例文件170的顶层存储分支举例来说是:运行分支1202;内容分支1310;和历史分支1320。根1200涉及POLESS cStorageRoot类406(图10),它实例化测验实例文件170。
例如,运行分支1202存储测验驱动器和插件150中的所有运行对象的状态信息。插件150则使用IPersistInstanceStream接口196a、IPersistInstanceSet接口196b、或IPersistInstanceStore接口196c的其中一个,分别将测验实例文件170的信息作为一个数据流、一个数据集或一个数据存储来存储。除了不包含测验状态信息的显示插件152、结果插件166、报告插件168和指导插件155之外,任何插件150都将测验状态信息存储到测验实例文件170中。测验驱动器110确定在测验实例文件170中存储着测验状态信息的一个特定段的存储位置。
测验子分支1204包含与测验有关的测验状态信息。例如,内容存储器1206存储测验状态信息1207和版本信息1208。例如,测验状态信息1207指示测验的状态,如初始化或终止。例如,模板存储器分支1210存储与测验中运行的模板有关的测验状态信息。例如,名称属性存储器1212存储计数信息1214和曾被观察的信息1215。例如,曾被观察的信息1215指示模板的内容是否已经被应试者完全看到。
窗体存储器分支1216包含与测验中所使用的窗体有关的信息。例如,内容存储器分支1218存储秒信息1219、日期开始信息1220、日期结束信息1221、当前区段信息1222和版本信息1223。例如,当前区段信息1222指示出窗体中被提供给应试者的当前区段。例如,版本信息1223指示窗体的标识。
例如,如图26B中所示的区段选择存储分支1224存储与正在被提供给应试者的窗体中的区段有关的信息。例如,内容存储器1226存储已经或将要被提供给应试者的各区段的名称。例如,名称属性存储器1228指示一个特定区段的名称。例如,内容存储器1230存储当前子信息1231、秒信息1232、日期开始信息1233、和日期结束信息1234。导航存储器1236和导航存储器1237存储导航插件162的状态信息。例如,如果导航插件162实现IPersistInterfaceSet 196b或者IPersistInterfaceStore196c,则导航存储器1236存储来自导航插件162的测验状态信息。例如,如果导航插件162实现IPersistInterfaceStream 196a,则导航存储器1237存储来自导航插件162的信息。计时器存储器1238和计时器存储器1239存储来自计时器插件158的信息。如果计时器插件158实现IPersistInterfaceSet 196b或者IPersistInterfaceStore 196c,则使用计时器存储器1238。如果计时器插件158实现IPersistInterfaceStream 196a,则使用计时器存储器1239。
例如,项目选择子分支存储器1240存储与已经或将要被提供给应试者的项目有关的信息。例如,内容存储器分支1242存储已经或将要被提供给应试者的所有项目的名称和顺序。例如,名称属性存储器1244指示一个特定项目的标识。例如,内容存储器分支1246存储展示信息1244、完成信息1248、被跳过信息1249、秒信息1250、脱水(dehydrated)信息1251、和曾被观察的信息1252。例如,展示信息1247指示项目是否已被提供给应试者。例如,完成信息1248指示项目是否已被完成。例如,被跳过信息1249指示项目是否已被跳过。例如,项目插件存储器1254和项目插件存储器1255存储来自项目插件156的测验状态信息。如果项目插件156使用IPersistInterfaceSet 196b或IPersistInterfaceStore196c,即使用项目插件存储器1254。如果项目插件156使用IPersistInterfaceStream 196a,则使用项目插件存储器1255。
在图26C中,只有当项目被脱水时(要节省存储器或当一个区段结束时),项目轻存储器(item light storage)1256才存在。脱水项目存储数据,但对于数据的操作不再有效,直到该项目被重新水合(re-hydrated)为止。例如,项目轻存储器1256存储得分候选者信息1257、得分最少信息1258、得分正常信息1259、得分最多信息1260、完成信息1261、被跳过信息1262、正确答案显示1263、回答结果1264、和正确回答结果1266。定时器存储器1268和定时器存储器1269存储来自定时器插件158的信息。如果定时器插件158实现IPersistInterfaceSet196b或IPersistInterfaceStore 196c,即使用图26B中所示的定时器存储器1268。如果定时器插件158使用IPersistInterfaceStream 196a,则使用定时器存储器1269。得分存储器1270和得分存储器1271存储来自定时器插件158的信息。如果定时器插件158实现IPersistInterfaceSet 196b或IPersistInterfaceStore 196c,即使用定时器存储器1270。如果定时器插件158使用IPersistInterfaceStream 196a,则使用得分存储器1271。
在图26C中,群组选择子分支存储器1272举例来说指示出哪些群组已经或将要被提供给应试者。例如,内容存储器1274存储群组的名称。例如,名称属性存储器1276指示一个特定群组的名称。例如,内容存储器1278存储各群组的名称以及各群组的顺序。计分存储器1280和计分存储器1281存储来自计分插件164的测验状态信息。如果计分插件164实现IPersistInterfaceSet 196b或IPersistInterfaceStore 196c,即使用计分存储器1280。如果得分插件164实现IPersistInterfaceStream 196a,则使用计分存储器信息1281。选择存储器1282和选择存储器1283存储来自选择插件160的信息。如果选择插件160实现IPersistInterfaceSet 196b或IPersistInterfaceStore 196c,即使用选择存储器1282。如果选择插件160实现IPersistInterfaceStream 196a,则使用选择存储器1283。图26D中的传送存储器1284举例来说存储被选择提供的群组的一个有序列表。例如,被提供存储器1285存储窗体的子类的一个有序列表,如区段、报告和结果。
例如,展示选择存储器分支1286指示已经或将要被提供给应试者的任何展示。例如,内容存储器1288存储该展示的名称。例如,名称存储器子分支1290存储该展示的名称。例如,名称存储器1290也存储注释信息1281、标记信息1292、计数信息1293、名称信息1294、曾被观察信息1295、名称信息1296、和曾被观察信息1297。例如,名称信息1294和被观察信息1295(它们与存储在展示选择存储器分支1286下的第一个展示区域的名称和该展示是否已被观察有关),以及名称信息1296,指示出被提供给应试者的最后一个展示区域以及该展示是否曾经被观察。例如,内容存储器1298存储导致事件的信息。例如,内容存储器1298存储准备信息1299、已校验信息1300、已开始信息1301、和已完成信息1302。例如,准备信息1299指示事件是否被准备提供给应试者。例如,已校验信息1300指示一个事件的有条件提供脚本是否经过了校验,最好是有条件提供脚本只被校验一次。例如,已开始信息1301指示事件是否已经被应试者开始。例如,已完成信息1302指示事件是否被应试者完成。
再参照图26A.内容分支1310举例来说存储一个特性集,其包含用以识别测验实例和测验开始计数1312的信息。所使用的识别信息是应试者约定标识1311、测验资源文件120的名称1313、和指定的窗体或群组的名称1314。
历史分支1320是记录测验历史的按年月日顺序的文本消息的一个单流。这些文本消息被在系统总部的的工作人员用来诊断发生在现场的问题。每个文本消息均前缀有日期、时间和严重程度,例如:信息,警告,或错误。测验驱动器110将文本消息包括一般信息过滤而达到所期望的一定等级,以便测验驱动器110(举例来说)确定测验驱动器110中的错误或进行详细历史跟踪。
V.利用插件的测验驱动器的扩展
图27示出基于来自客户的特定要求而定制测验的过程,该过程概括地以参考编号1400来表示。首先在步骤1402,客户向测验开发者提出新的要求,例如一个新的项目类型。然后在步骤1404,测验开发者编写XML规划以便定义XXL测验规定。该规划随后被用于确认XXL测验规定。XXL规划的一个例子如下:
<!-- [linear_navigate-schema.xml] _ -->
<!-- =========================== -->
<!--
->
<!-- <linearnavigate>
-->
<!--
-->
<!-- ATTRIBUTE REQ?DESCRIPTION
-->
<!-- initialReview no [true](false)Whether a candidate may-->
<!-- review
items from the very beginning of a -->
<!-- section
-->
<!-- markAllowed no [true](false)Whether acandidate may -->
<!-- mark items during theexam for_review -->
<!-- purposes
-->
<!-- incompleteEndAllowed no [true] (false)_Whether a candidatemay -->
<!-- end a
section that contains incomplete -->
<!-- items
-->
<!-- endSectionPrompt no The message to display When ending a-->
<!-- section
-->
<!-- endIncompleteSectionPrompt
-->
<!-- no The message to displayWhen ending a -->
<!-- section withincomplete items -->
<!-- quitExamPrompt no The message to displaywhen quiting an -->
<!-- exam.
-->
<!-- comment no [false] (true)
if the candidate can -->
<!-- makecomments during this section -->
<!-- readonly no [false](true)ifthe items are set to -->
<!-- be read-only. -->
<!-- nextOrMore no [false](true)whetherto show“Next” -->
<!-- button with“More”button-->
<!--
-->
<!-- SUB-ELEMENTS
-->
<!-- none
-->
<!--
-->
<!-- NOTES
-->
<!-- - Non-adaptive navigation plug-in.
-->
<!-- - Allows for simple“movement”between items and sections
-->
<!-- - For“markAllowed”to have an effect a helm which supports marking-->
<!-- of items must be used in the exam too.
-->
<!-- - The button labels will appear exactly_as entered including
-->
<!-- capitalization.
-->
<!-- - It is a common case to set comment=“true”and readonly=“true”and-->
<!-- re-deliver a section for the sole purpose of commenting.
-->
<!--
-->
<!-- ============================ -->
<ElementType name=“linearNavigate”order=“many”content=“empty”model=“closed”>
<AttributeType name=“initialReview”dt:type=“enumeration”dt:values=“true false”default=“true”required=“no”/>
<AttributeType name=“markAllowed”dt:type=“enumeration”dt:values=“true false”default=“true”required=“no”/>
<AttributeType name=“incompleteEndAllowed”dt:type=“enumeration”dt:values=“true false”default=“true”required=“no”/>
<AttributeType name=“endSectionPrompt”dt:type=“string”required=“no”default=“This will end your section.Do you wish to end?”/>
<AttributeType name=“endincompleteSectionPrompt”dt:type=“string”required=“no”default=“You have not fully answered all items.If you end incompleteitems will be marked as incorrecr.Do you wish to end?”/>
<AttributeType name=“quitExamPrompt”dt:type=“string”required=“no”default=“You are about to exit the exam.Do you wish to exit?”/>
<AttributeType name=“comment”dt:type=“enumeration”dt:values=“truefalse”default=“false”required=“no”/>
<AttributeType name=“readonly”dt:type=“enumeration”dt:values=“truefalse”default=“false”required=“no”/>
<AttributeType name=“nextOrMore”dt:type=“enumeration”dt:values=“truefalse”default=“true”required=“no”/>
<attribute type=“initialReview”/>
<attribute type=“markAllowed”/>
<attribute type=“incompleteEndAllowed”/>
<attribute type=“endSectionPrompt”/>
<attribute type=“quitExamPrompt”/>
<attribute type=“endIncompleteSectionPrompt”/>
<attribute type=“comment”/>
<attribute type=“readonly”/>
<attribute type=“nextOrMore”/>
</ElementType>
上述样本规划定义了与顶层XXL元素“linearNavigate”相关联的属性和元素。XXL规划的一个较详细的描述在与本专利申请共同待审的同日提交的美国专利申请中给出,其题目为“EXTENSIBLE EXAMLANGUAGE(XXL)PROTOCOL FOR COMPUTER BASED TESTING(用于基于计算机的测验的可扩展测验语言(XXL)协议)”,在此将其引用作为参考资料。
测验开发者接下来编写适当的插件150,在这个例子中是项目插件156。测验开发者还实现IPlugin接口167和IPlugin接口以及项目接口169。此外,测验开发者实现IpersistResource接口192(图3),以使得从项目插件156到测验资源文件120的编译测验信息能够持久。测验开发者还可选择在步骤1408实现IpersistInstance接口196(图3),从而使得从项目插件156到测验实例文件170的编译测验信息能够持久。在适当的接口已经被实现之后,项目插件156成为有效的并且进行工作。最后在步骤1410,当测验被提供给应试者之后,结果处理器积累得自应试者的结果。结果处理器必须能够理解新的项目类型以便正确地处理结果。为适应客户的定制,定制过程1400只要求测验开发者编写一段软件而非多段软件。
A.测验产生和测验提供
图28是示出根据本发明的测验产生和测验提供的整个方法的流程图,该方法概括地以参考编号1500来表示。测验发行者首先在步骤1502创作测验规定和内容。该测验规定和内容然后在步骤1504被存储在测验源文件130中。然后在步骤1506,测验源文件130例如XXL文件134的内容被编译和确认。经过编译的测验规定和内容在步骤1508被存储在测验资源文件120中。最后在步骤1510,经过编译的测验规定和内容被提供给应试者。
在图29中详细示出了借助以参考编号1512所表示的方法,对测验规定和内容的确认。在步骤1514,当存储在测验源文件130中的测验规定和内容特定地引用一个插件150时,该插件150被实例化。在步骤1516,与那个插件150有关的部分测验规定和内容被从测验源文件130加载到插件150。在一个可选实施例中,部分测验规定和内容被加载到一个与插件150进行数据通信的专有存储器中。在步骤1518,插件150确认部分测验规定和内容。然后,经过确认的测验规定和内容被从插件150卸载到测验资源文件120内的一个存储元素。
图30详细示出具有测验提供周期的方法。在步骤1525,当存储在测验资源文件120中的先前经过确认的测验规定和内容引用一个插件150时,该插件150被实例化。在步骤1527,测验资源文件120中包含经过确认的测验规定和内容的存储元素被提供给插件150。在步骤1529,经过确认的测验规定和内容被从测验资源文件120中的存储元素加载到插件150中。最后在步骤1533,例如包括应试者的回答的测验状态信息被存储到测验实例文件170中。
图31详细示出在中断后重新开始一个测验的方法。在测验重新开始方法1535中的步骤1537,测验驱动器被启动。在步骤1539,测验驱动器110确定该测验是否已经开始。如果测验提供还没有开始,插件150就在步骤1543从测验资源文件120重新加载经过确认的测验规定和内容。如果测验已经开始,在步骤1541,插件就从测验实例文件120中检索测验信息。然后在步骤1543,插件150从测验资源文件120中重新加载经过确认的测验规定和内容。然后在步骤1545,测验驱动器110向应试者提供测验。
B.插件使用周期
图32示出插件150从测验产生到测验提供的使用周期,其概括地以参考编号1420来表示。垂直虚线1422将插件150的使用周期1420分为一个对应于垂直虚线1422的左侧的测验产生周期,以及一个对应于垂直虚线1422的右侧的测验提供周期。测验产生周期仅当开发新的插件150以满足某一客户的要求时偶然发生。而测验提供周期则是每当测验被提供给应试者时就发生,例如每天发生。
测验源文件130,图中显示了其数据文件132和XXL文件134,包含由测验发行者编写的测验的每个方面。在步骤I中,XXL编译器140从XXL文件134读取并解释调用一个插件150的指令。插件150在测验定义语言中是同时以一个名称和一个程序标识(“prog ID”s)来识别的。当XXL编译器从XXL文件134中接收prog ID时,XXL编译器知道需要一个插件来完成测验源文件130的编译。下面是用于定义不同类型的10个插件150的一个XXL规划的一个例子:
<?xml version=“1.0”?>
<xxl version=“1.16”xmlns=“x-schema:c:\UTDSDK\xxl-master-schema.xml”>
<!--============================================== -->
<!-- -->
<!-- This contains all of the plugins used for this exam.
-->
<!-- -->
<!--==============================================-->
<!-- TIMERS -->
<plugin name=“clockTime”progid=“UTDP.StandardTimer”/>
<!-- SCORING -->
<plugin name=“testScore”progid=“UTDP.ScoreTable”/>
<!-- RESULTS -->
<plugin name=“testResults”progid=“slsOutputPlugin.cOutputResults”/>
<!--NAVIGATIONS -->
<plugin name=“refNav”progid=“REF.cNavigation”/>
<plugin name=“linearNav”progid=“UTDP.cLinearNavigae”/>
<!--SELECTIONS -->
<plugin name=“sequential”progid=“UTDP.SequentialExhaustive”/>
<!--DISPLAYS -->
<plugin name=“label”progid=“REF.udLabel”/>
<!--ITEMS -->
<plugin name=“hotArea”progid=“hotArea.hotAreaItem”/>
<plugin name=“multi”progid=“UTDP.MultiChoiceItem”/>
<!-- HELMS -->
<plugin name=“backForward”progid=“REF.udBackForward”/></xxl>
先前例子中所定义的10个插件表示8个不同类型的插件150。并不是要求所有可能类型的插件150都来构建任何一个测验。同样,对于一个特定类型,一个以上插件150被实现。在上述例子中,定义了两个导航插件162和两个项目插件156。利用Istream接口340、iNode接口1424、和IstreamVB接口348,XXL编译器140从测验源文件130读取信息,其中iNode接口1424是用于以文档对象模型(“DOM”)访问一个XML文档的节点的微软接口。例如,XXL编译器140利用调用CoCreateInstance(),来实例化所要求的插件150。CoCreateInstance()利用一个已被转换为CLSID的prog ID,创建与一个指定CLSID相关联的类的单一一个未初始化对象。
如果测验开发者已经定制调用插件150的数据,XXL编译器140可以不识别新数据。因此,XXL编译器140将数据直接传送给插件150,且插件150将该数据加载到一个专有存储器(未示出)。在一个实施例中,上述专有存储器对于插件150来说是在内部,而在另一个实施例中,该专有存储器对于插件150来说是在外部。插件150可随后利用XXL规划确认数据。如果数据是无效的,插件150就报告错误。在一个可选实施例中,插件150可利用XML文档类型定义(“DTD”)来确认数据。DTD是一个特定类型文档的XML说明语法中的一种形式描述。与一个规划类似,一个DTD陈述要将什么名称用于不同类型的元素,它们可能出现在什么位置,以及它们都是如何组合的。然而,对确认而言XXL规划是优选的,这是因为规划比DTD更容易读取并且非常灵活。
如果插件150说明数据是有效的,在步骤II,XXL编译器140就在测验资源文件120中准备一个POLESS存储对象,在来自XXL编译器的一个指令下,插件150将数据保存到该对象。如先前所描述的,XXL编译器140确定来自插件150的数据要保存在测验资源文件120中的位置,并产生适当的存储位置。与插件150关联的名称、CLSID和数据被保存在测验资源文件120中的插件分支900(图20)。插件150实现IPersistResource接口192,以将数据存储到测验资源文件120内。如果插件150分别实现IPersistResourceStream接口192a、IPersistResourceSet接口192b或者IPersistResourceStore192c,则举例来说,数据存储器906就将数据例如存储为一个数据流、一个数据集或一个存储单元。如果插件150实现IPersistResourceStream接口192a,则举例来说,数据存储器908就将数据存储为一个数据流。插件150可选择用于将数据存储到测验资源文件120中的格式。步骤I和II被重复进行,直到测验源文件130被完成编译,并且测验资源文件120被完整地填充了经过编译的测验信息为止。
在图33中详细示出了图32的步骤I和II中所示的一个插件150的编译序列。在步骤I中,当利用IPlugin∷ValidateSource()call1432,XXL编译器140要求插件150确认属于插件150的来自测验源文件130的信息时,插件编译序列1430开始。插件150确认是否从测验资源文件140接收到的数据基于XXL规划而被正确地格式化。如果该数据是无效的,插件就抛出(throw)一个结构化COM错误。插件150不确认所有被要求的源元素都出现,而是确认出现的源元素被正确地格式化。
步骤II包含两个步骤,被表示为步骤IIa和IIb。在步骤IIa中,XXL编译器140利用POLESS对象300,在测验资源文件120中创建恰当的存储元素。存储元素类型是基于插件150所实现的IPersistResourse接口192的类型而确定的,该接口例如为:IPersistResourceStream接口192a;IPersistResourceSet接口192b;或IPersistResourceStore192c。然后,XXL编译器140为恰当的IPersistResource接口调用IPersistResource*∷Save()调用1434。通过被XXL编译器140传送的POLESS对象300,插件150将来自测验源文件130的经过编译的信息保存到测验资源文件120。在步骤IIb中,XXL编译器140利用Unload()调用1436来指示插件150卸载或刷新其内容。如先前所阐述的,步骤I、IIa和IIb被重复,直到所有测验源文件130均被编译为止。
步骤VI(其被表示为步骤VIa和VIb)涉及测验资源文件120的合并。合并使得即便数据出现在存储器体系内的不同位置,也能够使对应于一个特定插件的数据虚拟地出现在一个存储位置。如果插件120已经实现了将数据存储到测验资源文件120的IPersistResourceSet接口192b或IPersistResourceStore192c,则合并可在测验资源文件120中执行。在步骤VIa中,XXL编译器140在测验资源文件120中合并一个到三个存储元素,并利用IPersistResource*∷ValidateResource()调用1438将合并的POLESS对象传送到插件150。插件150确定该合并的POLESS对象是否创建了一个完整且有效的集合。如果合并的POLESS对象没有创建一个完整且有效的集合,则插件150抛出一个结构化的COM错误。在步骤VIb中,XXL编译器140利用Unload()调用1440来指示插件150卸载或刷新其内容。步骤VIa和VIb散布于步骤I、IIa和IIb循环中,并且也可以在测验源文件130的编译过程中出现多次。合并则在与本发明共同待审、在同一日期提交的美国专利申请中被详细描述,该申请的题目为“EXTENSIBLE EXAM LANGUAGE (XXL)PROTOCOL FORCOMPUTER BASED TESTING(用于基于计算机的测验的可扩展测验语言(XXL)协议)”,在此将其引用作为参考资料。
再参照图32,在测验提供周期中,测验驱动器110通过POLESS对象300而读取存储在测验资源文件120内的测验规定。通过POLESS对象300,测验驱动器110从测验资源文件120读取信息,为的是检索测验资源文件120内的加密、压缩和结构化的元素。如先前所描述的,当XXL测验定义语言通过一个prog ID来调用一个插件150时,在步骤III中,测验驱动器110实例化被调用的插件150。测验驱动器110提供来自测验资源文件120的POLESS对象300,并且插件150利用恰当的IPersistResource接口192,根据POLESS对象300例如存储在名称属性存储器902下的数据存储器906或数据存储器908而初始化其自身。被加载到插件150的信息与测验产生周期中被插件150存储到测验资源文件120(步骤II)内的信息相同。由于插件150选择用以将信息存储到测验资源文件150中的存储格式,所以插件150总是能够从测验资源文件150读取信息,从而给予插件150完全的灵活性。测验驱动器110不需要能够读取为插件150所使用的信息。因此,借助插件150进行的任何测验的定制均不要求对测验驱动器110作任何改变。测验因此基于来自客户的新要求、借助于增强了测验驱动器110的功能的插件150而进行。
所有运行对象的状态均将周期性地基于来自测验驱动器110的或来自插件150的一个请求,而被保存到测验实例文件170,该文件是用于每个应试者的一个唯一文件,表明对应于该应试者的测验的进度和状态。测验驱动器110询问插件150,是否插件150是“脏的”——这意味着正进行保存的插件150拥有一些更新的测验状态信息。例如,当应试者对于一个多项选择项目选择了扰乱选项A时,项目插件156在这种情形下即变为脏的。如果插件150是脏的,则在步骤IV中,测验驱动器110提供插件150一个在测验实例文件170中的POLESS对象300,而插件则利用IPersistInstance接口196而将测验状态信息保存到测验实例文件170。例如,项目插件156将应试者的回答保存到项目插件存储器1254或项目插件存储器1255(图26)。如果项目插件156分别实现IPersistInstanceSet接口196b或IpersistInstanceStore接口196c,则举例来说项目存储器1254将数据保存为一个数据集或一个存储元素。如果项目插件156实现IpersistInstanceStream接口196a,则举例来说项目存储器1255将数据作为一个数据流来存储。
如果测验例如因电力故障而被中断,则发生步骤V,并且测验需要重新开始。当测验驱动器110被要求返回到一个特定操作状态时,测验驱动器110从测验实例文件170读取测验状态信息。插件150被提供以存储对象,其包含如在步骤IV中利用IPersistInstance接口196所保存的插件150的状态。利用前面的例子,项目插件156从项目插件存储器1254或项目插件存储器1255检索其状态信息。根据检索到的状态信息,插件150能够变成可操作的,从而能够在测验被中断的位置重新开始测验。
图32中的步骤II、IV和V中所示的插件150的提供序列在图34A、34B、34C和34D中被详细示出。如图34A所示,提供序列1520尤其涉及到可视插件150,例如显示插件152、指导插件154、和项目插件156。步骤III包含被标记为IIIa至IIIb的子步骤。当目前的提供展示要求其模板以cTemplate∷Active()调用1524来激活时,在步骤IIIa,插件提供序列1520开始。当应试者利用一个由指导插件154所激活的指导导航控制而在测验中航行时,Active()调用1524被激活。IContainerNotifyHelm接口206允许指导插件154请求来自测验驱动器110的导航。IContainerNotifyHelm接口206则将Active()调用1524传送给测验驱动器110中的cTemplate类236(参见图8)。
在步骤IIIb中,在测验驱动器110中的cTemplate类236使用Iplugin∷Load()调用1526,来设置从测验驱动器110到被提供的插件150的核心对象参考(core object reference)。核心对象参考包括IContainerNotify接口200、cExam类(未示出)、和将关于应试者和约定的信息传送到插件150的IAppointment接口176。
步骤V散置于步骤III中,只有在测验被中断和插件150丢失状态才发生。测验驱动器110中的cTemplate类236使用IPersistInstance*∷Reload()调用1528,调用测验实例文件170的再装入方法。测验实例文件170通过IPersistInstance接口192例如IPersistInstanceSet 192b,而将被保存到测验实例文件170中的恰当存储位置的状态再装入插件150(参见图26)。
在插件150的初始提供以及测验的重新开始过程中,均与步骤V一起执行步骤IIIc。测验驱动器110中的cTemplate类236使用IPersistResource*∷Load()调用1530来调用测验资源文件120的加载方法。测验资源文件120通过IPersistResource接口192例如IPersistResourceSet接口192b,而将来自测验资源文件120中的恰当存储位置的测验规定和内容加载到插件150。当插件150被首次提供给应试者时加载了来自测验资源文件120的测验规定和内容。而当测验曾经被中断且插件150必需恢复状态时,插件150还被加载了来自测验资源文件120的测验规定和内容以及来自测验实例文件170的测验状态信息,如上文所述。
在步骤IIId中,当插件150被正常加载后,测验驱动器110中的cTemplate类236使用I*∷PresentationStarting()调用1532(其延续到图34B中)来通知可视插件150:展示正在启动。在恰当的接口例如IDisplay接口169a、IItem接口169b、或IHelm接口169c上,对于展示中所使用的任何可视插件150应用I*∷PresentationStarting()调用1532。例如,一个Iitem∷PresentationStarting()调用被用于项目插件156。然后在步骤IIIe,cTemplate类236利用IOleObject∷DoVerb(Show,...)命令1534来指示可视插件150进行显示。IOleObject接口1522是用于实现活动文档展示的活动文档接口。IOleObject接口1522是结合图7所描述的各活动文档接口的组合。在指示可视插件150进行显示之后,测验驱动器110等待来自每个可视插件的关于指定的可视插件150已经成功显示的通知。在步骤IIIf(其延续于图34B中),可视插件150利用IContainerNotify∷Activated()调用1536,调用后返回到测验驱动器110。现在,展示被启动并且是活动的,从而使应试者可与展示交互作用。
展示的停用始于来自用以导航的指导的一个请求。例如,如果应试者已经完成了一个试题,并希望继续移动到在下一个展示上的下一个试题,则应试者可选择指导上的“NEXT”按钮。利用IContainerNotifyHelm接口106,导航请求从接收来自应试者的请求的IHelm接口169b被发送到测验驱动器110。如图34D所示,步骤IIIg利用IContainerNotifyHelm∷RequestMove()调用1538来作出该请求。然后,测验驱动器110询问每个在展示模板中正在使用的项目插件,是否应试者得到允许离开当前展示并继续进行下一个展示。在步骤IIIh,该询问是利用IItem∷bProceed()调用1540作出的。如果所有项目插件156都以肯定方式响应,则测验驱动器150将该导航请求传送给导航插件162,它是一个不可视插件150。在步骤IIII,测验驱动器110利用INavigate∷RequestMove()调用1542来传送请求。导航插件162确定被请求的导航的合成位置。例如在图34中,在步骤IIIj,导航插件162利用ISection∷ChildNext()调用1544来确定应试者将要继续进行的测验区段。
然后在步骤IIIk(其延续于图34C中),利用cTemplate∷Deactivate()调用1546,活动展示指示模板停用。参考后面的图34D,在步骤IIIl,测验驱动器110中的模板类236利用IOleObject∷DoVerb(Hide,...)调用1548,以从活动文档中隐藏请求可视插件150。在步骤IIIm,测验驱动器110中的cTemplate类236利用I*∷PresentationEnding()调用1550,来通知可视插件150当前的展示正在结束。例如,cTemplate利用IHelm∷PresentationEnding()调用,来通知指导插件154当前的展示正在结束。
步骤IV包含子步骤IVa-c,是将插件状态数据保存到测验实例文件170的过程。测验驱动器110请求插件150的“脏的”状态,以确定插件150是否正在存储当测验被中断时将会成为必需的任何状态信息。在步骤IVa,测验驱动器110利用IPersistInstance*∷IsDirty()调用1552来作出上述请求。例如,如果状态数据是一个特性集,则测验驱动器110使用IPersistInstanceSet∷IsDirty调用1552。如果插件150正在存储尚未被存储到测验实例文件170中的状态数据,则IPersistInstance*∷IsDirty()调用1552返回为真。在步骤IVb,如果插件150是“脏的”,则测验驱动器110使用IPersistInstance*∷Save()调用1554,指示插件150将状态数据保存到所提供的POLESS对象中的测验实例文件170(图26)。最后在步骤IVc,测验驱动器110使用IPlugin∷Unload()调用1556,来指示插件150卸载所有对象。
根据所述详细说明,本发明的许多特点和优点都是显而易见的,因此,所附权利要求的意图是保护本发明的所有这类落在本发明的真正精神和范围内的特点和优点。另外,由于对那些本领域技术人员而言,易于作出大量的修改和变化,所以不应将本发明局限在所例示和描述的精确方案中,因此,所有适当的修改和等效方案均可被列为落入本发明的范围内。
附录A-UTD类和接口
逻辑视图报告
目录
目 录…………………………………………………………………………………………………………………………2
逻辑视图报告……………………………………………………………………………………………………………………4
逻辑视图…………………………………………………………………………………………………………………………4
CComControl…………………………………………………………………………………………………………………… 4
CWindowImpl…………………………………………………………………………………………………………………… 4
DSADocs.DocDisplay……………………………………………………………………………………………………………4
DSADocs.docItem……………………………………………………………………………………………………………… 4
DSADocs.docReview…………………………………………………………………………………………………………… 4
IAdviseSink…………………………………………………………………………………………………………………… 5
IDispatch……………………………………………………………………………………………………………………… 5
IOleClientSite…………………………………………………………………………………………………………………5
IOleDocumentImpl………………………………………………………………………………………………………………5
IOleDocumentSite………………………………………………………………………………………………………………5
IOleDocumentViewImpl…………………………………………………………………………………………………………5
IOleInPlaceFrame………………………………………………………………………………………………………………6
IOleInPlaceObjectWindowlessImpl………………………………………………………………………………………… 6
IOleInPlaceSite……………………………………………………………………………………………………………… 6
IOleInPlaceUIWindow………………………………………………………………………………………………………… 7
IOleObject………………………………………………………………………………………………………………………7
IOleObjectImpl…………………………………………………………………………………………………………………8
IOleWindow………………………………………………………………………………………………………………………8
IPersistStorageImpl………………………………………………………………………………………………………… 8
UTDC.Browser……………………………………………………………………………………………………………………8
UTDC.GraphScores…………………………………………………………………………………………………………… 10
UTDC.TimeRemaining………………………………………………………………………………………………………… 10
UTDComm.cCommentNavigation……………………………………………………………………………………………… 10
UTDCore.Collection………………………………………………………………………………………………………… 10
UTDCore.ICompilerServices…………………………………………………………………………………………………10
UTDCore.cArea…………………………………………………………………………………………………………………11
UTDCore.cAttribute………………………………………………………………………………………………………… 11
UTDCore.cAttributes…………………………………………………………………………………………………………11
UTDCore.cCategories…………………………………………………………………………………………………………11
UTDCore.cCategory……………………………………………………………………………………………………………12
UTDCore.cEvents………………………………………………………………………………………………………………12
UTDCore.cExam…………………………………………………………………………………………………………………12
UTDCore.cForm…………………………………………………………………………………………………………………14
UTDCore.cGroup……………………………………………………………………………………………………………… 15
UTDCore.cGroups………………………………………………………………………………………………………………16
UTDCore.cItem…………………………………………………………………………………………………………………16
UTDCore.cItems……………………………………………………………………………………………………………… 16
UTDCore.cMsgBox………………………………………………………………………………………………………………17
UTDCore.cPresentation………………………………………………………………………………………………………17
UTDCore.cPresentations…………………………………………………………………………………………………… 18
UTDCore.cRegistry……………………………………………………………………………………………………………18
UTDCore.cReport………………………………………………………………………………………………………………19
UTDCore.cResults…………………………………………………………………………………………………………… 19
UTDCore.cScript………………………………………………………………………………………………………………19
UTDCore.cSection…………………………………………………………………………………………………………… 20
UTDCore.cSections……………………………………………………………………………………………………………21
UTDCore.eDirection………………………………………………………………………………………………………… 21
逻辑视图报告
UTDCore.ePluginModes……………………………………………………………………………………………………… 21
UTDCore.eScoreStatus……………………………………………………………………………………………………… 21
UTDCore.eStates………………………………………………………………………………………………………………21
UTDCore.iContainerNotify………………………………………………………………………………………………… 22
UTDCore.iContainerNotifyHelm…………………………………………………………………………………………… 22
UTDCore.iDisplay…………………………………………………………………………………………………………… 22
UTDCore.iHelm…………………………………………………………………………………………………………………22
UTDCore.iItem…………………………………………………………………………………………………………………23
UTDCore.iNavigate……………………………………………………………………………………………………………23
UTDCore.iPersistInstanceSet………………………………………………………………………………………………24
UTDCore.iPersistInstanceStore……………………………………………………………………………………………24
UTDCore.iPersistInstanceStream………………………………………………………………………………………… 24
UTDCore.iPersistResourceSet………………………………………………………………………………………………25
UTDCore.iPersistResourceStore……………………………………………………………………………………………25
UTDCore.iPersistResourceStream………………………………………………………………………………………… 25
UTDCore.iPlugin………………………………………………………………………………………………………………25
UTDCore.iReport………………………………………………………………………………………………………………26
UTDCore.iResults…………………………………………………………………………………………………………… 26
UTDCore.iScore…………………………一………………………………………………………………………………… 26
UTDCore.iSelection………………………………………………………………………………………………………… 27
UTDCore.iUnitTimer………………………………………………………………………………………………………… 27
UTDP.StandardTimer………………………………………………………………………………………………………… 28
UTDP.cBrowserDisplay……………………………………………………………………………………………………… 28
UTDP.cLinearNavigate……………………………………………………………………………………………………… 28
UTDP.cMutliChoiceItem………………………………………………………………………………………………………28
UTDP.cNextPrevious………………………………………………………………………………………………………… 29
UTDP.cSequentialExhastive…………………………………………………………………………………………………29
UTDP.cSummaryScore………………………………………………………………………………………………………… 29
UTDP.cUserSelection…………………………………………………………………………………………………………29
UTDPE.cChallenge…………………………………………………………………………………………………………… 29
UTDPE.cSLSDeliResult……………………………………………………………………………………………………… 29
UTDPE.cStandardReview………………………………………………………………………………………………………29
UTDPE.cStandardScoreReport……………………………………………………………………………………………… 29
UTDPE.cWTDResults……………………………………………………………………………………………………………29
cActivePlugin…………………………………………………………………………………………………………………29
cContainerFrameT…………………………………………………………………………………………………………… 29
cDocumentSiteT……………………………………………………………………………………………………………… 29
cEvent………………………………………………………………………………………………………………………… 30
cFormGroup…………………………………………………………………………………………………………………… 30
cPlugInT……………………………………………………………………………………………………………………… 30
cPlugin…………………………………………………………………………………………………………………………30
cScreenMinimum……………………………………………………………………………………………………………… 30
cTemplate………………………………………………………………………………………………………………………31
iAppointment………………………………………………………………………………………………………………… 31
iLaunch…………………………………………………………………………………………………………………………31
iLaunch2……………………………………………………………………………………………………………………… 31
iPrint………………………………………………………………………………………………………………………… 31
iTransfer………………………………………………………………………………………………………………………31
总计:………………………………………………………………………………………………………………………… 32
逻辑封装结构………………………………………………………………………………………………………………… 32
逻辑视图报告
逻辑视图报告
CComControl
由CWindowImpl派生的
公共操作:
CComControl():CComControl
FireOnRequestEdit(dispID:DISPID):HRESULT
FireOnChanged(dispID:DISPID):HRESULT
CreateControlWindow(hWndParent:HWND,rcPos:RECT&):HWND
ControlQueryInterface(iid:const IID&,ppv:void**):HRESULT
CWindowImpl
CWindowImpl允许你创建一个新窗口或细分现有窗口
公共属性:
m_hWnd:
公共操作:
Create():
创建一个窗口
DefWindowProc():
提供默认消息处理
GetWndClassInfo():
返回管理窗口类信息的CWndClassInfo的一个静态实例
SubclassWindow():
细分一个窗口
UnsubclassWindow():
恢复先前被细分窗口
WindowProc():
处理发送给窗口的消息
GetWindowProc():
返回当前窗口过程
GetCurrentMessage():
返回当前消息
OnFinalMessage():
接收最后一条消息之后被调用(一般是WM_NCDESTROY)
DSADocs.DocDisplay
DSA介绍和显示画面。被修改以支持新接口。
DSADocs.docItem
DSA多选项目。做图形和文本的选择器。处理话音和BSL。
被修改以支持新接口。
DSADocs.docReview
DSA检查画面。被修改以支持新接口。
逻辑视图报告
IAdviseSink
公共操作:
OnViewChange(dwAspect:DWORD,Iindex:LONG):void
建议对象的视窗已经改变
OnRename(pmk:IMoniker*):void
建议对象名已经改变
OnSave():void
建议对象已经被保存到磁盘
OnClose():void
建议对象已经被关闭
IDispatch
所有UTDCore COM接口的基类
IOleClientSite
公共操作:
SaveObject():HRESULT
保存嵌入对象。
GetMoniker(dwAssign:DWORD,dwWhichMoniker:DWORD,ppmk:IMoniker**):HRESULT
请求对象的别名
GetContainer(ppContainer:LPOLECONTAINER*):HRESULT
请求指向对象容器的指针
ShowObject():HRESULT
让容器显示对象
OnShowWindow(fShow:BOOL):HRESULT
当对象变成可视或不可视时,通知容器
RequestNewObjectLayout():HRESULT
让容器调整显示位置
IOleDocumentImpl
公共操作:
CreateView(pIPSite:IOleInPlaceSite*,pstm:IStream*,dwReserved:DWORD,ppView:IOleDocumentView**):
EnumViews(ppEnum:IEnumOleDocumentViews**,ppView:IOleDocumentView**):
GetDocMiscStatus(pdwStatus:DWORD*):
IOleDocumentSite
公共操作:
ActivateMe(pViewToActivate:IOleDocumentView*):HRESULT
激活OLE文档对象
IOleDocumentViewImpl
公共操作:
SetInPlaceSite(pIPSite:IOleInPlaceSite*):
GetInPlaceSite(ppIPSite:IOleInPlaceSite**):
GetDocument(ppunk:IUnknown**):
SetRect(prcView:LPRECT):
GetRect(prcView:LPRECT):
SetRectComplex(prcView:LPRECT,prcHScroll:LPRECT,prcVScroll:LPRECT,prcSizeBox:LPRECT):
Show(fShow:BOOL):
UIActivate(fUIActivate:BOOL):
Open():
Close View(dw Reserved:DWORD):
Save ViewState(pstm:LPSTREAM):
Apply ViewState(pstm:LPSTREAM):
Clone(pIPSiteNew:IOleInPlaceSite*,ppViewNew:IOleDocumentView**):
ActiveXDocActivate(iVerb:LONG):
逻辑视图报告
IOleInPlaceFrame
由IOleInPlaceUIWindow派生的
公共操作:
InsertMenus(hmenuShared:HMENU,IpMenuWidths:LPOLEMENUGROUPWIDTHS):HRESULT
允许容器插入菜单
SetMenu(hmenuShared:HMENU,holemenu:HOLEMENU,hwndActiveObject:HWND):HRESULT
把一个复合菜单添加到窗口外框
RemoveMenus(hmenuShared:HMENU):HRESULT
移除容器的菜单元素
SetStatusText(pszStatusText:LPCOLESTR):HRESULT
设置和显示状态文本告示
EnableModeless(fEnable:BOOL):HRESULT
启动或禁用无模式对话框
TranslateAccelerator (lpmsg:LPMSG,wID:WORD):HRESULT
翻译击键
IOleInPlaceObjectWindowlessImpl
////////////////////////////////////////////////////////////////////
IOleInPlaceObjectWindowlessImpl
公共操作:
AddRef(:void):ULONG
QueryInterface(riid:const IID&,ppvObject:void**):HRESULT
Release(:void):ULONG
UIDeactivate(:void):HRESULT
GetWindow(phwnd:HWND*):HRESULT
ContextSensitiveHelp(:BOOL):HRESULT
InPlaceDeactivate(:void):HRESULT
SetObjectRects(prcPos:LPCRECT,prcClip:LPCRECT):HRESULT
ReactivateAndUndo(:void):HRESULT
OnWindowMessage(msg:UINT,wParam:WPARAM,IParam:LPARAM,plResult:LRESULT*):HRESULT
GetDropTarget(:IDropTarget**):HRESULT
IOleInPlaceSite
由IOleWindow派生的
公共操作:
CanInPlaceActivate():HRESULT
确定容器是否可以原位激活对象。
OnInPlaceActivate():HRESULT
通知容器,它的一个对象被原位激活。
OnUIActivate():HRESULT
通知容器,对象将要被原位激活,以及主菜单将被复合菜单替代
GetWindowContext(ppFrame:IOleInPlaceFrame**,ppDoc:IOleInPlaceUIWindow**,IprcPosRect:LPRECT,IprcClipRect:LPRECT,IpFrameInfo:LPOLEINPLACEFRAMEINFO):HRESULT
使一个原位对象能够取回窗口接口,该接口形成在窗口对象层,和定位对象的原位激活窗口的父窗口中的位置。
Scroll(scrollExtent:SIZE):HRESULT
指定容器滚动对象的像素数
OnUIDeactivate(fUndoable:BOOL):HRESULT
通知容器重新安装其用户接口并聚焦。
OnInPlaceDeactivate():HRESULT
通知容器,对象不再是原位活动的。
逻辑视图报告
DiscardUndoState():HRESULT
指示容器放弃其撤销状态。
DeactivateAndUndo():HRESULT
停止对象激活,并回到撤销状态。
OnPosRectChange(IprcPosRect:LPCRECT):HRESULT
对象的范围已经改变
IOleInPlaceUIWindow
由IOleWindow派生的
公共操作:
GetBorder(IprectBorder:LPRECT):HRESULT
指定工具栏的RECT结构,并且控制。
RequestBorderSpace(pborderwidths:LPCBORDERWIDTHS):HRESULT
确定工具是否可被安装在对象的窗口外框周围。
SetBorderSpace(pborderwidths:LPCBORDERWIDTHS):HRESULT
为边框分配空间。
SetActiveObject(pActiveObject:IOleInPlaceActiveObject*,pszObjName:LPCOLESTER):HRESULT
提供对象与每个文档和框架窗口之间的直接通信。
IOleObject
公共操作:
AddRef(:void):ULONG
QueryInterface(riid:const IID &,ppvObject:void**):HRESULT
Release(:void):ULONG
SetExtent(dwDrawAspect:DWORD,psizel:SIZEL*):HRESULT
GetExtent(dwDrawAspect:DWORD,psizel:SIZEL*):HRESULT
SetClientSite(pClientSite:IOleClientSite*):HRESULT
GetClientSite(ppClientSite:IOleClientSite**):HRESULT
SetHostNames(:LPCOLESTR,:LPCOLESTR):HRESULT
Close(dwSaveOption:DWORD):HRESULT
SetMoniker(:DWORD,:IMoniker*):HRESULT
GetMoniker(:DWORD,:DWORD,:IMoniker**):HRESULT
InitFromData(:IDataObject*,:BOOL,:DWORD):HRESULT
GetClipboardData(:DWORD,:IDataObject**):HRESULT
DoVerb(iVerb:LONG,:LPMSG,:IOleClientSite*,:LONG,hwndParent:HWND,IprcPosRect:LPCRECT):HRESULT
EnumVerbs(ppEnumOleVerb:IEnumOLEVERB**):HRESULT
Update(:void):HRESULT
IsUpToDate(:void):HRESULT
GetUserClassID(pClsid:CLSID*):HRESULT
GetUserType(dwFormOfType:DWORD,pszUserType:LPOLESTR*):HRESULT
Advise(pAdvSink:IAdviseSink*,pdwConnection:DWORD*):HRESULT
Unadvise(dwConnection:DWORD):HRESULT
EnumAdvise(ppenumAdvise:IEnumSTATDATA**):HRESULT
GetMiscStatus(dwAspect:DWORD,pdwStatus:DWORD*):HRESULT
SetColorScheme(:LOGPALETTE*):HRESULT
逻辑视图报告
IOleObjectImpl
公共操作:
AddRef(:void):ULONG
QueryInterface(riid:const IID &,ppvObject:void**):HRESULT
Release(:void):ULONG
SetExtent(dwDrawAspect:DWORD,psizel:SIZEL*):HRESULT
GetExtent(dwDrawAspect:DWORD,psizel:SIZEL*):HRESULT
SetClientSite(pClientSite:IOleClientSite*):HRESULT
GetClientSite(ppClientSite:IOleClientSite**):HRESULT
SetHostNames(:LPCOLESTR,:LPCOLESTR):HRESULT
Close(dwSaveOption:DWORD):HRESULT
SetMoniker(:DWORD,:IMoniker*):HRESULT
GetMoniker(:DWORD,:DWORD,:IMoniker*):HRESULT
InitFromData(:IDataObject*,:BOOL,:DWORD):HRESULT
GetClipboardData(:DWORD,:IDataObject**):HRESULT
DoVerbPrimary(prcPosRect:LPCRECT,hwndParent:HWND):HRESULT
DoVerbInPlaceActive(prcPosRect:LPCRECT,:HWND):HRESULT
DoVerbShow(prcPosRect:LPCRECT,:HWND):HRESULT
DoVerbUIActivate(prcPosRect:LPCRECT,:HWND):HRESULT
DoVerbHide(:LPCRECT,:HWND):HRESULT
DoVerbOpen(:LPCRECT,:HWND):HRESULT
DoVerbDiscardUndo(:LPCRECT,:HWND):HRESULT
DoVerb(iVerb:LONG,:LPMSG,:IOleClientSite*,:LONG,hwndParent:HWND,IprcPosRect:LPCRECT):HRESULT
EnumVerbs(ppEnumOleVerb:IEnumOLEVERB**):HRESULT
Update(:void):HRESULT
IsUpToDate(:void):HRESULT
GetUserClassID(pClsid:CLSID*):HRESULT
GetUserType(dwFormOfType:DWORD,pszUserType:LPOLESTR*):HRESULT
Advise(pAdvSink:IAdviseSink*,pdwConnection:DWORD*):HRESULT
Unadvise(dwConnection:DWORD):HRESULT
EnumAdvise(ppenumAdvise:IEnumSTATDATA**):HRESULT
GetMiscStatus(dwAspect:DWORD,pdwStatus:DWORD*):HRESULT
SetColorScheme(:LOGPALETTE*):HRESULT
IOleWindow
公共操作:
GetWindow(phwnd:HWND*):HRESULT
获得一个窗口句柄。
ContextSensitiveHelp(fEnterMode:BOOL):HRESULT
控制上下文相关的帮助的使能。
IPersistStorageImpl
公共操作:
AddRef(:void):ULONG
QueryInterface(riid:const IID &,ppvObject:void**):HRESULT
Release(:void):ULONG
GetClassID(pClassID:CLSID*):HRESULT
IsDirty(:void):HRESULT
Load(pStorage:IStorage*):HRESULT
Save(pStorage:IStorage*,fSameAsLoad:BOOL):HRESULT
InitNew(:IStorage*):HRESULT
SaveCompleted(:IStorage*):HRESULT
HandsOffStorage(:void):HRESULT
专用操作:
IPSI_GetIPersistStreamInit():IPersistStreamInit*
UTDC.Browser
UTD浏览器控制是一个Active X控制,
逻辑视图报告
该Active X是一个定制万维网浏览器控制,为安全起见,这个定制万维网浏览器控制被单独锁定,并支持UTDCore的脚本对象。
公共操作:
oRegistry:IRegistry*
返回注册对象的单实例。只读的。
公共操作:
get_AllowPOLESS():
获得AllowPOLESS标志
put_AllowPOLESS():
设置AllowPOLESS标志
get_AllowFile():
getsAllowFile标志
put_AllowFile():
设置AllowFile标志
get_AllowURL():
获得AllowURL标志
put_AllowURL():
设置AllowURL标志
get_RelativeFontSize():
获得相对的字型大小
put_RelativeFontSize():
设置相对的字型大小
LoadURL():
根据一个字符串来浏览一个URL
Load():
根据数据流加载浏览程序
get_oExam():
获得oExam对象
put_oExam():
设置oexam对象
get_oSection():
获得oSection对象
put_oSection():
设置oSection对象
get_oPresentation():
获得opresentation对象
put_oPresentation():
设置opresentation对象
get_oItem():
获得oItem对象
put_oItem():
放置oItem对象
get_oForm():
获得oFrom对象
put_oForm():
设置表格对象
get_oAppointment():
获得oAppointment对象
put_oAppointment():
设置oAppointment对象
get_ScrollBars():
获得Scrollbars标志
逻辑视图报告
put_ScrollBars():
设置滚动条
get_Document():
获得文档对象
Show():
使浏览器可视
Hide():
隐藏浏览器控制
Unload():
卸载浏览器控制
Refresh():
用浏览器控制来刷新页面
UTDC.GraphScores
UTD区段分数控制。该控制显示一个分数或多个分数的条形图。如果被请求从HTML传到UTDC.浏览器控制,则该控制将运行。
这些可能是:
一个分数对传递,
区段的分数,
或每个范畴的分数。
Bruce
UTDC.TimeRemaining
这是一个显示剩余时间的可视控制。它可被配置为,显示区段或考试或二者的最小值的剩余时间。它可能被配置为,当时间到了时,用消息闪烁或指示。时间点和消息是可配置的。
它应该是HTML脚本。
UTDComm.cCommentNavigation
导航把测试驱动器放入注释周期模式和再导航区段也显示在注释周期区段中的任何呈现。
UTDCore.Collection
基本UTD集合。所有其它集合类遵守这个设计。
公共属性:
Count:Long
返回一个集合中的成员数。
_NewEnum:IUnknown**
返回一个Visual Basic枚举程序对象。
公共操作:
Item(Index:Variant):Variant
通过位置或键,返回一个集合对象的特定成员。
UTDCore.ICompilerServices
提供给插件极好的特征。
公共属性:
sResourceDirectory:BSTR
获得当前被编译的资源文件的目录。
只读。
sSourceDirectory:BSTR
获得当前被编译的资源文件的目录。
只读。
逻辑视图报告
公共操作:
ParseHTML(sSonrceFile:BSTR):BSTR
将源文件载入到mshtml,并且除了指定标签的<div>之外,移除<body>中的一切。
C:\EXAM\ITEMBANK.HTM:
<div id=″Schmackaroo″>
...Some HTML here...
</div>
Parse(″C:\EXAM\ITEMBANK.HTM#Schmackaroo″)返回″...Some HTML here...″
UTDCore.cArea
对于一个插件的模板中的区域
没有IArea接口。
由cDocumentSiteT,UTDCore.iContainerNotify派生的
公共属性:
bContained:Boolean
如果为真,则插件包含在区域中作为一个活动文档。如果为假,则它是一个浮动窗口。通常全屏。
nTop:Integer
顶坐标。如果不被包含,则为零。
nLeft:Integer
左坐标。如果不被包含,则为零。
nWidth:Integer
如果是容器,则为其宽度。如果不被包含,则为零。
nHeigth:Integer
如果是容器,则为其高度。如果不被包含,则为零。
oPluginClass:cPlugin
该窗口的插件类。
oPluginActive:UTDCore.iPlugin
如果插件类是活动的,则这个是对它的iPlugin接口。
sSize:String
在拆分轴上区域的大小。可以是一个百分比,像素数或*。
UTDCore.cAttribute
公共属性:
sName:BSTR
获取属性名字符串。
value:VARIANT
获取属性值。
UTDCore.cAttributes
UTDCore.cAttribute的集合
由UTDCore.Collection派生的
UTDCore.cCategories
UTDCore.cCategory的集合
由UTDCore.Collection派生的
逻辑视图报告
UTDCore.cCategory
区段或项目的一个范畴。例如:“报告”,“目标”,“计分”公共属性;
sName:String
范畴的名字。
bComplete:Boolean
如果为真,则范畴一定包含在一个级别定义的所有区段或项目。
bDuplicate:Boolean
如果为真,则范畴允许在一个级别超过一次定义的区段或项目。
sDescription:String
范畴的描述。
colMembers:UTDCore.cEvents
应用于该范畴的区段或项目的集合。
colSubCategories:UTDCore.cCategories
UTDCore.cCategory的集合。(AKA子范畴)
eContents:eCategoryContents
只读。colMembers中的成员的允许类型。
enum{
eCategoryContent_Anything=0,
eCategoryContent_Sections=1,
eCategoryContent_Items=2,
eCategoryContent_Categories=3,
}eCategoryContents;
专用属性:
oScore:UTDCore.iScore
窗体的计分插件。
UTDCore.cEvents
IEvents包含作为IDispatch对象的可传送类。它们必须被单独询问,以确定它们的准确类型。
IEvents可以是:
cExam,cForm,cSection,cItem,cPresentation,cReport,cResults.
由UTDCore.Collection派生的
UTDCore.cExam
测验实例。驱动器的根对象暴露类。
由cContainerFrameT派生的
公共属性:
sName:String
只读测验名称。
sLanguage:String
测验内容的语言。只读。
sVersion:String
测验的版本。只读。
oActiveForm:UTDCore.cForm
当前窗体。对于一个测验,只有一个窗体可以是活动的。
eStatus:eExamStatus
eExamStatus如下:
eExam_Initializing
eExam_Starting
eExam_InProgress
逻辑视图报告
eExam_Ended
eExam_Terminating
bShowResponseComment:Boolean
如果为真,则候选者在注释周期中不应该查看他们的响应。
colCustomAttributes:UTDCore.cAttributes
自定义属性的集合。只读。
sTitle:String
测验标题。只读。
colCategories:UTDCore.cCategories
所有范畴的集合。
oResourceRoot:Obiect
POLESS资源文件的根存储的只读参考。接口:
POLESS.cStorageRoot,iStorage,iRootStorage,iStorage VB.
oInstanceRoot:Object
POLESS测验实例文件的根存储的制度参考。
接口:POLESS.cStorageRoot,iStorage,iRootStorage,iStorage VB.
colTemplates:UTDCore.cTemplates
资源文件中定义的所有模板的集合。
保存测验层的所有模板的平面集合(flat collection)。
colItemsChosen:UTDCore.cItems
按照它们被选择的顺序,返回被一个选择插件在测验树的任何级别所选择的所有项目。
colAllSections:UTDCore.cSections
按照它们被选择的顺序,返回被一个选择插件在测验树的任何级别选择的所有区段。
oRegistry:UTDCore.cRegistry
返回注册表对象的单实例。只读。
专用属性:
oFormGroup:cFormGroup
选自的窗体组。
Public Operations:
Minimize():
最小化UTD的主窗口。可以被调用作为消除UTD的仿真。
Restore():
恢复UTD的主窗口。可以被调用作为恢复UTD到屏幕的仿真。
GetScript():UTDCore.cScript
返回被一个插件使用的一个脚本对象。
SaveInstance():
把测验驱动器的状态保存到实例文件。所有活动对象被要求把它们自己串行化到实例文件。
参考该对象的任何一个可初始化该过程。它可能是一个项目插件,想要保存用户接口和状态信息。
驱动器将在每个展示之间保存。
GetTransfer():ITransfer
返回一个UAS传送对象,以将结果或其它文件传送给数据中心。
cExam对象不保持对该对象的参考。
GetPrint():IUASPrint
返回一个UAS打印对象,保存起来用于再版分数和其它报告。
cExam对象不保持对该对象的参考。
FatalError(INumber:Long,sSource:String,sDescription:String):
把插件中的错误报告给测验驱动程序。
逻辑视图报告
通过一个HRESULT和支持IErrorInfo,错误将被正常地报告回测验驱动器。如果错误产生于测验驱动器初始化调用以外的某件事情,则插件应该通过该方法报告错误。
一个例子使用可以是用户点击你的插件项目上的按钮。结果动作产生一个错误。
Trace(INumber:Long,sSource:String,sDescription:String):
将一个插件中的一个事件报告给测验驱动器。
Warn():
将一个警告级的跟踪消息写入实例文件。
Info():
将一个信息级的跟踪消息写入实例文件。
Start():
告诉考试候选者已经接受了测验并已经开始。为了响应eDirection_Start,通常被导航插件调用。
管理系统被告知,测验已经开始,并且候选者已经接受它。
Quit():
告诉测验候选者正在退出测验。为了响应eDirection_Quit,通常被导航插件调用。导航插件应该确认候选者的这个决定。
这导致测验驱动器完全停止提供和关闭执行。管理系统被通知候选者退出测验。
GetMsgBox():UTDCore.cMsgBox
返回一个消息框对象。
UTDCore.cForm
一个测验窗体。
由UTDCore.iContainerNotifyHelm派生的
专用属性:
oCurSection:UTDCore.cSection
测验中的当前活动区。只读。
colChildren:UTDCore.cEvents
测验的所有顶层区的集合。只读。
colCustomAttributes:UTDCore.cAttributes
自定义属性的集合。只读。
sName:String
只读窗体名。
sTitle:String
窗体标题。只读。
colItemsChosen:UTDCore.cItems
测验中选择的(即被一个选项插件返回的)所有项目的集合。这与它们的区段无关。
colAllSections:UTDCore.cSections
与其层次无关的测验的所有区段的集合。
datStart:Date
窗体开始日期和时间。
datFinish:Date
窗体结束日期和时间。
oTimer:UTDCore.iTimer
窗体的计时器。
oScore:UTDCore.iScore
窗体的计分插件。
逻辑视图报告
fTimerFactor:Single
基于ADA条件的测验定时器的因子。
sVersion:String
窗体的版本。
colDelivered:UTDCore.cEvents
窗体的所有传达的顶层区段的集合。只读。
nCurChild:Long=0
colDelivered中的最后传送的事件的索引。只读。
eStatus:eScoreStatus
返回oForm.oScore.eStatus的值。
colAllPresentations:UTDCore.cPresentations
与其级别无关的测验的所有展示的集合。
colPresentationsChosen:UTDCore.cPresentations
测验中选择的(即被一个选择插件返回的)所有展示的集合。这与它们的区段或组无关。
colSectionsChosen:
测验中选择的(即被一个选择插件返回的)所有区段的集合。这与它们的级别无关。
colAllItems:
与其级别无关的测验的所有项目的集合。
colAllGroups:
与其级别无关的测验的所有组的集合。
colGroupsChosen:
选择的所有组(即该组的选择插件在测验中已经被Reset())的集合.这与它们的级别无关。
公共操作:
SectionNext():
要求驱动器进入下一个区段或分数报告或结果的写或注释周期。
SectionPrevious():
要求驱动器进入前一个区段或分数报告或结果的写或注释周期。这通常是非法的并且不会被规定的导航插件允许。
SectionGoto(vSection:Variant):
要求驱动器进入一个指定的或编号的区段或分数报告或结果的写或注释周期。
datMinRemaining():
最小化该测验的时间剩余。
UTDCore.cGroup
公共属性:
sName:String
只读组名。
sTitle:String
只读组标题。
colCustomAttributes:UTDCore.cAttributes
自定义属性的集合。只读。
colChildren:UTDCore.cEvents
该组的展示,子区段或子组的集合。
oScoring:UTDCore.iScore
用于选择的计分插件。
colDelivered:
包含该组内所有被提供事件的展示或子区段的集合。这将不包含子组。
oSelection:UTDCore.iSelection
指向该组的当前选择插件的指针。
oSection:UTDCore.cSection
容纳该组的区段。
逻辑视图报告
UTDCore.cGroups
UTDCore.cGroup的集合
由UTDCore.Collection派生的
UTDCore.cItem
项目的一般信息。不是特定插件的材料。
该类实现IcItem和IItem接口。
由UTDCore.iItem派生的
公共属性:
bPresented:Boolean=False
如果项目已经被展示给候选者,则为真。被项目组件设置。
sName:String
只读项目名字。
sTitle:String
展示标题。只读
oScriptStart:UTDCore.cScript
在该对象执行之前要执行的脚本。
oScriptFinish:UTDCore.cScript
在该对象执行之后要执行的脚本。
oScriptConditional:UTDCore.cScript
该表达脚本被求值。如果为真,则该对象被提供。
fWeight:Double=1
与其它项目有关的项目加权。正常为1。如果要求每个项目的多重加权,则它们可被附在用户属性中。加权可能是负的。
colCustomAttributes:UTDCore.cAttributes
用户属性的集合。只读
ISeconds:Long
在项目上所花费的秒。
bScored:Boolean=TRUE
只读。如果项目要被计分,则为真。
如果为假,则fWeight和fScoreCanidateWeighted将所有为0。
bSkipAllowed:Boolean
只读特性。如果为真,则项目可被跳过。如果为真,则项目接口的bProceed()方法将不被调用。
fScoreCanidateWeighted:Double
项目的候选者的加权值。项目的判断值将乘以该值的加权。
sPluginName:String
只读插件名。插件的程序ID。
oSection:UTDCore.cSection
项目被提供到其中的区段的只读特性。
oPresentation:UTDCore.cPresentation
项目被提供到其中的展示的只读特性。
datElapsed:DATE
在项目上所花费的时间。与ISeconds相同,但是一个不同的COM类型。
UTDCore.cItems
UTDCore.cItem的集合。
由UTDCore.Collection派生的
逻辑视图报告
UTDCore.cMsgBox
该类显示具有一个候选者提示的一个消息框。该类是从IExam∷GetMsgBox()返回的。框中的消息由被调用者提供。标题可选择地被提供。按钮被呼叫者提供,但按钮标签在资源文件中的测验级别被定义。
消息框的父辈是主测验窗口。一段时间后,消息框可被设置为超时。
公共操作:
sTitle:String=UTDCore
消息框将使用的标题。读/写。
ITimeout:Long=120
以秒为单位的消息框上的超时值。读/写。
显示将返回eMsgBoxResult_Timeout。
nParentHWnd:Integer
父窗口句柄读/写。
默认是主UTDCore窗口。
公共操作:
Display(sPrompt:String,eStyle:eMsgBoxStyles):eMsgBoxResult
显示消息框。显示被请求的按钮和被提供的消息。
返回值是
enum{
eMsgBoxResult_OK=1,
eMsgBoxResult_Cancel=2,
eMsgBoxResult_Abort=3,
eMsgBoxResult_Retry=4,
eMsgBoxResult_Ignore=5,
eMsgBoxResult_Yes=6,
eMsgBoxResult_No=7,
eMsgBoxResult_Timeout=8
}eMsgBoxResults;
消息框的样式。
enum{
eMsgBoxStyle_OKOnly=0,
eMsgBoxStyle_OKCancel=1,
eMsgBoxStyle_AbortRetryIgnore=2,
eMsgBoxStyle_YesNoCancel=3,
eMsgBoxStyle_YesNo=4,
eMsgBoxStyle_RetryCancel=5,
eMsgBoxStyle_Critical=16,
eMsgBoxStyle_Question=32,
eMsgBoxStyle_Exclamation=48,
eMsgBoxStyle_Information=64,
eMsgBoxStyle_ApplicationModal=0,
eMsgBoxStyle_SystemModal=4096,
}eMsgBoxStyles;
UTDCore.cPresentation
展示的数据和当前状态。可能是一个项目或一个显示。
逻辑视图报告
由cEvent,UTDCore.iContainerNotifyHelm派生的
公共属性:
bCountPresentation:Boolean
如果为真,则呈现应该计算选择的总X或Y。“项目数”
colCustomAttributes:UTDCore.cAttributes
用户属性的集合。只读
sName:String
只读展示名称。
sTitle:String
展示标题。只读
oScriptStart:UTDCore.cScript
在该对象执行之前要执行的脚本。
oScriptFinish:UTDCore.cScript
在该对象执行之后要执行的脚本。
oScriptConditional:UTDCore.cScript
该表达式脚本被求值。如果为真,则该对象被传送。
sComment:String
用户输入该展示的注释。
bMarked:Boolean
如果项目已经被标记为稍后检查,则返回为真。被指导设置。
colChildren:UTDCore.cEvents
该展示中的项目。
集合可以是空的。
bSelected:Boolean
如果展示或其任何项目已经被一个选择插件选择用于提供,则为真。
只读
公共操作:
FindIcItem(pIItem:IItem*):IcItem*
找到给定IItem的IcItem接口。
如果IItem不在该展示中,则返回失败。
UTDCore.cPresentations
UTDCore.cPresentation的集合。
由UTDCore.Collection派生的
UTDCore.cRegistry
允许注册表查看翻译字符串
例如:
<base href=″%REG:DSAGRAPGHICS″>
into
<base href=″V:\DSA\″>
看
[HKEY_LOCAL_MACHINE\SOFTWARE\Prometric\UTD\Keywords]
逻辑视图报告
公共操作:
Lookup(sKey:String):String
通过查找注册表中的关键字和返回值,来取回字符串。
Translate(sInString:String):String
将%REG:x%中的每个出现翻译为注册表中的“X”的等值。
UTDCore.cReport
一个分数报告“区段”。
由cEvant派生的
公共属性:
oScoreReport:UTDCore.iScore
分数报告插件。
UTDCore.cResults
写结果“区段”。
由cEvent派生的
公共属性:
oResults:UTDCore.iResults
写结果的插件。
UTDCore.cScript
用VB脚本或J脚本写的一个脚本。被ActiveX脚本器执行或求值。该对象将UTD对象暴露给脚本代码。这些对象将基于提供给该对象的“父”对象的范围。
所有脚本可参见oExam,oForm和oCandidate。
如果父对象是一个区段对象,则脚本还将参见oCurSection。
如果父对像是一个展示对象,则脚本还将参见oCurSection和oCurPresentation。
如果父对象是一个项目,则脚本还将参见oCurSection,oCurPresnetation,和oCurItem。
公共属性:
oParent:Object
父UTD对象。它可以一个窗体,一个区段或一个展示。
公共操作:
Execute(sScript:BSTR):
执行sScript参数中传递的脚本代码。
EvaluateBool(sScript:BSTR):Boolean
sScript参数解析的表达式值。返回真或假。
如果代码不是返回一个布尔值的表达式,则产生一个错误。
EvaluateVar(sScript:BSTR):Variant
求sScript参数传递的表达式的值。返回一个由脚本的返回类型决定的变量。
如果代码不是一个表达式,则产生一个错误。
SetScope(oSection:ISection*,oPresentation:IPresentation*,oItem:IItem*):
设置父区段、展示和项目。脚本将使用这些作为oCurSection,oCurPresentation和oCurItem对象。任何一个/所有可被作为参考数传递,这表明脚本没有使用那个特定对象。
逻辑视图报告
AddObject(sName:BSTR,pObject:IDispatch*):HRESULT
将一个对象添加到全局脚本范围。
保护操作:
LoadGlobalScript(oStream:POLESS.IcStorage):
被测试驱动器调用,以初始化对所有稍后的脚本都共同的全局脚本。
这将被cScript所有实例共享。
oStorage参数是一个包含一个属性集的存储和一个包含全局脚本的流。
UTDCore.cSection
表示一个测验区段或子区段。可包含项目或区段。
由cEvent派生的
公共属性:
oNavigation:UTDCore.iNavigate
该区段的导航插件。
colCustomAttributes:UTDCore.cAttributes
用户属性的集合。只读
sName:String
只读区段名。
sTitle:String
区段标题。只读
oScoring:UTDCore.iScore
区段的计分插件。
oScriptStart:UTDCore.cScript
在该对象执行之前要执行的脚本。
oScriptFinish:UTDCore.cScript
在该对象执行之后要执行的脚本。
oScriptConditional:UTDCore.cScript
这个表达式脚本被求值。如果为真,则该对象被提供。
oReview:UTDCore.cPresentation
区段的检查展示。如果区段没有一个为它定义的检查,则它可能是空白的。
oCurChild:Object
正被提供的当前子对象。这可以是一个cSection或cPresentation。
datStart:Date
区段开始日期和时间。
datFinish:Date
区段完成日期和时间。
colChildren:UTDCore.cEvents
区段的展示或子区段的集合。
oSelection:UTDCore.iSelection
该区段的选择插件。
oTemplate:UTDCore.cTemplate
区段的模板。
oTimer:UTDCore.iTimer
区段的定时器插件。
dtTimeRemaining:DATE
返回区段中的剩余时间。它从iTimer插件获取剩余的秒数。然后,它将其转换为一个变量日期类型(aka VT-DATE)。
colDelivered:UTDCore.cEvents
对应于已经被展示的区段的展示或子区段的集合。
它们是按照其出现的顺序来安排的。
bComment:Boolean=FALSE
区段的注释模式。正常地被导航设置。
bItemsReadOnly:Boolean=FALSE
区段中的项目的只读模式。正常地被导航设置。只读项目不能改变它们的响应。
逻辑视图报告
nCurChild:long=0
colDelivered中最后被提供的事件的索引。只读
Public Operations:
ChildNext():
要求驱动器继续下一个展示或子区段。
ChildPrevions():
要求驱动器继续前一个展示或子区段。
ChildGoto(vPresentation:Variant):
要求驱动器继续一个被命名成编号的展示或子区段。
UTDCore.cSections
UTDCore.cSection的集合
由UTDCore.Collection派生的
UTDCore.eDirection
从一个展示继续的可能方向的枚举。
值:
eDirection_Next
eDirection_Previous
eDirection_TimeoutImmedidate(now do not wait)
eDirection_TimeoutAfter(after current presentation)
eDirection_Review(Goto the review presentation)
eDirection_Jump(Goto a specific presentation)
eDirection_Flag
eDirection_Help
eDirection_FirstIncomplete
eDirection_FirstSkipped
eDirection_FirstPresentation
UTDCore.ePluginModes
一个活动文档可以表现的可能模式的枚举。
值:
ePluginMode_Author(Not supportted)
ePluginMode_Compile
ePluginMode_Delivery
ePluginMode_Rescore(Not suportted)
ePluginMode_ProcessResults(Not suportted)
UTDCore.eScoreStatus
一个窗体/区段/组/范畴的计分状态,由计分插件来确定。
eScore_Incomplete
eScore_Complete
eScore_Failure
eScore_Pass
eScore_Taken
UTDCore.eStates
测验驱动器的状态。
eStateStart——初始化测验驱动器和读取资源文件。
eStateSectionDelivery——提供一个区段。
eStateSectionComment——注释所有区段。
逻辑视图报告
所有区段的反馈。
生成和打印一个分数报告。
写结果。
关闭测试驱动器。
UTDCore.iContainerNotify
所有插件接收该接口的一个参考。它允许它们向容器报告事件。
公共操作:
Activated():
调用表明插件已经收到展示变化和它充分准备好操作。
这包括:处理其数据以及是否可视显示。
UTDCore.iContainerNotifyHelm
被插件使用的该接口,通知容器导航。
公共操作:
RequestMove(eDirect:UTDCore.eDirection,sPresentation:String):
要求驱动器以指定的方向继续。驱动器紧接着请求导航插件的该移动。
可选的第二个参数指定展示。这仅用于JUMP。
UTDCore.iDisplay
被插件支持的接口,一个句柄标题栏,显示,非回答项目和摘要。
公共属性:
oSection:UTDCore.cSection
我们所处的区段。
公共操作:
PresentationStarting(oPresentation:UTDCore.cPresentation,oContainerNotify:UTDCore.iContainerNotify):
被测验驱动器调用,通知插件一个新的展示将开始。还有哪一个通知何时活动。
PresentationEnding():
被测验驱动器调用,通知插件展示将结束。
UTDCore.iHelm
被插件支持的接口,一个句柄导航控制或检查。象下一个、前一个或未完成。仅用户接口。告诉iNavigate插件执行实际的导航。
公共属性:
oSection:UTDCore.cSection
我们所处的区段。
公共操作:
PresentationStarting(oPresentation:UTDCore.cPresentation,oContainerNotifyHelm:UTDCore.iContainerNotifyHelm,oContainerNotify:UTDCore.iContainerNotify,bComment:Boolean):
被测验驱动器调用,通知插件一个新展示将开始。它还提供一种方式来通知测试驱动器移动。
PresentationEnding():
被测验驱动器调用,通知插件展示将结束。
逻辑视图报告
UTDCore.iItem
被插件支持的接口,一个句柄项目和仿真程序。
公共属性:
oSection:UTDCore.cSection
我们所处的区段。
fScoreMinimum:Double=0
最低的可能分数。必须小于或等于正常分数。它可以是负的。
fScoreNominal:Double=0
如果候选者没有采取行动,则为分数。必须小于或等于最大分数。必须大于或等于最小分数。正常为零。
fScoreMaximum:Double=1
最高的可能分数。必须大于或等于正常分数。
fScoreCandidate:Double=0
被候选者收到的分数。要求插件判断项目。
bCompiete:Boolean=False
如果项目完成,则为真。
bSkipped:Boolean=False
如果项目被候选者跳过,则为真。
公共操作:
bProceed(eDirect:UTDCore.eDirection):Boolean
测验驱动器将调用该方法以检查是否可以离开当前展示。
参数表式方向。
GetCorrectAnswerDisplay():String
返回显示在屏幕上的一个窗体中的正确答案。
GetCorrectAnswerResults():Byte()
返回写入结果文件中的一个窗体中的正确答案。正确答案的格式为字节的一个安全数组。
GetResponseDisplay():String
返回显示在屏幕上的一个窗体中的候选者响应。
GetResponseResults():Byte()
返回写入结果文件的一个窗体中的候选者响应。该响应的格式为字节的一个安全数组。
PresentationStarting(oPresentation:UTDCore.cPresentation,oContainerNotify:UTDCore.iContainerNotify,bReadOnly:Boolean):
被测验驱动器调用,通知插件一个新展示将开始。
PresentationEnding():
被测验驱动器调用,通知插件该展示将结束。
UTDCore.iNavigate
被插件支持的接口,一个句柄区段导航。
iNavigate的实现者必须还实现一个iContainerNotifyHelm。
由UTDCore.iContainerNotifyHelm派生的
公共属性:
nPresentations:Integer
被展示在导航范围内的所展示的被计数的数量。
一个复合项目中的每个项目算为一个。
bItemsDetermined:Boolean
如果展示在导航范围内的项目数被确定,则为真。自适应项目或区段可以对此加以阻止。
逻辑视图报告
公共操作:
bNavigateAllowed(eDirect:UTDCore.eDirection):Boolean
如果所提供的方向导航被允许,则返回为真。在每个展示之前对此询问正是指导的工作。
这是区段的资源文件插件数据和当前状态的组合。
例子实现:
测验设计者被允许配置是否使向前按钮出现。但如果我们处在一个区段的第一个展示,则它即使被配置也不会出现。
Starting(oSection:UTDCore.cSection):
区段开始。
Ending():
区段结束。
UTDCore.iPersistInstanceSet
想要持续在实例文件中作为一个特性组的插件的接口。
公共属性:
IsDirty:Boolean
如果对象需要把状态保存到实例文件,则返回为真。
公共操作:
Save(oPropSet:POLESS.IPropertyStorageVB):
被测验驱动器调用,把插件数据保存到实例文件。
Reload(oPropSet:POLESS.IPropertyStorageVB):
被测验驱动器调用,从实例文件中重新载入插件数据。
IPersistResource*∷Load将紧接着被调用。
UTDCore.iPersistInstanceStore
想要持续在实例文件中作为一个存储的插件的接口。
公共属性:
IsDirty:Boolean
如果对象需要把状态保存到实例文件,则返回为真。
公共操作:
Save(oStorage:POLESS.iStorageVB):
被测验驱动器调用,将插件数据保存到实例文件。
Reload(oStorage:POLESS.iStorageVB):
被测验驱动器调用,以从实例文件中重新载入插件数据。
IPersistResource*∷Load将紧接着被调用。
UTDCore.iPersistInstanceStream
想要持续在实例文件中作为一个特性流的插件的接口。
公共属性:
IsDirty:Boolean
如果对象需要把状态保存到实例文件,则返回为真。
公共操作:
Save(oStream:POLESS.IStreamVB):
被测验驱动器调用,以将插件数据保存到实例文件。
Reload(oStream:POLESS.IStreamVB):
被因此驱动器调用,以从实例文件中重新加载插件数据。
IPersistResource*∷Load将紧接着被调用。
逻辑视图报告
UTDCore.iPersistResourceSet
想要持续在资源文件中的作为一个特性组的插件的接口。
公共操作:
Save(oPropSet:POLESS.IPropertyStorageVB):
被编译器调用,将插件数据保存到资源文件。
Load(oPropSet:POLESS.IPropertyStorageVB):
被测试驱动器调用,从资源文件中载入插件数据。
ValidateResource(oPropSet:POLESS.IPropertyStorageVB,oCompilerServices:UTDCore.ICompilerServices):
确认插件的经过编译的资源。插件必须发出一个自动错误,描述源的任何问题。
XXL的合并存储和参考文件的组合应该解决所有参考。例如,HTML的所有HREF和JPEG应该解决。
UTDCore.iPersistResourceStore
想要在资源文件中持续,作为一个存储的插件的接口。
公共操作:
Save(oStorage:POLESS.iStorageVB):
编译器被调用,将插件数据保存到资源文件。
Load(oStorage:POLESS.IStorageVB):
被测验驱动器调用,从资源文件中载入插件数据。
ValidateResource(oStorage:POLESS.iStorageVB,oCompilerServices:UTDCore.ICompilerServices):
确认插件的经过编译的资源。插件必须发出一个自动错误,描述源的任何问题。
XXL的合并存储和参考文件的组合应该解决所有参考。例如,HTML的所有HREF和JPEG应该解决。
UTDCore.iPersistResourceStream
想要在资源文件中持续,作为一个流的插件的接口。
公共操作:
Save(oStream:POLESS.IStreamVB):
被编译器调用,将插件数据保存到资源文件。
Load(oStream:POLESS.IStreamVB):
被测验驱动器调用,从资源文件中载入插件数据。
UTDCore.iPlugin
该接口将被所有UTD插件支持。
所有插件必须实现下列接口:
iPlugin
所有插件必须实现在编译时期持续到实例文件中的下列接口中的一个:
IPersistResourceSet,IPersistResourceStore or IPersistResourceStream
所有插件必须实现在提供时期持续到实例文件中的下列接口中的一个:
IPersistInstanceSet,IPersistInstanceStore or IPersistInstanceStream
如果你是可视的,则是iHelm,Item或iDisplay中的一个。它可以是iHelm和iItem。
如果你希望被包含作为一个活动文档,则你必须支持下列:
iDataObject,IoleInPlaceObject,IoleInPlaceActiveObject,IoleDocument,IOleDocumentView和IoleCommandTarget。
逻辑视图报告
或如果你是不可视的,则是以下中的一个:
iScore,iReport,iResults,iNavigate,iTimer.
iNavigate必须还实现一个iContainerNotifyHelm。
公共属性:
eMode:ePluginModes
插件应该操作的模式。
被插件的使用者来设置(驱动器或编译器)。
公共操作:
ValidateSource(oSource:POLESS.IStreamVB,oCompilerServices:UTDCore.ICompilerServices):
确认插件的源XXL。插件必须发出一个错误,描述源的任何问题。源不被要求是完整的,仅提供的一部分就应该被确认。
如果流的内容是统一字符编码,则它标记有BOM(字节顺序标记),如统一字符编码标准所定义的(www.unicode.org)。BOM通常是FFFE。
如果流包含ASCII或UFE-8,则BOM将不被包含。
oCompilerServices接口被提供,它给插件提供附加特征和信息。
Unload():
卸载数据和UTD对象的参考。
Load(oExam:UTDCore.cExam,oCandidate:iAttendance):
载入关于UTD对象。仅在测验传送过程中被调用。
UTDCore.iReport
被插件支持的接口,处理分数报告和其它材料如记录针的打印(“hand-outs”)
公共操作:
PrintReport():
打印分数报告。
UTDCore.iResults
被插件支持的接口,处理候选者结果的写。
公共操作:
WriteResults():
写考试结果。
UTDCore.iScore
被插件支持的接口,区段或考试的句柄分数。
公共属性:
eStatus:UTDCore.eScoreStatus
eScoreStatus如下。
fReportedScoreCut:Double=-1
报告给候选者和结果的分割分数。通常按比例。如果这不应用于插件。则返回-1。
fReportedScoreMax:Double=-1
报告给候选者和结果的最大分数。通常按比例。如果这不应用于插件,则返回-1。
fReportedScoreCandidate:Double=-1
报告给候选者的视计分数。通常按比例。如果这不应用于插件,则返回-1。
逻辑视图报告
oEvents:IEvents*
用于计分的子的集合。如果插件在一个区段上,则该集合可包括ISection和IPresentation对象。如果插件在一个范畴上,则该集合包括ISection和IItem对象。
公共操作:
bStop():Boolean
测验驱动器将调用该方法以检查传送是否应该从当前提供单元(区段或窗体)停止。例如,当候选者是否掌握材料很清晰时,一个自适应测验可以返回假。
GetScoreDisplay():String
返回显示在屏幕上的一个窗体中的分数。
GetScoreResults():Byte()
返回写入结果文件的一个窗体中的分数。该分数采用字节的一个安全数组的形式。
UTDCore.iSelection
从一个范畴中选择项目、区段或窗体。
公共属性:
bMore:Boolean
如果没有获取的更多对象,则返回真。只读
nCountTotal:Integer
返回它必须从缓冲池选择的对象(项目,区段或窗体)的总数。如果这不是可量化的,则返回为-1。
nCountSelected:Integer
返回它将从缓冲池所返回的对象(项目,区段或窗体)的所选计数。如果这不是可量化的,则返回-1。如一个自适应区段中的项目。
oGroup:UTDCore.cSection
只写。
包含该选择插件的组。这不是为一个窗体选择插件设置的。
oEvents:UTDCore.IEvents
只写。
由此选择的事件集合。
公共操作:
Reset():
这给予选择插件一个机会,准备第一选择的数据。
一些选择插件如“随机/exshastive”预确定用于选择的所有项目,并把它们存储在其内存和实例文件中。
GetNext():Object
获取下一个项目、区段或窗体。如果不再有,则返回空AKA,没有任何返回。
UTDCore.iUnitTimer
执行跨越测验单元的定时的一个插件。
Public Attributes:
ISecondsElasped:Long
已用秒数。
ISecondsRemaining:Long
剩余时间。如果单元没有被计时,则将返回-1。
ISecondsTotal:Long
单元可用的总秒数。
datElasped:DATE
已用时间。与ISecondsElasped相同。
逻辑视图报告
datRemaining:DATE
剩余时间。如果该单元不被计时,则返回-1。域ISecondsRemaining相同。
datTotal:DATE
该电源可用的总时间。域ISecondsTotal相同。
公共操作:
PresentationActive(oPresentation:UTDCore.cPresentation):
这被测试驱动器调用,通知定时器呈现是完全激活的。所有插件已经载入它们的数据,被显示,并且是可操作的。
PresentationInactive():
这被测试驱动器调用,通知定时器呈现打算变为非活动的。用户已经选择了项目要去的方向。项目和导航为了移动已经清除了它。
该调用之后,插件将被隐藏并被卸载。
AddTime(nMinutes:Integer):
将时间添加到当前窗体或区段。时同是以分钟规定的。
Starting(oChildren:UTDCore.cEvents,oContainerNotifyHelm:UTDCore.iContainerNotifyHelm):
通知插件区段或窗体将开始。如果插件在窗体层次被定义,则当窗体开始时被调用。如果插件在区段层次被定义,则当区段开始时被调用。
它给予它时间所跨越的子的集合。该集合可包括cSection对象和cPresentation对象。
Ending():
通知插件区段或窗体将结束。如果插件在窗体层次被定义,则当窗体结束时被调用。如果插件在区段层次被定义,则当区段结束时被调用。
Pause():
暂停计时器。
Resume():
继续计时器。(在一个Pause()之后)
UTDP.StandardTimer
标准计时插件以三种基本模式工作:
无计时,单元的时间不起作用。
被计时,单元将被计时并会超时。
起作用的,单元时间被贡献给父单元。
在超时的情况下,它将以一种方式以上来处理:
立即结束单元,
在当前展示之后结束,
警告。
UTDP.cBrowserDisplay
该显示插件将HTML译成全区域的活动文档。它还解释HTML脚本。UTD的活动对象模型被暴露给脚本。
UTDP.cLinearNavigate
执行经由一个区段的线性导航,直到项目或区段被用完为止。
UTDP.cMutliChoiceItem
标准多选项目。使用HTML展示布局。
逻辑视图报告
UTDP.cNextPrevious
标准后-/前-类型“工具栏”指导。
UTDP.cSequentialExhastive
该插件执行顺序的穷举选择。按照来自资源文件的顺序的所有对象(区段或项目)
UTDP.cSummaryScore
该插件通过概括项目或区段的分数来执行计分。它概括的分数可被加权。
总分可按比例决定。
UTDP.cUserSelection
允许一个用户从一个列表中选择一个区段。该列表是区段中的子区段。
UTDPE.cChallenge
该显示用于挑战用户,识别它们自己。它用于介绍考试和使用在一个休息期。
UTDPE.cSLSDeliResult
该结果处理器为SLSDC结果处理如一个SLSDeli结果,产生结果。
UTDPE.cStandardReview
这是标准阅览屏。它显示所有项目和它们的标题。它允许候选者:
跳到任何一个项目
转到未完成的第一个
转到被跳过的第一个
转到第一标志
结束区段。
UTDPE.cStandardScoreReport
标准分数报告。将打印一个HTML页。
公共操作:
get_AllowPOLESS():
返回AllowPOLESS标记
putAllowPOLESS():
UTDPE.cWTDResults
写一个标准WTD/TASC结果文件。
cActivePlugin
插件的助手类。
cContainerFrameT
一个容器框架的模板类。(主程序窗口)
由IOleInPlaceFrame,CWindowImpl派生的
公共操作:
Create():
Destroy():
cDocumentSiteT
一个文档位置的模板类。(主程序窗口的子窗口。)
逻辑视图报告
由IOleInPlaceSite,IOleDocumentSite,IAdviseSink,IOleClientSite,CWindowImpl,IOleInPlaceUIWindow派生的
公共操作:
Create():
Destroy():
cEvent
基类用于测验中传送的所有事件。如:区段,报告,结果和展示。
cFormGroup
包含一个窗体组。用于选择窗体。
公共属性:
colForm:UTDCore.cEvents
UTDCore.cForm对象的集合。
oForm:UTDCore.cForm
被选窗体。
公共属性:
oSelection:UTDCore.iSelection
用于选择窗体的选择插件。
cPlugInT
一个插件的模板类。给予活动文档功能性。
由IOleObjectImpl,IOleInPlaceObjectWindowlessImpl,IPersistStorageImpl,CComControl.IOleDocumentImpl,IOleDocumentViewImpl派生的
cPlugin
该类拥有插件信息。
公共属性:
sName:String
插件XXL名称的只读名称。(只读)
sProgID:String
插件的ProgID。(只读)
guidCLSID:GUID
插件的ID(只读)。
公共操作:
Create():UTDCore.iPlugin
共同创建插件的一个实例,并把它返回给调用者。该类不保留该实例的任何参考。调用者必须释放它。
cScreenMinimum
最小屏幕分辨率
公共属性:
nWidth:Long=800
最小屏幕宽度。
nHeigth:Long=600
最小屏幕高度。
nBitDepth:Integer=8
最小屏幕颜色位深度。4=16色,8=256色,16=65768色,等等。
逻辑视图报告
bValid:Boolean
如果为真,则当前视频配置满足最低要求。
cTemplate
定义屏幕上呈现区域的一个模板。被一个展示参考。
公共属性:
sName:String
只读展示模板名称。
colAreas:UTDCore.cAreas
模板中区域的集合。
colTemplates:UTDCore.cTemplates
该模板的嵌套模板。
公共操作:
Activate():
激活该模板。所有区域实例化它们的插件并且包含它们。在驱动器外不可用。
Deativate():
使该模板无效。所有区域毁坏它们的插件。在驱动器外不可用。
iAppointment
该接口是统一管理系统的一部分。它允许访问参加该测验的候选者的候选者信息。
它还被仿真UAS的UTDTOETS组件仿真。
iLaunch
DSA管理系统的接口。它是管理系统如何控制中心中的一个组件。
iLaunch2
统一管理系统的接口。它是管理系统如何控制中心中的一个组件。
iPrint
为保存用来重印用的分数报告的管理系统接口。还处理初始的打印。
iTransfer
将结果和其它文件传回数据中心的管理接口。它包括路由。
逻辑视图报告
总计:
2个逻辑封装
95个类
逻辑封装结构
逻辑视图
物理视图报告
目 录
被选组件视图报告………………………………………………………………………………………………………………………… 4
组件视图…………………………………………………………………………………………………………………………………… 4
UTDCore………………………………………………………………………………………………………………………………………4
UTDCore.eMsgBoxResults(Interfaces)………………………………………………………………………………………………… 5
UTDCore.IPresentation(Interfaces)……………………………………………………………………………………………………6
UTDCore.IContainerNotify(Interfaces)……………………………………………………………………………………………… 7
UTDCore.ICategories(Interfaces)………………………………………………………………………………………………………8
UTDCore.IMsgBox(Interfaces)……………………………………………………………………………………………………………8
UTDCore.IPersistResourceSet(Interfaces)……………………………………………………………………………………………9
UTDCore.IGroup(Interfaces)…………………………………………………………………………………………………………… 9
UTDCore.IScript(Interfaces)………………………………………………………………………………………………………… 10
UTDCore.IUnitTimer(Interfaces)………………………………………………………………………………………………………12
UTDCore.INavjgate(Interfaces)……………………………………………………………………………………………………… 13
UTDCore.IItems(Interfaces)……………………………………………………………………………………………………………15
UTDCore.ICategory(Interfaces)……………………………………………………………………………………………………… 15
UTDCore.IPersistInstanceStore(Interfaces)……………………………………………………………………………………… 16
UTDCore.IcResults(Interfaces)……………………………………………………………………………………………………… 16
UTDCore.IcItem(Interfaces)……………………………………………………………………………………………………………17
UTDCore.IScore(Interfaces)……………………………………………………………………………………………………………19
UTDCore.IExam(Interfaces)…………………………………………………………………………………………………………… 20
UTDCore.IRegistry(Interfaces)……………………………………………………………………………………………………… 23
UTDCore.IAttribute(Interfaces)………………………………………………………………………………………………………24
UTDCore.IHelm(Interfaces)…………………………………………………………………………………………………………… 24
UTDCore.IcReport(Interfaces)…………………………………………………………………………………………………………25
UTDCore.eDirection(Interfaces)………………………………………………………………………………………………………25
UTDCore.IPersistInstanceStream(Interfaces)………………………………………………………………………………………26
UTDCore.ePluginModes(Interfaces)……………………………………………………………………………………………………26
UTDCore.IPersistResourceStream(Interfaces)………………………………………………………………………………………27
UTDCore.ISelection(Interfaces)………………………………………………………………………………………………………27
UTDCore.IGroups(Interfaces)………………………………………………………………………………………………………… 28
UTDCore.Collection(Interfaces)………………………………………………………………………………………………………28
UTDCore.eScoreStatus(Interfaces)……………………………………………………………………………………………………29
UTDCore.eStates(Interfaces)………………………………………………………………………………………………………… 29
UTDCore.IPersistResourceStore(Interfaces)……………………………………………………………………………………… 29
UTDCore.eExamStatus(Interfaces)…………………………………………………………………………………………………… 30
UTDCore.IItem(Interfaces)…………………………………………………………………………………………………………… 30
UTDCore.IPlugin(Interfaces)………………………………………………………………………………………………………… 32
UTDCore.IContainerNotifyHelm(Interfaces)…………………………………………………………………………………………33
UTDCore.IReport(Interfaces)………………………………………………………………………………………………………… 34
UTDCore.IForm(Interfaces)…………………………………………………………………………………………………………… 34
UTDCore.IAttributes(Interfaces)…………………………………………………………………………………………………… 37
UTDCore.IPresentations(Interfaces)…………………………………………………………………………………………………37
UTDCore.ISections(Interfaces)……………………………………………………………………………………………………… 37
UTDCore.IDisplay(Interfaces)…………………………………………………………………………………………………………37
UTDCore.ISection(Interfaces)…………………………………………………………………………………………………………38
UTDCore.IResults(Interfaces)…………………………………………………………………………………………………………41
UTDCore.eCategoryContent(Interfaces)………………………………………………………………………………………………41
UTDCore.IEvents(Interfaces)………………………………………………………………………………………………………… 41
UTDCore.IPersistInstanceSet(Interfaces)………………………………………………………………………………………… 42
管理系统……………………………………………………………………………………………………………………………………42
UAS.ITransfer(Interfaces)…………………………………………………………………………………………………………… 42
UAS.IPrint(Interfaces)…………………………………………………………………………………………………………………42
UAS.IAppointment(Interfaces)…………………………………………………………………………………………………………43
总计:………………………………………………………………………………………………………………………………………44
组件封装结构:……………………………………………………………………………………………………………………………44
物理视图报告
物理视图报告
被选组件视图报告
组件视图
物理视图报告
UTD版本2
UTDCore.eMsgBoxResults(Interfaces)
来自IMsgBox∷Display的可能结果的枚举
物理视图报告
eMsgBoxResult_Yes
eMsgBoxResult_No
eMsgBoxResult_Timeout
(候选者没有点击,发生超时)
UTDCore.IPresentation(接口)
展示的数据和当前状态。可以是一个项目或一个显示。
由cEvent,UTDCore.IContainerNotifyHelm派生的
公共属性:
bCountPresentation:Boolean
如果为真,则展示应该计算区段的总X或Y。“项目计数”
colCustomAttributes:UTDCore.IAttributes
用户属性的集合。只读。
sName:String
只读的展示名称。
sTitle:String
展示标题。只读。
oScriptStart:UTDCoreIScript
在该对象执行之前要执行的脚本。
oScriptFinish:UTDCore.IScript
在该对象执行之后要执行的脚本。
oScriptConditional:UTDCore.IScript
该表达式脚本被求值。如果为真,则该对象被提供。
物理视图报告
sComment:String
用户输入该展示的注释。
bMarked:Boolean
如果项目为以后的检查已被标记,则返回为真。由指导设置。
colChildren:UTDCore.IEvents
该展示中的项目。集合对于非项目展示将是空的。
bSelected:Boolean
如果展示或其任何项目已被一个选择插件选择用于提供,则返回为真。
只读。
公共操作:
FindIcItem(pIItem:IItem*):IcItem*
找到给定IItem的IcItem接口。
如果IItem不在该展示中,则返回失败。
UTDCore.IContainerNotify(接口)
所有插件接收该接口的一个参考。它允许它们向容器报告条件。
公共操作:
Activated():
调用表明插件已收到展示变化,并且它完全准备好操作。这包括处理它的数据和在屏幕上描画(如果可视)。该对象作为可视插件类型的PresentationStarting方法的一个参数被传送。
物理视图报告
对一个可视插件的该方法的调用失败将导致驱动器无穷地等待。候选者将不能导航或响应。对于每次调用PresentationStarting,不能调用该方法超过一次。
UTDCore.ICategories(接口)
UTDCore.ICategory的集合
由UTDCore.Collection派生的
UTDCore.IMsgBox(接口)
该类显示带有候选者提示的消息框。该类是从IExam∷GetMsgBox()返回的。框中的消息由被调用者提供。标题可任选被提供按钮由调用者提供。但按钮标签在资源文件中的采用层次来定义。
消息框的父框视主测验窗口。消息框在一段时间之后,可被设置为超时。
公共属性:
sTitle:String=UTDCore
消息框将使用的标题。读/写。
ITimeout:Long=120
以秒为单位的消息框的超时值。读/写。
显示将返回eMsgBoxResul_Timeout。
nParentHWnd:Integer
父窗口句柄读/写。
默认是主UTDCore窗口。
物理视图报告
公共操作:
Display(sPrompt:String,eStyle:UTDCore.eMsgBoxStyle):UTDCore.eMsgBoxResults
显示消息框。显示被请求的按钮和被提供的消息。
UTDCore.IPersistResourceSet(接口)
想要作为一个特性组在资源文件中持续的插件的接口。
公共操作:
Save(oPropSet:POLESS.IPropertyStorageVB):
被编译器调用,将插件数据保存到资源文件。
Load(oPropSet:POLESS.IPropertyStorageVB):
被采用驱动器调用,从资源文件中载入插件数据。
ValidateResource(oPropSet:POLESS.IPropertyStorageVB,oCompilerServices:UTDCore.ICompilerServices):
确认插件的经过编译的资源。插件必须发出一个自动错误,描述源的任何问题。
XXL的合并存储和被参考文件的组合应该解决所有参考。例如,HTML的所有HREF和JPEG应该解决。
UTDCore.IGroup(接口)
组是区段中事件的拥有者。一个组可拥有展示或区段。
公共属性:
sName:String
物理视图报告
只读组名。
sTitle:String
只读组标题。
colCustomAttributes:UTDCore.IAttributes
用户属性的集合。只读。
colChildren:UTDCore.IEvents
该组的展示,子区段或子组的集合。
oScoring:UTDCore.IScore
区段的计分插件。
colDelivered:
包含该组内所有被提供事件的展示或子区段的集合。这将不包含子组。
oSelection:UTDCore.ISelection
指向该组的当前选择插件的指针。
oSection:UTDCore.ISection
容纳该组的区段。
UTDCore.IScript(接口)
一个用VB脚本或J脚本写的脚本。被ActiveX脚本工具执行或评价。该对象将把UTD对象暴露给脚本代码。这些对象将基于提供给该对象的“父”对象的范围。
所有脚本可参看oExam,oForm和oCandidate。
物理视图报告
如果父对象是一个区段对象,则脚本也参见oCurSection。
如果父对象是一个展示对象,则脚本也参见oCurSection和oCurPresentation。
如果父对象是一个项目,则脚本也参见oCurSection,oCurPresentation和oCurItem。
公共属性:
oParent:Object
父UTD对象。它可以是一个窗体,一个区段或一个展示。
公共操作:
Execute(sScript:BSTR):
执行以sScript参数被传送的脚本代码。
EvaluateBool(sScript:BSTR):Boolean
评价作为sScript参数被解析的表达式。返回真或假。如果代码不是返回一个布尔值的表达式,则产生一个错误。
EvaluateVar(sScript:BSTR):Variant
评价以sScript参数传递的表达式。返回一个依赖于脚本的返回类型的变量。如果代码不是一个表达式,则产生一个错误。
SetScope(oSection:ISection*,oPresentation:IPresentation*,oItem:IItem*):
发送父区段、展示和项目。脚本将访问作为oCurSection,oCurPresentation和oCurItem对象的这些。任何/所有可作为空参数被传送,表明脚本不访问那个特定对象。
AddObject(sName:BSTR,pObject:IDispatch*):HRESULT
把一个对象添加到全局脚本范围。
保护操作:
物理视图报告
LoadGlobalScript(oStream:POLESS.IcStorage):
被采用驱动器调用,初始化对所有后面脚本公共的全局脚本。这将被cScript的所有实例共享。
oStorage参数是一个包含属性集的存储和一个包含全局脚本的流。
UTDCore.IUnitTimer(接口)
执行跨越测验单元的计时的插件。
公共属性:
ISecondsElapsed:Long
已用秒数。
ISecondsRemaining:Long
剩余秒数。如果该单元不被计时,则将返回-1。
ISecondsTotal:Long
该单元可用的总秒数。
datElapsed:DATE
已用时间。与ISecondsElapsed相同。
datRemaining:DATE
剩余时间。如果该单元不被计时,则将返回-1。与ISecondsRemaining相同。
datTotal:DATE
该单元可用的总时间。与ISencondsTotal相同。
公共操作:
物理视图报告
PresentationActive(oPresentation:UTDCore.IPresentation):
这被采用驱动器调用,通知定时器呈现是完全活动的。所有插件已经载入它们的数据,被显示并且是可操作的。
PresentationInactive():
这被采用驱动器调用,通知定时器展示将变成非活动的。用户已经选择了项目将去的方向。项目和导航为了移动已经清除了它。
在该调用后,插件将被隐藏和被卸载。
AddTime(nMinutes:Integer):
将时间添加到窗体或区段。时间以分为单位被指定。
Starting(oChildren:UTDCore.IEvents,oContainerNotifyHelm:UTDCore.IContainerNotifyHelm):
通知插件区段或窗体正开始。如果插件在窗体层次被定义,则当窗体开始时,这个被调用。如果插件在区段层次被定义,则当区段开始时,这个被调用。
它给了它计时所跨越的子的集合。该选择可包括cSection对象和cPresentation对象。
Ending():
通知插件区段或窗体将结束。如果插件在窗体层次被定义,则当窗体结束时被调用。如果插件在区段层次被定义,则当区段结束时被调用。
Pause():
暂停计时器
Resume():
继续计时器。(一个Pause()之后)
UTDCore.INavigate(接口)
物理视图报告
被插件支持的接口,一个句柄区段导航。
iNavigate的实现者必须还实现一个iContainerNotifyHelm。
由UTDCore.IContainerNotifyHelm派生的
公共属性:
nPresentations:Integer
要被展示在导航范围内的被展示计数的数量。一个组合项目中的每个项目作为一个计算。
bItemsDetermined:Boolean
如果展示在导航范围内的项目数可被确定,则返回为真。自适应项目或区段可对此加以阻止。
公共操作:
bNavigateAllowed(eDirect:UTDCore.eDirection):Boolean
如果被提供方向上的导航被允许,则返回为真。每个展示之前对此询问正是指导的工作。
这是资源文件插件数据和区段的当前状态的一个组合。
例子实现:
测验设计者被允许配置是否出现向前按钮。但如果我们处在一个区段的第一呈现上,则即使被配置它也不出现。
Starting(oSection:UTDCore.ISection):
区段将要开始。
Ending():
区段将要结束。
物理视图报告
UTDCore.IItems(接口)
UTDCore.IcItem的集合。注意这不是由一个项目插件实现的UTDCore.IItem接口。
由UTDCore.Collection派生的
UTDCore.ICategory(接口)
区段或项目的一个范畴。例如:“报告”,“目标”,“计分”
公共属性:
sName:String
范畴的名称。
bComplete:Boolean
如果为真,则范畴必须包含在一个层次上定义的所有区段或项目。
bDuplicate:Boolean
如果为真,则范畴允许在一个层次上一次以上定义的区段或项目。
sDescription:String
范畴的描述。
colMembers:UTDCore.IEvents
应用于该范畴的区段或项目的集合。
colSubCategories:UTDCore.ICategories
UTDCore.cCategory的集合。(AKA子范畴)
eContents:eCategoryContents
只读。colMembers中的成员的允许类型。
物理视图报告
enum{
eCategoryContent_Anything=0,
eCategoryContent_Sections=1,
eCategoryContent_Items=2,
eCategoryContent_Categories=3,
}eCategoryContents;
oScoring:UTDCore.IScore
用于该窗体的计分插件。
UTDCore.IPersistInstanceStore(接口)
想要作为一个存储在实例文件中持续的插件的接口。
公共属性:
IsDirty:Boolean
如果对象需要把状态保存到实例文件中,则返回为真。
公共操作:
Save(oStorage:POLESS.iStorageVB):
被采用驱动器调用,以将插件数据保存到实例文件。
Reload(oStorage:POLESS.iStorageVB):
被采用驱动器调用,以从实例文件中重新载入插件数据。
IPersistResource*∷Load将紧接着被调用。
UTDCore.IcResults(接口)
物理视图报告
一个事件集合将包含每个结果的IcResults接口。它是用于IResults插件的一个容器。这不是插件实现的IResults接口。
由cEvent派生的
公共属性:
oResults:UTDCore.IResults
写结果的插件。
UTDCore.IcItem(接口)
项目或事件的集合将包括每个项目的IcItem接口。该接口提供一般的项目信息,包括在XXL的<item>标志中所指定的属性。这个不是插件实现的UTDCore.IItem接口。
QueryInterface用于IItem接口的这个IcItem是可能的。这允许一个报告、接口或计分插件调用IItem接口的方法。
由UTDCore.IItem派生的
公共属性:
bPresented:Boolean=False
如果项目已经被展示给候选者则为真。由项目组件来设定。
sName:String
只读项目名字。
sTitle:String
展示标题。只读。
fWeight:Double=1
与其它项目有关的项目加权。通常为1。如果要求每个项目的多重加权,则它们可附在用户属性中。加权可以是负数。
物理逻辑报告
colCustomAttributes:UTDCore.IAttributes
用户属性的集合。只读。
ISecondsElapsed:Long
项目所花费的秒数。
bScored:Boolean=TRUE
只读。如果项目要被计分,则为真。
如果为假,fWeight和fScoreCandidateWeighted均将为0。
bSkipAllowed:Boolean
只读特性。如果为真,则项目可被跳过。如果为真,则iItem接口的bProceed()方法将不被调用。
fScoreCandidateWeighted:Double
项目的候选者的加权值。项目的被判断值将被该值的权数乘。
sPluginName:String
只读插件名字。插件的progID。
oSection:UTDCore.ISection
项目被提供到其中的区段的只读特性。
oPresentation:UTDCore.IPresentation
项目被提供到其中的展示的只读特性。
datElapsed:DATE
花费在项目上的时间。与ISecondsElapsed相同,但作为一个COM日期类型被发送。
物理视图报告
eDirection_Flag
eDirection_Help
eDirection_FirstIncomplete
eDirection_FirstSkipped
eDirection_FirstPresentation
eDirection_FirstMarked
eDirection_End
eDirection_Comment
eDirection_Start
eDirection_Quit
UTDCore.IPersistInstanceStream(接口)
想要在实例文件中持续的作为一个特性流的插件的接口。
公共属性:
IsDirty:Boolean
如果对象需要把状态保存到实例文件,则返回为真。
公共操作:
Save(oStream:POLESS.IStreamVB):
被测验驱动器调用,以将插件数据保存到实例文件。
Reload(oStream:POLESS.IStreamVB):
被测验驱动器调用,从实例文件重新加载插件数据。
IPersistResource*∷Load将下次被调用。
UTDCore.ePluginModes(接口)
可能模式的枚举,一个活动文档。
ePluginMode_Author(Not supported)
物理视图报告
GetScoreDisplay():String
返回被显示在屏幕上的一个窗体中的分数。
GetScoreResults():Byte()
返回被写到结果文件的一个窗体中的分数。分数具有字节的一个安全数组的格式。
UTDCore.IExam(接口)
测验实例。驱动器的根对象暴露类。
由cContainerFrameT派生的
公共属性:
sName:String
只读测验名称。
sLanguage:String
测验内容的语言。只读。
这在当前返回一个空字符串。
sVersion:String
测验的版本。只读。
oActiveForm:UTDCore.IForm
当前窗体。对于一个测验,仅一个窗体可以是活动的。
eStatus:UTDCore.eExamStatus
eExamStatus如下:
eExam_Initializing
eExam_Starting
eExam_InProgress
物理视图报告
eExam_Ended
eExam_Terminating
bShowResponseComment:Boolean
如果为真,则候选者在注释周期中不应该查看他们的响应。
colCustomAttributes:UTDCore.IAttributes
用户属性的集合。只读。
sTitle:String
测验标题。只读。
colCategorics:UTDCore.ICategories
所有范畴的集合。
oResourceRoot:Object
对POLESS资源文件的根存储的只读参考。接口:
POLESS.cStorageRoot,iStorage,iRootStorage,iStorageVB。
oInstanceRoot:Object
对POLESS测验实例文件的根存储的只读参考。接口:
POLESS.cStorageRoot,IStorage,IRootStorage,IStorageVB。
oRegistry:UTDCore.IRegistry
返回注册对象的单实例。只读。
公共操作:
Minimize():
最小化UTD的主窗口。使UTD消失的仿真可被调用。
物理视图报告
Restore():
恢复UTD的主窗口。恢复UTD到屏幕上的仿真可被调用。
GetScript():UTDCore.IScript
返回被一个插件使用的一个脚本对象。
SaveInstance():
将测验驱动器的状态保存到实例文件。所有活动对象被要求使它们自己对于实例文件顺序化。
对该对象的任何一个的参考可初始化该过程。它可能是一个项目插件,想要保存用户接口和状态信息。
驱动器将在每个展示间保存。它还可以在不同的其它事件或时间间隔间保存。
GetTransfer():UAS.ITransfer
返回一个UAS传递对象,以将结果或其它文件传送到数据中心。
IExam对象不保持对该对象的参考。
GetPrint():IUASPrint
返回一个UAS打印对象,已用于重印分数和其它报告的保存。
IExam对象不保持对该对象的参考。
FatalError(INumber:Long,sSource:String,sDescriptiou:String):
将一个插件的一个错误报告给测验驱动器。
正常地,通过一个HRESULT和支持IErrorInfo,错误将被报告回测验驱动器。如果错误产生于除了测验驱动器初始化调用之外的某些事情,则插件应该通过该方法报告错误。
一个实例使用可能是用户点击你的插件项目上的一个按钮。结果动作产生一个错误。
Warn():
把一个警告级跟踪消息写到实例文件中。
Iafo():
把一个信息级跟踪消息写入实例文件。
物理视图报告
Quit():
告诉测验候选者正在退出测验。为了响应eDirection_Quit,被导航插件正常调用。导航插件应该确认候选者的这个决定。
这导致测验驱动器停止提供和停止执行。管理系统被通知候选者退出测验。
GetMsgBox():UTDCore.IMsgBox
返回一个消息框对象。任何可能的时候,希望显示一个消息框的任何插件应该使用该对象。它提供语言独立性,和一致的外观和感觉。
StartExam():
告诉测验候选者已经接受测验和已经开始。为了响应eDirection_Start,被导航插件正常调用。
管理系统被通知测验已经开始和候选者已经接受它。
UTDCore.IRegistry(接口)
为翻译字符串,允许注册表的查看。
例如:
<base href=″%REG:DSAGRAPGHICS″>
into
<base href=″V:\DSA\″>
Looks at
[HKEY_LOCAL_MACHINE\SOFTWARE\Prometric\UTD\Keywords
]
公共操作:
物理视图报告
Lookup(sKey:String):String
通过查找注册表中的关键字和返回值,取回字符串。
Translate(sInString:String):String
把%REG:x%的每次出现翻译为注册表中的等价的“x”。
UTDCore.IAttribute(接口)
公共属性:
sName:BSTR
获取属性名字符串。
value:VARIANT
获取属性值。
UTDCore.IHelm(接口)
被插件实现的接口,一个句柄导航控制或检查。如下一个,前一个或未完成的。只有用户接口。告诉iNavigate插件执行实际的导航。
公共属性:
oSection:UTDCore.ISection
该指导所在的区段。
公共操作:
物理视图报告
PresentationStarting(oPresentation:UTDCore.IPresentation,oContainerNotifyHelm:UTDCore.IContainerNotifyHelm,oContainerNotify:UTDCore.IContainerNotify,bComment:Boolean):
被测验驱动器调用,以通知插件一个新的展示将开始。插件可以拥有IPresentation,IContainerNotifyHelm对象,直到PresentationEnding为止。参见IContainerNotify∷Active。IContainerNotifyHelm接口作为一种通知移动的测验驱动器的方法。
PresentationEnding():
被测验驱动器调用,以通知插件展示将结束。调用该方法之后,驱动器期望插件释放PresentationStarting中传递的IPresentation,IContainerNotify和IContainerNotifyHelm对象。
UTDCore.IcReport(接口)
事件的集合将包含每个报告的IcReport接口。它是IReport插件的一个容器。这个不是插件实现的IReport接口。
由cEvent派生的
公共属性:
oScoreReport:UTDCore.IReport
分数报告插件。
UTDCore.eDirection(接口)
从一个展示继续的可能方向的枚举。
eDirection_Next
eDirection_Previous
eDirection_TimeoutImmedidate(现在不等待)
eDirection_TimeoutAfter(在当前展示之后)
eDirection_Review(转到回顾展示)
eDirection_Jump(转到特定展示)
物理视图报告
eDirection_Flag
eDirection_Help
eDirection_FirstIncomplete
eDirection_FirstSkipped
eDirection_FirstPresentation
eDirection_FirstMarked
eDirection_End
eDirection_Comment
eDirection_Start
eDirection_Quit
UTDCore.IPersistInstanceStream(接口)
想要在实例文件中持续的作为一个特性流的插件的接口。
公共属性:
IsDirty:Boolean
如果对象需要把状态保存到实例文件,则返回为真。
公共操作:
Save(oStream:POLESS.IStreamVB):
被测验驱动器调用,以将插件数据保存到实例文件。
Reload(oStream:POLESS.IStreamVB):
被测验驱动器调用,从实例文件重新加载插件数据。
IPersistResource*∷Load将下次被调用。
UTDCore.ePluginModes(接口)
可能模式的枚举,一个活动文档。
ePluginMode_Author(Not supported)
物理视图报告
ePluginMode_Compile
ePluginMode_Delivery
ePluginMode_Rescore(Not suportted)
ePluginMode_ProcessResults(Not suportted)
UTDCore.IPersistResourceStream(接口)
想要在资源文件中持续的作为一个流的插件的接口。
公共操作:
Save(oStream:POLESS.IStreamVB):
被编译器调用,以将插件数据保存到资源文件。
Load(oStream:POLESS.IStreamVB):
被测验驱动器调用,以从资源文件载入插件数据。
UTDCore.ISelection(接口)
从一个范畴中选择项目、区段或窗体。
公共属性:
bMore:Boolean
如果要获得更多的对象,则返回为真。只读。
nCountTotal:Integer
返回对象(项目、区段或窗体)的总数,它在其缓冲池中具有要选择的对象。如果这是不可量化的则返回-1。
nCountSelected:Integer
返回对象(项目、区段或窗体)的选定数量,它将返回来自缓冲池的对象。如果这是不可量化的则返回-1。象一个自适应区段中的项目。
物理视图报告
oGroup:UTDCore.ISection
只写。
包含该选择插件的组。这不是一个窗体选择插件而设置的。
oEvents:UTDCore.IEvents
只写。
选自的事件集合。
公共操作:
Reset():
这给选择插件一个机会,准备第一选择的数据。一些选择插件象“random/exshastive”,预确定用于选择的所有项目,并将其存储在其内存和实例文件中。
GetNext():Object
获取下一个项目、区段或窗体。如果没有则为空AKA,没有返回。
UTDCore.IGroups(接口)
UTDCore.IGroup的集合
由UTDCore.Collection派生的
UTDCore.Collection(接口)
基本UTD集合。所有其它的集合类跟随这个设计。
公共属性:
Count:Long
物理视图报告
返回一个集合中的成员数。
_NewEnum:IUnknown**
返回一个Visual Basic枚举程序对象。
公共操作:
Item(Index:Variant):Variant
或者按位置或者按关键字返回一个集合对象的一个特定成员。
UTDCore.eScoreStatus(接口)
一个窗体/区段/组/范畴的计分状态,由计分插件确定。
eScore_NonGraded
eScore_Failure
eScore_Pass
UTDCore.eStates(接口)
测验驱动器的状态。
eStateStart--初始化测验驱动器和读取资源文件。
eStateSectionDelivery--传送一个区段。
eStateSectionComment--注释所有区段。
eStateSectionFeedBack--所有区段上的反馈。
eStateScoreReporting--生成和打印一个分数报告。
eStateResults--写结果。
eStateFinish--关闭测验驱动器。
UTDCore.IPersistResourceStore(接口)
物理视图报告
想要在资源文件中持续的作为一个存储的插件和接口。
公共操作:
Save(oStorage:POLESS.iStorageVB):
被编译器调用,以将插件数据保存到资源文件。
Load(oStorage:POLESS.IStorageVB):
被测验驱动器调用,以从资源文件中载入插件数据。
ValidateResource(oStorage:POLESS.iStorageVB,oCompilerServices:UTDCore.ICompilerServices):
确认用于插件的编译资源。插件必须产生一个自动错误,描述源的任何问题。
XXL和参考文件的合并存储的组合应该解决所有参考。例如,HTML的所有HREF和JPEG应该解决。
UTDCore.eExamStatus(接口)
可能的参考提供状态的枚举。
eExam_Initializing(loading resource file)
eExam_Starting(delivering,candidate not yet″started″)
eExam_InProgress(delivering,candidate officially″started″)
eExam_Ended(delivering,candidate officially″ended″)
eExam_Terminating(cleaning up from memory)
UTDCore.IItem(接口)
被插件支持的接口,一个句柄项目和仿真器。
公共属性:
oSection:UTDCore.ISection
我们所处的区段。
物理视图报告
fScoreMinimum:Double=0
最低的可能分数。必须小于或等于正常分数。它可以是负的。
fScoreNominal:Double=0
如果候选者没有任何行动,则返回分数。必须小于或等于最大分数。必须大于或等于最小分数。正常为0。
fScoreMaximum:Double=1
最高的可能分数。必须大于或等于正常分数。
fScoreCandidate:Double=0
候选者所收到的分数。要求插件判断项目。
bComplete:Boolean=False
如果项目是完整的,则返回为真。
bSkipped:Boolean=False
如果项目被候选者跳过,则返回为真。
公共操作:
bProceed(eDirect:UTDCore.eDirection):Boolean
测验驱动器将调用该方法,以查看是否可以离开当前展示。参数指示方向。
GetCorrectAnswerDisplay():String
返回显示在屏幕上的一个窗体中的正确答案。
GetCorrectAnswerResults():Byte()
返回写入结果文件的一个窗体中的正确答案。正确答案形式是字节的一个安全数组。
GetResponseDisplay():String
返回显示在屏幕上的一个窗体中的候选者响应。
物理视图报告
GetResponseResults():Byte()
返回写入结果文件中的一个窗体中的候选者响应。响应的格式是字节的一个安全数组。
PresentationStarting(oPresentation:UTDCore.IPresentation,oContainerNotify:UTDCore.IContainerNotify,bReadOnly:Boolean):
被测验驱动器调用,以通知插件一个新的展示将要开始。
PresentationEnding():
被测验驱动器调用,以通知插件该展示将要结束。
UTDCore.IPlugin(接口)
该接口被所有UTD插件支持。
所有插件必须实现下列接口:
iPlugin
所有插件必须实现在编译时期允许进入资源文件中的下列接口中的一个:
IPersistResourceSet,IPersistResourceStore or IPersistResourceStream
所有插件必须实现在传送时期允许进入资源文件中的下列接口中的一个:
IPersistInstanceSet,IPersistInstanceStore or IPersistInstanceStream
如果你是可见的,则是这些中的一个:iHelm,iItem或iDisplay。它可以是一个iHelm和一个iItem。
如果你希望被包含在一个活动文档中,则你必须支持下列:
iDataObject,IoleInPlaceObject,IoleInPlaceActiveObject,IoleDocument,IoleDocumentView和IoleCommandTarget.
或者如果你是不可见的,则是这些中的一个:
iScore,iReport,iResults,iNavigate,iTimer.
iNavigate必须还实现一个iContainerNotifyHelm
公共属性:
eMode:ePluginModes
插件应该操作的模式。
物理视图报告
被插件的用户(驱动器或编译器)设置。
公共操作:
ValidateSource(oSource:POLESS.IStreamVB,oCompilerServices:UTDCore.ICompilerServices):
确认插件的源XXL。插件必须产生一个自动错误,描述源的任何问题。源不被要求是完整的,只有提供的部分应该被确认。
如果流的内容是Unicode,则它将被用BOM(字节顺序标记)标记,由统一字符编码标准定义(www.unicode.org)。BOM通常是FFFE。
如果流包含ASCII或UTF-8,则BOM将不被包括。
oCompilerServices接口被提供,给插件提供附加特征和信息。
Unload():
卸载数据和UTD对象的参考。
Load(oExam:UTDCore.IExam,oCandidate:iAttendance):
加载参考UTD对象。仅在测验提供过程中被调用。
UTDCore.IContainerNotifyHelm(接口)
被插件使用的这个接口,通知容器导航。
公共操作:
RequestMove(eDirect:UTDCore.eDirection,sPresentation:String):
要求驱动器按指定的方向继续。驱动器紧接着要求来自导航插件的这个移动。
可选的第二个参数指定展示。这仅用于JUMP。
物理视图报告
UTDCore.IReport(接口)
被插件支持的接口,处理分数报告和其它材料的打印,如纪录
公共操作:
PrintReport():
打印分数报告
UTDCore.IForm(接口)
一个测验窗体。
由UTDCore.IContainerNotifyHelm派生的
公共属性:
colChildren:UTDCore.IEvents
测验的所有顶层的集合。只读。
colCustomAttributes:UTDCore.IAttributes
用户属性的集合。只读。
sName:String
只读窗体名称。
sTitle:String
窗体标题。只读
colItemsChosen:UTDCore.IItems
物理视图报告
测验中选择的(即被一个选择插件返回的)所有项目的集合。这与它们的区段无关。
colAllSections:UTDCore.ISections
测验的所有区段的集合,与它们的区段无关。
datStart:Date
窗体开始日期和时间。
datFinish:Date
窗体完成的日期和时间。
oTimer:UTDCore.IUnitTimer
窗体的定时器。
oScoring:UTDCore.IScore
窗体的计分插件。
sVersion:String
窗体的版本。
colDelivered:UTDCore.IEvents
窗体的所有被传送的顶层区段的集合。只读。
nCurIndex:Long=0
colDelivered中最后被传送的事件的索引。只读。
eStatus:UTDCore.eScoreStatus
返回oForm.oScore.eStatus的值。
colAllPresentations:UTDCore.IPresentations
测验的所有展示的集合,与它们的区段无关。
物理视图报告
colPresentationsChosen:UTDCore.IPresentations
测验中选择的(即被一个选择插件返回的)所有展示的集合。这与它们的区段或组无关。
colSectionsChosen:UTDCore.ISections
测验中选择的(即被一个选择插件返回的)所有区段的集合。这与它们的层次无关。
colAllItems:UTDCore.IItems
测验的所有项目的集合,与它们的层次无关。
colAllGroups:UTDCore.IGroups
测验的所有组的集合,与它们的层次无关。
colGroupsChosen:UTDCore.IGroups
测验中选择的所有组的集合(即该组的选择插件已经被Reset())。这与它们的层次无关。
公共操作:
ChildNext():
要求驱动器继续窗体上的下一个事件。这可以是一个区段、一个结果或一个分数报告。
ChildPrevious():
要求驱动器继续窗体上的前一个事件。这可以是一个区段、一个结果或一个分数报告。
ChildGoto(vSection:Variant):
要求驱动器继续窗体上的一个被命名或编号事件。这可以是一个区段、一个结果或一个分数报告。
datMinRemaining():
该测验的最小时间剩余。
物理视图报告
UTDCore.IAttributes(接口)
UTDCore.IAttribute的集合。
由UTDCore.Collection派生的
UTDCore.IPresentations(接口)
UTDCore.cPresentation的集合
由UTDCore.Collection派生的
UTDCore.ISections(接口)
UTDCore.cSection的集合
由UTDCore.Collection派生的
UTDCore.IDisplay(接口)
被插件支持的接口,一个句柄标题栏,显示,非回答项目和摘要。
公共属性:
oSection:UTDCore.ISection
该显示所在的区段。
公共操作:
物理视图报告
PresentationStarting(oPresentation:UTDCore.IPresentation,oContainerNotify:UTDCore.IContainerNotify):
被测验驱动器调用,以通知插件一个新展示将开始。该插件可以拥有IPresentation和IContainerNotify对象,直到PresentationEnding为止。参见IContainerNotify∷Active。
PresentationEnding():
被测验驱动器调用,以通知该插件展示将结束。调用该方法后,驱动器期望插件将释放在PresentationStarting中传递的IPresentation和IContainerNotify。
UTDCore.ISection(接口)
表示一个测验区段或子区段。可包含展示或区段。
由cEvent派生的
公共属性:
oNavigation:UTDCore.INavigate
该区段的导航插件。
colCustomAttributes:UTDCore.IAttributes
用户属性的集合。只读。
sName:String
只读区段名。
sTitle:String
区段标题。只读。
oScoring:UTDCore.IScore
区段的计分插件。
物理视图报告
oScriptStart:UTDCore.iScript
该对象执行之前要执行的脚本。
oScriptFinish:UTDCore.IScript
该对象执行之后要执行的脚本。
oScriptConditional:UTDCore.IScript
该表达式脚本被估算。如果为真,则该对象被传送。
oReview:UTDCore.IPresentation
区段的检查展示。如果区段不具有为它所定义的一个检查,则它为空。
oCurChild:Object
被提供的当前子对象。这可以是一个cSection或一个cPresentation。
datStart:Date
区段开始日期和时间。
datFinish:Date
区段完成日期和时间。
colChildren:UTDCore.IEvents
区段的展示或子区段的集合。
oSelection:UTDCore.ISelection
该区段的选择插件。
oTemplate:UTDCore.cTemplate
区段的模板。
物理视图报告
oTimer:UTDCore.iTimer
区段的定时器插件。
dtTimeRemaining:DATE
返回区段中的时间剩余。它从iTimer插件获取秒数剩余。然后将它转换为一个变量DATE类型(aka VT_DATE)。
colDelivered:UTDCore.IEvents
已被展示的区段的展示或子区段的集合。它们按出现顺序被排序。
bComment:Boolean=FALSE
区段的注释模式。通常由导航设置。
bItemsReadOnly:Boolean=FALSE
区段中项目的只读模式。通常由导航设置。只读项目不可以让它们的响应改变。
nCurChild:long=0
colDelivered中最后被提供的事件的索引。只读。
公共操作:
ChildNext():
要求驱动器继续下一个展示或子区段。
ChildPrevious():
要求驱动器继续上一个展示或子区段。
ChildGoto(vPresentation:Variant):
要求驱动器继续一个被命名或编号的展示或子区段。
物理视图报告
UTDCore.IResults(接口)
被插件支持的接口,处理候选者结果的编写。
公共操作:
WriteResults():
写测验结果。
UTDCore.eCategoryContent(接口)
ICategory∷eContents的可能值的枚举。
//These types of categories that correspond to the XXL
categorycontents
eCategoryContent_Anything
eCategoryContent_Sections
eCategoryContent_Items
eCategoryContent_Categories
UTDCore.IEvents(接口)
IEvents包含作为IDispatch对象的可提供类。它们必须被单独询问,以确定它们的正常类型。返回的事件类型依赖于集合来自的地方。
IEvents可包含:
IExam,IForm,ISection,IcItem,IPresentation,IcItem,IcReport,andIcResults.
由UTDCore.Collection派生的
物理视图报告
UTDCore.IPersistInstanceSet(接口)
想要在实例文件中持续的作为一个特性集的插件的接口。
公共属性:
IsDirty:Boolean
如果对象需要将状态保存到实例文件,则返回为真。
公共操作:
Save(oPropSet:POLESS.IPropertyStorageVB):
被测验驱动器调用,以把插件数据保存到实例文件中。
Reload(oPropSet:POLESS.IPropertyStorageVB):
被测验驱动器调用,以从实例文件中重新载入插件数据。
IPersistResource*∷Load将紧接着被调用。
Administration System
这是构成管理系统的一个或多个组件。这将随通道和时间而变化。
UAS.ITransfer(接口)
管理接口,把结果和其它文件传送回数据中心。它包括路由。
它还被仿真UAS的UTD2ETS和Launchtest组件仿真。
UAS.IPrint(接口)
物理视图报告
保存用于重印的分数报告的管理系统接口。
它还被仿真UAS的UTD2ETS和Launchtest组件仿真。
UAS.IAppointment(接口)
该接口是统一管理系统的一部分。它允许访问参加该测验的候选者的候选者信息。
它还被仿真UAS的UTD2ETS和Launchtest组件仿真。
物理视图报告
总计:
2个组件
51个类
组件封装结构
组件视图
附图B-POLESS类和接口
逻辑视图报告
目录
内容目录……………………………………………………………………………………………………………………… 2
选择的逻辑视图报告………………………………………………………………………………………………………… 3
LOGICAL VIEW………………………………………………………………………………………………………………… 3
CAlgorithm…………………………………………………………………………………………………………………… 3
CEnumAlgorithm……………………………………………………………………………………………………………… 3
CEnumProviders……………………………………………………………………………………………………………… 3
CProvider………………………………………………………………………………………………………………………3
IAlgorithm…………………………………………………………………………………………………………………… 4
ICrypto…………………………………………………………………………………………………………………………4
IEnumAlgorithms………………………………………………………………………………………………………………5
IEnumProviders……………………………………………………………………………………………………………… 5
IFileRoot………………………………………………………………………………………………………………………7
POLESS.IPropertyStorageAmalgamated…………………………………………………………………………………… 8
POLESS.IPropertyStorageVB…………………………………………………………………………………………………8
POLESS.IStorageAmalgamated……………………………………………………………………………………………… 9
POLESS.IStorageVB………………………………………………………………………………………………………… 10
POLESS.IStreamVB……………………………………………………………………………………………………………12
POLESS.IcStorage……………………………………………………………………………………………………………13
POLESS.IcStorageRoot………………………………………………………………………………………………………13
POLESS.cCrypto………………………………………………………………………………………………………………14
POLESS.cFileRoot……………………………………………………………………………………………………………14
POLESS.cPropertyStorage………………………………………………………………………………………………… 15
POLESS.cPropertyStorageAmalgamated……………………………………………………………………………………15
POLESS.cStorage…………………………………………………………………………………………………………… 15
POLESS.cStorageAmalgamated………………………………………………………………………………………………15
POLESS.cStorageRoot……………………………………………………………………………………………………… 15
POLESS.cStream………………………………………………………………………………………………………………15
POLESS.iStorageVB………………………………………………………………………………………………………… 15
POLESS.iStreamVB……………………………………………………………………………………………………………15
总计:…………………………………………………………………………………………………………………………16
逻辑封装结构…………………………………………………………………………………………………………………16
逻辑视图报告
选择的逻辑视图报告
CAlgorithm
CEnumAlgorithm
CEnumProviders
CProvider
逻辑视图报告
IAlgorithm
公共操作:
get_id(pAlgId:LONG*):HRESULT
get_length(pdwLength:LONG*):HRESULT
get_minLength(dwMinLength:LONG*):HRESULT
get_maxLength(dwMaxLength:LONG*):HRESULT
get_numProtocols(dwNumProtocols:LONG*):HRESULT
get_name(sName:BSTR*):HRESULT
get_longName(sName:BSTR*):HRESULT
get_class(peAlgClass:eAlgorithmClass):HRESULT
ICrypto
加密/解密接口
公共操作
get_ProviderName(psProviderName:BSTR*):HRESULT
返回Cyrto提供者名称
put_ProviderName(sProviderName:BSTR):HRESULT
设定Cyrto提供者名称
get_Password(sPassword:BSTR*=″″):HRESULT
只用于Sponsor资源文件
put_Password(sPassword:BSTR):HRESULT
只用于Sponsor资源文件
get_FileType(eFileType:eFILE_TYPE):HRESULT
put_FileType(eFileType:eFILE_TYPE):HRESULT
逻辑视图报告
get_Algorithm(eAlgorithm:eALGORITHM):HRESULT
put_Algorithm(eAlgorithm:eALGORITHM):HRESULT
EnumProviders(eProvType:eProviderType,ppenum:IEnumProviders**):HRESULT
EnumAlgorithms(sProvName:BSTR,eAlgClass:eAlgorithmClass,ppenum:IEnumAlgorithms**):HRESULT
IEnumAlgorithms
公共操作:
Next(ppProv:IAlgorithm**):HRESULT
返回下一个算法接口,如果没有更多的算法,则返回为空。
Skip(celt:ULONG):HRESULT
跳过下一个指定的算法编号。
Reset():HRESULT
将计数器重新设定到开始。
Clone(ppenum:IEnumAlgorithms):HRESULT
产生另一个计数器,它包含与当前状态相同的枚举状态。
IEnumProviders
公共操作:
Next(ppProv:IProvider**):HRESULT
返回下一个提供者接口,或在没有更多的提供者的情况下返回为空。
Skip(celt:ULONG):HRESULT
跳过下一个指定的提供者的编号。
Reset():HRESULT
将计数器重新设定到开始。
逻辑视图报告
Clone(ppenum:IEnumProvider**):HRESULT
产生另一个计数器,它包含与当前状态相同的列举状态。
逻辑视图报告
IFileRoot
根POLESS接口。该接口应该仅用于一次打开一个文件,并且不应该被释放,直到所有其他存储、流和特性存储接口被释放和文件准备被关闭为止。
公共操作:
StorageFileCreate(sFileName:String,eBlockSize:eBLOCK_SIZE,eAccessMode:eACCESS_MODE,bCompression:Boolean,bEncrypt:Boolean,oCrypto:POLESS.cCrypto,bCRC:Boolean):iStorage
创建一个新的存储文件。返回根存储接口。通过存储根存储中的一个流中的这个类的CLSID,将新的结构化存储文件标记为一个POLESS文件。
StorageFileOpen(sFileName:String,eAccessMode:eACCESS_MODE):iStorage打开一个现有存储文件。返回根存储接口。
如果被允许和读访问模式被选择,则校验CRC。如果CRC不匹配,则返回一个错误。
CryptoGet():POLESS.cCrypto
获取一个默认配置的密码类。在存储文件的打开和创建时,它应该被设置和使用。
bStorageFile(sFileName:String):Boolean
如果提供的文件是一个OLE结构化存储文件和一个POLESS存储文件,则返回为真。
StorageAmalgamatedGet():POLESS.cStorageAmalgamated
获取一个空cStorageAmalgamted。
PropertyStorageAmalgamatedGet():POLESS.cPropertyStorageAmalgamated
DeltaFileCreate(sFileNameOriginal:String,sFileNameUpdate:String,sFileNameDelta:String,bEncrypt:Boolean,oCrypto:POLESS.cCrypto,bCRC:Boolean):
创建一个POLESS差别文件。它把原始POLESS文件与更新POLESS文件进行比较,并创建一个增量POLESS文件。
增量文件包含对原始POLESS文件进行分支添加和分支删除,以创建更新的POLESS树。它包含原始文件的CRC和更新文件的CRC。
DeltaFileApply(sFileNameOriginal:String,sFileNameUpdate:String,sFileNameDelta:String):
逻辑视图报告
应用一个POLESS增量文件。它应用于到达增量POLESS文件的原始POLESS文件,并创建一个更新的POLESS文件。
应用于原始POLESS文件的增量文件中的CRC与原始文件的计算出的CRC进行比较。
如果它们匹配,则增量被结合,以创建更新的POLESS文件。更新文件的CRC被计算,并与增量文件中的更新文件CRC进行比较。
GetObjectFromPath(sFullPath:BSTR,eAccessMode:eACCESS_MODE,ppDisp:IDispatch**):HRESULT
使用别名来检索被路径命名的对象。返回一个指向被检索对象的IDispatch指针。
CreateStreamFromFile(sName:BSTR,ppDisp:IDispatch**):HRESULT
创建一个结构化存储流,和把它填充到文件的内容中。
CreateStreamFromBSTR(sIn:BSTR,ppDisp:IDispatch**):HRESULT
创建一个结构化存储流,和把它填充到指定BSTR。
MemoryStreamFromStream(pStreamIn:IStream*,ppDisp:IDispatch**):HRESULT
用于将一个流拷贝到一个新创建的存储流对象,操作后,两个流的查找指针被重置到流的开始。
GetBindCtx(ppBindCtx:IBindCtx**):HRESULT
返回用于创建别名的静态连接前后关系。
POLESS.IPropertyStorageAmalgamated
公共操作:
PropertyStorageAdd(oPropertySet:IDispatch*,bEnd:VARIANT_BOOL=TRUE):HRESULT
将一个PropertySet添加到PropertySets的集合中。
ClearStorage():HRESULT
清除PropertySets的集合。
POLESS.IPropertyStorageVB
管理一个单特性集的持续特性。
逻辑视图报告
公共操作
ReadVB(sName:BSTR,ppvVal:VARIANT**):HRESULT
从特性组中读取一指定特性的值。
WriteVB(sName:BSTR,pvVal:VARIANT*):HRESULT
将一个指定特性的值写到特性组。如果该特性不存在,则将创建特性/值对。
如果该特性已存在,则若以eAccess_Write模式打开,该值将被更新。
Delete(sName:BSTR):HRESULT
从特性组中删除一个特性。
CommitVB(grfFlags:DWORD):HRESULT
RevertVB():HRESULT
SetClass(sProgId:BSTR):HRESULT
get_nCount(nCount:short*):HRESULT
返回特性集中的特性数量。
CopyTo(pDest:IPropertyStorageVB*):HRESULT
把源特性集的内容拷贝到一个目的地特性集。
GetName(nIndex:short,sName:BSTR*):HRESULT
返回指定特性的名称。
POLESS.IStorageAmalgamated
公共操作:
StorageAdd(oStorage:IStorage,bEnd:VARIANT_BOOL=TRUE):
将一个新存储添加到存储的集合中。
ClearStorage():
从集合中清除所有存储对象。
逻辑视图报告
POLESS.IStorageVB
公共操作:
Clear():
清除所有元素的存储:子存储和流。
CommitVB():
确保对以事务处理模式打开的存储对象所做的变化反射在父存储中。对于直接模式的非根存储对象,该方法无效。对于一个根存储,它反射实际设备中如磁盘中的一个文件的变化。对于以直接模式打开的根存储对象,总是在释放该对象之前调用Commit方法。Commit把所有存储缓冲器刷新到采用直接模式的根存储的磁盘中,并在失败之前返回一个错误代码。虽然释放该对象也将存储缓冲器刷新到磁盘,但不能在失败前返回任何错误代码。因此,在不是首次调用Commit的情况下,调用的释放导致不确定的结果。
RevertVB():
放弃自最后commit操作以来对存储对象已做的所有变化。
sElementName(vElement:Variant):String
返回元素的名称。
bStorage(vElement:Variant):Boolean
如果元素是一个子存储,则返回为真。
oElement(vElement:Variant):Object
返回被选元素的POLESS.iStreamVB或POLESS.iStorageVB。
CreateStream(sName:String,eAccess:eACCESS_MODE,bCompression:Boolean):POLESS.iStreamVB
创建和打开具有包含在该存储对象中的指定名称的一个流对象。一个存储对象内的所有元素-流和其它存储对象-被以相同的名称空间保存。
如果流不能被创建,则无返回。
逻辑视图报告
POLESS.IStorageVB
公共操作:
Clear():
清除所有元素的存储:子存储和流。
CommitVB():
确保对以事务处理模式打开的存储对象所做的变化反射在父存储中。对于直接模式的非根存储对象,该方法无效。对于一个根存储,它反射实际设备中如磁盘中的一个文件的变化。对于以直接模式打开的根存储对象,总是在释放该对象之前调用Commit方法。Commit把所有存储缓冲器刷新到采用直接模式的根存储的磁盘中,并在失败之前返回一个错误代码。虽然释放该对象也将存储缓冲器刷新到磁盘,但不能在失败前返回任何错误代码。因此,在不是首次调用Commit的情况下,调用的释放导致不确定的结果。
RevertVB():
放弃自最后commit操作以来对存储对象已做的所有变化。
sElementName(vElement:Variant):String
返回元素的名称。
bStorage(vElement:Variant):Boolean
如果元素是一个子存储,则返回为真。
oElement(vElement:Variant):Object
返回被选元素的POLESS.iStreamVB或POLESS.iStorageVB。
CreateStream(sName:String,eAccess:eACCESS_MODE,bCompression:Boolean):POLESS.iStreamVB
创建和打开具有包含在该存储对象中的指定名称的一个流对象。一个存储对象内的所有元素-流和其它存储对象-被以相同的名称空间保存。
如果流不能被创建,则无返回。
逻辑视图报告
OpenStream(sName:String,eAccess:eACCESS_MODE):POLESS.iStreamVB
以指定访问模式打开该存储对象内的一个现有流对象。
如果流名称没有被找到,则将查找带有前缀“/03”的一个流名称。这是一个链接流。
该流的内容是发现该流地方的文件和存储。
如果该流不能被打开,则无返回。
CreateStorage(sName:String,eAccess:eACCESS_MODE):POLESS.iStorageVB
创建和打开嵌套在该存储对象内的一个新存储对象。
如果该存储不能被创建,则无返回。
OpenStorage(sName:String,eAccess:eACCESS_MODE):POLESS.iStorageVB
以指定访问模式打开指定名称的一个现有存储对象。
如果存储不能被打开,则无返回。
get_sName(sName:BSTR*):HRESULT
返回存储的名称。
get_oStorage(ppDisp:IDispatch**):HRESULT
返回IDispatch接口。
get_nCount(pnCount:short*):HRESULT
返回存储中的元素数。
GetCompression():Boolean
确定流是否能够被压缩在文件中。当被创建时,能够的流是否可被选择压缩。
GetEncryption():Boolean
确定是否能够对文件加密。能够的所有流是否将被加密。
GetCRC():Boolean
指示一个CRC校验是否可在文件上执行。
逻辑视图报告
CreateStreamLinked(sName:BSTR,sLocation:BSTR,sFile:BSTR,eAccess:eACCESS_MODE,ppStreamVB:IStreamVB**):HRESULT
CreatePropertyStg(sName:BSTR,grfFlags:DWORD,bCompress:VARIANT_BOOL,ppPropStg:IPropertyStorageVB):HRESULT
创建一个特性存储。
OpenPropertyStg(sName:BSTR,grfFlags:DWORD,dwReserved:DWORD,ppPropStg:IPropertyStorageVB):HRESULT
SetClass(sProgId:BSTR):HRESULT
RegisterAlias(sName:BSTR):HRESULT
Destroy(sName:BSTR):HRESULT
破坏指定的元素。
POLESS.IStreamVB
公共操作:
ReadVB(bytData:byte(),nBytes:Integer):HRESULT
从流中读取数据。
WriteVB(bytData:byte()):HRESULT
把数据写入流中。整个字节数组被写。
Clear():HRESULT
清除所有数据的流。
Reset():HRESULT
将流中的位置重新设定在开始位置。
get_sName(sName:BSTR*):HRESULT
返回流的名称。
get_oStream(ppDisp:IDispatch**):HRESULT
返回IDispatch接口。
CopyTo(pDest:IStreamVB*):HRESULT
逻辑视图报告
将一个源流的内容拷贝到一个目的流。
POLESS.IcStorage
由IStorage派生的
公共操作:
CreatePropertyStg(sName:BSTR,grfFlags:DWORD,bCompress:Boolean,ppPropStg:IPropertyStorage**):HRESULT
创建和打开一个流对象中的一个特性组。
OpenPropertyStg(sName:BSTR,grfFlags:DWORD,dwReserved:DWORD,ppPropStg:IPropertyStorage**):HRESULT
打开一个指定流对象中的一个现有特性组。
CreateStreamLinked(sName:BSTR,sLocation:BSTR,sFile:BSTR,eAccess:eAccess_MODE,ppStream:IStream**):HRESULT
RegisterAlias(sName:BSTR):HRESULT
POLESS.IcStorageRoot
由POLESS.IcStorage派生的
公共操作:
get_Compression(pbCompress:VARIANT_BOOL*):HRESULT
确定流是否能够被压缩在文件中。能够的流在被创建时是否可选择被压缩。
get_Encryption(pbEncrypt:VARIANT_BOOL*):HRESULT
确定是否能够对文件加密。能够的话是否所有流均将被加密。
get_CRC():HRESULT
指示对文件是否执行一个CRC校验。
GetObjectFromPath(sItemPath:BSTR,eAccessMode:eACCESS_MODE,refiid:REFIID,ppUnk:IUnknown**):HRESULT
逻辑视图报告
POLESS.cCrypto
该类控制结构化存储的加密/解密的配置。
公共属性:
sProviderName:String=MS_DEF_PROV
密码提供方的名称。
eProviderType:ePROVIDER_TYPE=PROV_RSA_FULL
密码提供方的类型。
密码机提供方类型
密码范围大并正在迅速扩展。有一些不同的标准数据格式和协议。这些通常被组织为组或家族,其中的每一个具有其自身的一套数据格式和其自身的编码方式。即使两个家族使用相同的算法(例如,RC2块密码),但它们将通常使用不同的填充机制,不同的关键字长度,和不同的默认模式。MicrosoftCryptoAP被设计为一个CSP提供方类型表示一个特定家族。
ePROV_RSA_FULL
ePROV_RSA_SIG
ePROV_RSA_SCHANNEL
ePROV_DSS
ePROV_DSS_DH
ePROV_DH_SCHANNEL
ePROV_FORTEZZA
ePROV_MS_EXCHANGE
ePROV_SSL
sContainerName:String
关键字名称。无默认,必须由使用者提供。
sPassword:String
公共/专用关键字对的可选密码。仅用于一个人员的输入。可用于Review磁盘和它们的资源文件。
POLESS.cFileRoot
根据POLESS类。必须被示例,以执行任何POLESS函数。创建和打开POLESS文件的句柄。
逻辑视图报告
POLESS.cPropertyStorage
POLESS.cPropertyStorageAmalgamated
POLESS.cStorage
iStorage的POLESS实现。它处理任何指定的POLESS事情,然后将工作委托到(deligate)OLE2复合文档存储类。
POLESS.cStorageAmalgamated
iStorage的POLESS实现。类拥有iStorage对象的一个有序集合的参考。
当一个流被打开时,它按顺序搜索存储对象的集合,以找到具有被请求流的第一个存储对象。它返回该流。
它处理复合流分解,并把所有其它工作捆扎到POLESS.cStorage。该存储是只读的。它将不允许创建流或存储。它主要是用来读测验资源文件。
注意:这不能处理复合文档。
POLESS.cStorageRoot
iStorage和iStorageRoot的POLESS实现。它处理任何指定的根POLESS事情,然后将工作委托到标准POLESS存储类。
POLESS.cStream
iStream的POLESS实现。它处理指定的POLESS的任何事情,然后将工作委托到OLE2复合文档流类。指定工作包括流的压缩/解压缩和加密/解密。
POLESS.iStorageVB
一个VB友好的存储接口
POLESS.iStreamVB
一个VB友好的流接口
权利要求书
(按照条约第19条的修改)
1.一种用于至少一个测验的基于计算机的测验系统,所述至少一个测验具有展示格式和数据内容,所述系统包括:
测验驱动器,其具有控制功能的可执行代码,使得所述测验驱动器能够:利用显示装置向应试者提供所述至少一个测验,管理所述至少一个测验,控制所述至少一个测验的进度,控制所述至少一个测验的计分,并且控制所述至少一个测验的结果报告;
资源文件,其与所述测验驱动器有可操作的数据交换,存储与所述至少一个测验的数据内容、展示格式、进度、计分和结果报告有关的信息,该信息对于所述测验驱动器是可访问的,以便实现所述测验驱动器的功能;以及
扩展模块,其与所述测验驱动器和所述资源文件有可操作的数据交换,从所述资源文件检索与所述至少一个测验的数据内容、展示格式、进度、计分和结果报告中的至少一个有关的信息,并在所述至少一个测验的提供过程中给所述测验驱动器提供所述信息,所述扩展模块扩展所述测验驱动器的功能,而不必修改所述测验驱动器的可执行代码。
2.如权利要求1所述的系统,其中存储在所述资源文件中的信息含有可扩展标置语言格式。
3.如权利要求1所述的系统,其中所述扩展模块包括插件。
4.如权利要求3所述的系统,其中所述扩展模块在所述测验驱动器构建之后被编写。
5.如权利要求1所述的系统,其中所述资源文件包含结构化存储的持久数据。
6.如权利要求1所述的系统,进一步包括功能接口,其使得所述测验驱动器与所述扩展模块之间能够通信,其中所述功能接口使得所述测验驱动器能够在一个测验提供周期开始时将核心对象参考加载到所述扩展模块,并在该测验提供周期完成时从所述扩展模块卸载所述核心对象参考。
7.如权利要求6所述的系统,其中所述测验驱动器访问存储在所述扩展模块中的信息,所述系统进一步包括特征接口,其使得使所述测验驱动器与所述扩展模块之间能够通信,并使得所述测验驱动器能够访问所述扩展模块中的信息,从而加强所述测验驱动器的功能。
8.如权利要求7所述的系统,其中存储在所述扩展模块中的信息包括非交互式显示资料、测验导航、测验导航控制、项目、定时、选择、计分、结果和报告中的至少一个,并且其中所述特征接口使得所述测验驱动器能够访问所述信息。
9.如权利要求7所述的系统,其中所述功能接口使得所述测验驱动器能够通知所述扩展模块:所述至少一个测验正在被提供,并且所述测验驱动器正在访问存储在所述扩展模块中的信息。
10.如权利要求1所述的系统,进一步包括:
源文件,其与所述扩展模块有可操作的数据交换,存储与所述至少一个测验的数据内容、展示格式、进度、计分和结果报告有关的信息;和
测验封装器,其与所述源文件和所述扩展模块有可操作的数据交换,将来自所述源文件的信息传送给所述扩展模块,从而使得所述扩展模块能够确认来自所述源文件的信息。
11.如权利要求10所述的系统,进一步包括功能接口,其使得所述测验封装器与所述扩展模块之间能够通信。
12.如权利要求11所述的系统,其中所述功能接口使得所述测验封装器能够通知所述扩展模块:所述源文件存在,所述源文件中的信息要被确认,并且要将来自所述源文件的信息传送给所述扩展模块,从而使所述扩展模块能够确认来自所述源文件的信息,所述信息进一步包括非交互式显示资料、测验导航、测验导航控制、项目、定时、选择、计分、结果和报告中的至少一个。
13.如权利要求10所述的系统,进一步包括数据文件、可视格式文件和多媒体文件,其中所述的数据文件、可视格式文件和多媒体文件包括与所述至少一个测验的数据内容、展示格式、进度、计分和结果报告有关的进一步信息。
14.如权利要求10所述的系统,进一步包括资源持久性接口,其使得所述扩展模块与所述资源文件之间能够通信,从而使所述扩展模块能够将来自所述源文件的信息存储到所述资源文件中,并从所述资源文件检索所述信息,其中所述扩展模块在所述至少一个测验的提供过程中从所述资源文件检索所述信息。
15.如权利要求14所述的系统,其中所述资源持久性接口能够将来自所述源文件的信息作为数据流、数据集和目录中的至少其中之一而存储到所述资源文件中。
16.如权利要求15所述的系统,其中所述数据集包括名称-数值对。
17.如权利要求15所述的系统,其中所述目录包括数据的子目录、流和集合中的至少一个。
18.如权利要求10所述的系统,其中所述测验封装器包括编译器。
19.如权利要求10所述的系统,其中存储在所述源文件中的信息含有可扩展标置语言格式,并且其中确认所述信息使得所述扩展模块必须确定所述信息是否被正确格式化。
20.如权利要求19所述的系统,其中所述信息的正确格式是在规划中被定义的,并且是以所述扩展模块的代码而被细化的。
21.如权利要求19所述的系统,其中:
存储在所述资源文件中的信息是由测验发行者编辑的;
当所述信息被编辑时使用规划,从而使得当所述信息被编辑时,能够确认所述信息。
22.如权利要求1所述的系统,进一步包括实例文件,其与所述测验驱动器和所述扩展模块有可操作的数据交换,包含测验状态信息,该测验状态信息包括在所述至少一个测验过程中所述应试者对展示给该应试者的项目所提供的回答。
23.如权利要求22所述的系统,其中所述实例文件进一步包括以下至少其中之一:在所述至少一个测验的各单元上已使用时间和剩余时间的计时,当前提供的单元,以及应试者得分。
24.如权利要求22所述的系统,进一步包括实例持久性接口,其使得所述扩展模块和所述实例文件之间能够通信,从而使所述扩展模块能够将所述测验状态信息存储到所述实例文件,并从所述实例文件检索所述测验状态信息,其中如果所述至少一个测验被中断,则所述扩展模块能够检索在所述至少一个测验中断之前由所述应试者提供的所述测验状态信息,并使所述应试者能够在原位置继续所述至少一个测验。
25.如权利要求22所述的系统,其中所述实例文件包括结构化存储持久性数据。
26.一种用于至少一个测验的基于计算机的测验系统,所述至少一个测验具有展示格式和数据内容,所述系统包括:
源文件,其存储与所述至少一个测验的数据内容、展示格式、进度、计分和结果报告中的至少一个有关的信息,其中存储在所述源文件中的信息是由测验发行者编辑的;
测验封装器,其与所述源文件有可操作的数据交换,从所述源文件检索所述信息;和
资源文件,其与所述测验封装器有可操作的数据交换,存储由所述测验封装器检索的所述信息;
测验驱动器,其具有控制功能的可执行代码,使得所述测验驱动器能够:利用显示装置向应试者提供所述至少一个测验,管理所述至少一个测验,控制所述至少一个测验的进度,控制所述至少一个测验的计分,并且控制所述至少一个测验的结果报告,而存储在所述资源文件中的信息对于所述测验驱动器是可访问的,以便实现所述测验驱动器的功能;
扩展模块,其与所述测验封装器和所述测验驱动器有可操作的数据交换,从所述测验封装器接收存储在所述源文件中的信息,确认从所述测验封装器接收到的信息,将所述信息存储到所述资源文件,从所述资源文件检索所述信息,并且在所述至少一个测验的提供过程中给所述测验驱动器提供所述信息,所述扩展模块扩展所述测验驱动器的功能,而不必修改所述测验驱动器的可执行代码;以及
实例文件,其与所述测验驱动器和所述扩展模块有可操作的数据交换,存储测验状态信息,该测验状态信息包括在所述至少一个测验过程中所述应试者对展示给该应试者的项目所提供的回答,所述测验状态信息是所述扩展模块可访问的,从而如果所述至少一个测验被中断,则所述至少一个测验能够重新开始。
27.如权利要求26所述的系统,其中所述实例文件进一步存储以下至少其中之一:在所述至少一个测验的各单元上已使用时间和剩余时间的计时,当前提供的单元,以及应试者得分。
28.如权利要求26所述的系统,其中存储在所述资源文件中的信息含有可扩展标置语言格式,
29.如权利要求26所述的系统,其中所述扩展模块包括插件。
30.如权利要求26所述的系统,其中所述扩展模块在所述测验驱动器构建之后被编写。
31.如权利要求26所述的系统,其中所述资源文件和所述实例文件包括结构化存储的持久数据。
32.如权利要求26所述的系统,进一步包括功能接口,其使得所述测验驱动器与所述扩展模块之间以及所述封装器与所述扩展模块之间能够通信,其中:
所述功能接口使得所述测验驱动器能够在一个测验提供周期开始时将核心对象参考加载到所述扩展模块,并在该测验提供周期完成时从所述扩展模块卸载所述核心对象参考;并且
所述功能接口使得所述封装器能够通知所述扩展模块:所述源文件存在,所述源文件中的所述信息要被确认,并且要将来自所述源文件的信息传送给所述扩展模块,从而使所述扩展模块能够确认来自所述源文件的信息,所述信息进一步包括非交互式显示资料、测验导航、测验导航控制、项目、定时、选择、计分、结果和报告中的至少一个。
33.如权利要求32所述的系统,其中所述测验驱动器访问存储在所述扩展模块中的所述信息,该信息具有与非交互式显示资料、测验导航、测验导航控制、项目、定时、选择、计分、结果和报告中的至少一个有关的类型,所述系统进一步包括特征接口,其使得所述测验驱动器和所述扩展模块之间能够通信,并使所述测验驱动器能够访问所述扩展模块中的信息,从而加强所述测验驱动器的功能。
34.如权利要求26所述的系统,进一步包括数据文件、可视格式文件和多媒体文件,其中所述的数据文件、可视格式文件和多媒体文件包括与所述至少一个测验的所述数据内容、展示格式、进度、计分和结果报告有关的进一步信息。
35.如权利要求26所述的系统,进一步包括:
资源持久性接口,其使得所述扩展模块与所述资源文件之间能够通信,从而使所述扩展模块能够将来自所述源文件的信息存储到所述资源文件中,并从所述资源文件检索所述信息,其中所述扩展模块在所述至少一个测验的提供过程中从所述资源文件检索所述信息,并且其中所述信息能够作为数据流、数据集和目录中的至少一个而被存储到所述资源文件中;和
实例持久性接口,其使得所述扩展模块和所述实例文件之间能够通信,从而使所述扩展模块能够将所述测验状态信息存储到所述实例文件,并从所述实例文件检索所述信息,其中如果所述至少一个测验被中断,则所述扩展模块能够检索在所述至少一个测验中断之前由所述应试者提供的所述测验状态信息,并使所述应试者能够在原位置继续所述至少一个测验。
36.如权利要求26所述的系统,其中:
所述测验封装器包括编译器;
所述资源文件中的所述信息含有可扩展标置语言格式;并且
确认所述信息使得所述扩展模块必须确定所述信息是否被正确格式化。
37.如权利要求26所述的系统,其中所述信息的正确格式是在规划中被定义的。
38.如权利要求26所述的系统,其中当所述信息被编辑时使用规划,从而使得当所述信息被编辑和被写入所述源文件时,所述信息能够被确认。
39.一种用于至少一个测验的基于计算机的测验系统,所述至少一个测验具有展示格式和数据内容,所述系统包括:
测验驱动器装置,用于:控制利用显示装置向应试者提供所述至少一个测验,管理所述至少一个测验,控制所述至少一个测验的进度,控制所述至少一个测验的计分,并且控制所述至少一个测验的结果报告,所述测验驱动器装置具有可执行代码,其控制所述测验驱动器装置;
资源存储装置,其与所述测验驱动器装置有可操作的数据交换,用于存储与所述至少一个测验的数据内容、展示格式、进度、计分和结果报告有关的信息,该信息对于所述测验驱动器装置是可访问的,以便实现所述测验驱动器的功能;和
扩展装置,其与所述测验驱动器装置和资源存储装置有可操作的数据交换,用于从所述资源存储装置检索与所述的数据内容、展示格式、进度、计分和结果报告中的至少一个有关的信息,并在所述至少一个测验的提供过程中给所述测验驱动器装置提供所述信息,所述扩展模块扩展所述测验驱动器装置的能力,以:控制利用显示装置向应试者提供所述至少一个测验,管理所述至少一个测验,控制所述至少一个测验的进度,控制所述至少一个测验的计分,并且控制所述至少一个测验的结果报告,而不必修改所述测验驱动器装置的可执行代码。
40.如权利要求39所述的系统,进一步包括功能接口装置,其使得所述测验驱动器装置与所述扩展装置之间能够通信,其中所述功能接口装置使得所述测验驱动器能够在一个测验提供周期开始时将核心对象参考加载到所述扩展装置,并在所述测验提供周期完成时从所述扩展装置卸载所述核心对象参考,而且其中所述功能接口装置使得所述测验驱动器装置能够通知所述扩展装置:所述至少一个测验正在被提供,并且所述测验驱动器装置要访问存储在所述扩展装置中的信息。
41.如权利要求40所述的系统,其中所述测验驱动器装置访问存储在所述扩展装置中的信息,该信息具有与非交互式显示资料、测验导航、测验导航控制、项目、定时、选择、计分、结果和报告中的至少一个有关的类型,所述系统进一步包括特征接口,其使得所述测验驱动器装置和所述扩展装置之间能够通信,所述扩展装置扩展所述测验驱动器装置的能力,以:控制利用显示装置向应试者提供所述至少一个测验,管理所述至少一个测验,控制所述至少一个测验的进度,控制所述至少一个测验的计分,并且控制所述至少一个测验的结果报告,而不必修改所述测验驱动器的可执行代码。
42.如权利要求39所述的系统,进一步包括:
源存储装置,其与所述扩展装置有可操作的数据交换,用于存储与所述至少一个测验的所述数据内容、展示格式、进度、计分和结果报告有关的所述信息;和
测验封装装置,其与所述源存储装置和所述扩展装置有可操作的数据交换,用于将来自所述源存储装置的所述信息传送给所述扩展装置,从而使得所述扩展装置能够确认来自所述源存储装置的信息。
43.如权利要求42所述的系统,进一步包括功能接口装置,其使得所述测验封装装置与所述扩展装置之间能够通信,其中所述功能接口装置使得所述测验封装装置能够通知所述扩展装置:所述源存储装置存在,所述源存储装置中的信息要被确认,并且要将来自所述源存储装置的信息传送到所述扩展装置,从而使所述扩展装置能够确认来自所述源存储装置的信息,所述信息进一步包括非交互式显示资料、测验导航、测验导航控制、项目、定时、选择、计分、结果和报告中的至少一个。
44.如权利要求42所述的系统,进一步包括数据文件、可视格式文件和多媒体文件,其中所述的数据文件、可视格式文件和多媒体文件包括与所述至少一个测验的所述数据内容、展示格式、进度、计分和结果报告有关的进一步信息。
45.如权利要求42所述的系统,进一步包括资源持久性接口装置,其使得所述扩展装置和所述资源存储装置之间能够通信,从而使所述扩展装置能够将来自所述源存储装置的信息存储到所述资源存储装置中,并从所述资源存储装置检索所述信息,其中所述扩展装置在所述测验提供周期中从所述资源存储装置检索所述信息。
46.如权利要求45所述的系统,其中所述资源持久性接口装置能够将来自所述源存储装置的所述信息作为数据流、数据集和目录中的至少其中之一而存储到所述资源存储装置中。
47.如权利要求46所述的系统,其中所述源存储装置中的信息含有可扩展标置语言格式,并且其中确认所述信息使得所述扩展装置必须确定所述信息是否被正确格式化。
48.如权利要求39所述的系统,进一步包括实例存储装置,用于存储测验状态信息,该测验状态信息包括在所述至少一个测验过程中所述应试者对展示给该应试者的项目所提供的回答。
49.如权利要求48所述的系统,其中实例存储装置进一步存储以下至少其中之一:在所述至少一个测验的各单元上已使用时间和剩余时间的计时,当前提供的单元,以及应试者得分。
50.如权利要求49所述的系统,进一步包括实例持久性接口,用于使得所述扩展装置和所述实例存储装置之间能够通信,从而使所述扩展装置能够将所述测验状态信息存储到所述实例存储装置,并从所述实例存储装置检索所述测验状态信息,其中如果所述至少一个测验被中断,则所述扩展模块能够检索在所述至少一个测验中断之前存储在所述扩展装置内的所述测验状态信息,并使所述应试者能够在原位置继续所述至少一个测验。
51.一种用于至少一个测验的基于计算机的测验系统,所述至少一个测验具有展示格式和数据内容,所述系统包括:
用于编辑与所述至少一个测验的数据内容、展示格式、进度、计分和结果报告中的至少一个有关的信息的装置;
用于存储所述信息的第一装置;
用于从所述用于存储的第一装置检索所述信息的第一装置;
从所述用于检索的第一装置接收存储在所述用于存储的第一装置中的所述信息的装置;
用于通过所述扩展模块来确认从所述用于检索的装置接收到的所述信息的装置;
用于存储被所述用于确认的装置所确认的所述信息的第二装置;
用于控制下列功能的装置:利用显示装置向应试者提供所述至少一个测验,管理所述至少一个测验,控制所述至少一个测验的进度,控制所述至少一个测验的计分,并且控制所述至少一个测验的所述结果报告;
用于检索存储在所述用于存储的第二装置中的所述信息的第二装置;
用于在所述至少一个测验的提供过程中、将被所述用于检索的第二装置检索到的所述信息提供给所述用于控制的装置的装置,其中所述信息实现所述测验驱动器的功能;
存用于储测验状态信息的第三装置,该测验状态信息包括所述应试者对于在所述至少一个测验过程中由实例文件展示给所述应试者的项目所提供的回答,如果所述至少一个测验被中断,所述测验状态信息能够使所述至少一个测验重新开始;和
通过所述第二装置和所述用于控制的第三装置、从所述用于存储的第三装置检索所述测验状态信息的第三装置。
52.一种用于至少一个测验的基于计算机的测验系统,所述至少一个测验具有展示格式和数据内容,所述系统包括:
测验驱动器,其具有控制功能的可执行代码,使得所述测验驱动器能够:利用显示装置向应试者提供所述至少一个测验,管理所述至少一个测验,控制所述至少一个测验的进度,控制所述至少一个测验的计分,并且控制所述至少一个测验的结果报告;
资源文件,其与所述测验驱动器有可操作的数据交换,存储多种信息,包括所述至少一个测验的与非交互式显示资料有关的第一信息、与测验导航有关的第二信息、与测验导航控制有关的第三信息、与项目有关的第四信息、与定时有关的第五信息、与选择有关的第六信息、与计分有关的第七信息、与结果有关的第八信息、和与报告有关的第九信息,所述多种信息对于所述测验驱动器是可访问的,以便实现所述测验驱动器的功能;
第一扩展模块,其与所述资源文件和所述测验驱动器有可操作的数据交换,从所述资源文件检索与非交互式显示资料有关的所述第一信息,并且在所述至少一个测验的提供过程中给所述测验驱动器提供所述第一信息;
第二扩展模块,其与所述资源文件和所述测验驱动器有可操作的数据交换,从所述资源文件检索与测验导航有关的所述第二信息,并且在所述测验的提供过程中给所述测验驱动器提供所述第二信息;
第三扩展模块,其与所述资源文件和所述测验驱动器有可操作的数据交换,从所述资源文件检索与测验导航控制有关的所述第三信息,并且在所述测验的提供过程中给所述测验驱动器提供所述第三信息;
第四扩展模块,其与所述资源文件和所述测验驱动器有可操作的数据交换,从所述资源文件检索与项目有关的所述第四信息,并且在所述测验的提供过程中给所述测验驱动器提供所述第四信息;
第五扩展模块,其与所述资源文件和所述测验驱动器有可操作的数据交换,从所述资源文件检索与定时有关的所述第五信息,并且在所述测验的提供过程中给所述测验驱动器提供所述第五信息;
第六扩展模块,其与所述资源文件和所述测验驱动器有可操作的数据交换,从所述资源文件检索与选择有关的所述第六信息,并且在所述测验的提供过程中给所述测验驱动器提供所述第六信息;
第七扩展模块,其与所述资源文件和所述测验驱动器有可操作的数据交换,从所述资源文件检索与计分有关的所述第七信息,并且在所述测验的提供过程中给所述测验驱动器提供所述第七信息;
第八扩展模块,其与所述资源文件和所述测验驱动器有可操作的数据交换,从所述资源文件检索与结果有关的所述第八信息,并且在所述测验的提供过程中给所述测验驱动器提供所述第八信息;
第九扩展模块,其与所述资源文件和所述测验驱动器有可操作的数据交换,从所述资源文件检索与报告有关的所述第九信息,并且在所述测验的提供过程中给所述测验驱动器提供所述第九信息;
其中所述扩展模块扩展所述测验驱动器的功能,而不必修改所述测验驱动器的可执行代码。
53.一种用于至少一个测验的基于计算机的测验方法,所述至少一个测验具有展示格式和数据内容,所述至少一个测验是被测验驱动器控制的,所述测验驱动器具有控制功能的可执行代码,使得所述测验驱动器能够:利用显示装置向应试者提供所述至少一个测验,管理所述至少一个测验,控制所述至少一个测验的进度,控制所述至少一个测验的计分,并且控制所述至少一个测验的结果报告,所述方法包括下列步骤:
实例化一个扩展模块;
将在一个资源文件中的资源存储元素提供给所述扩展模块;
在所述至少一个测验的提供过程中将来自所述资源存储元素的信息加载到所述扩展模块,其中该来自所述资源存储元素的信息与所述至少一个测验的数据内容、展示格式、进度、计分和结果报告中的至少一个有关;和
在所述至少一个测验的提供过程中将来自所述扩展模块的信息提供给所述测验驱动器,以使所述扩展模块扩展所述测验驱动器的功能,而不必对所述测验驱动器的所述可执行代码作程序设计修改。
54.如权利要求53所述的方法,其中来自所述资源存储元素而被加载到所述扩展模块的信息进一步与非交互式显示资料、测验导航、测验导航控制、项目、定时、选择、计分、结果和报告中的至少一个有关。
55.如权利要求53所述的方法,其中所述资源文件包括结构化存储持久性数据,并且其中所述资源存储元素包括结构化存储单元。
56.如权利要求53所述的方法,其中所述将来自所述资源存储元素的信息加载到所述扩展模块是通过资源持久性接口来实现的。
57.如权利要求56所述的方法,其中所述资源持久性接口能够将来自所述资源存储元素的信息作为数据流、数据集和目录中的至少其中之一而加载到所述扩展模块。
58.如权利要求53所述的方法,其中实例化所述扩展模块是利用组件对象模型服务器、通过标准Microsoft对象实例化来实现的。
59.如权利要求53所述的方法,其中存储在所述资源存储元素中的信息含有可扩展标置语言。
60.如权利要求59所述的方法,实例化所述扩展模块进一步包括下列步骤:利用在所述资源存储元素中含有可扩展标置语言的产品标识来调用所述扩展模块。
61.如权利要求53所述的方法,进一步包括下列步骤:在一个测验提供周期开始时将来自所述测验驱动器的核心对象参考加载到所述扩展模块。
62.如权利要求61所述的方法,其中将所述测验驱动器的核心对象参考加载到所述扩展模块是利用功能接口来实现的。
63.如权利要求53所述的方法,其中将来自所述扩展模块的信息提供给所述测验驱动器是利用特征接口来实现的。
64.如权利要求53所述的方法,进一步包括下列步骤:
将在一实例文件内的实例存储单元提供给所述扩展模块;
将测验状态信息从所述扩展模块卸载到所述实例存储单元,该测验状态信息包括在所述至少一个测验过程中所述应试者对展示给该应试者的项目所提供的回答;和
将所述测验状态信息从所述实例存储单元加载到所述扩展模块,其中,如果所述至少一个测验被中断,则所述扩展模块能够检索在所述至少一个测验中断之前由所述应试者提供的所述测验状态信息,并使所述应试者能够在原位置继续所述至少一个测验。
65.如权利要求64所述的方法,其中所述实例文件包括结构化存储持久性数据,而所述实例存储单元包括结构化存储单元。
66.如权利要求64所述的方法,其中将测验状态信息加载和将测验状态信息卸载是利用实例持久性接口来实现的。
67.如权利要求66所述的方法,其中所述实例持久性接口能够将其作为数据流、数据集和目录中的至少一个,而将所述测验状态信息从所述扩展模块卸载到所述实例存储单元和将所述测验状态信息从所述实例存储单元卸载到所述扩展模块,并且其中一个实例存储单元类型是基于所述信息如何被加载到所述实例存储单元而被确定的。
68.如权利要求64所述的方法,进一步包括下列步骤:从所述测验驱动器向所述扩展模块发送一个询问,其中该询问使得所述测验驱动器能够确定所述扩展模块是否正在存储测验状态信息,并且其中如果所述扩展模块正在存储测验状态信息,则所述测验驱动器给所述扩展模块提供所述实例存储单元。
69.如权利要求64所述的方法,其中所述至少一个测验被中断,进一步包括下列步骤:将来自所述资源存储元素的、与所述至少一个测验的所述数据内容、展示格式、进度、计分和结果报告中的至少一个有关的信息重新加载到所述扩展模块,从而使所述扩展模块能够从所述资源存储元素检索所述至少一个测验被中断之前所述扩展模块正在存储的所述信息,并使所述应试者能够在原位置继续所述至少一个测验。
70.一种用于至少一个测验的基于计算机的测验方法,所述至少一个测验具有展示格式和数据内容,所述至少一个测验是被测验驱动器控制的,所述测验驱动器具有控制功能的可执行代码,使得所述测验驱动器能够:利用显示装置向应试者提供所述至少一个测验,管理所述至少一个测验,控制所述至少一个测验的进度,控制所述至少一个测验的计分,并且控制所述至少一个测验的结果报告,所述方法包括下列步骤:
实例化一个扩展模块;
将信息从一个源文件加载到所述扩展模块,所述信息与所述至少一个测验的数据内容、展示格式、进度、计分和结果报告中的至少一个有关;
确认来自所述源文件的所述信息;和
将所述信息从所述确认扩展模块卸载到一个资源文件内的资源存储元素,其中所述扩展模块扩展所述测验驱动器的功能,而不必对所述测验驱动器的所述可执行代码作程序设计修改。
71.如权利要求70所述的方法,其中来自所述源文件的所述信息进一步与非交互式显示资料、测验导航、测验导航控制、项目、定时、选择、计分、结果和报告中的至少一个有关。
72.如权利要求70所述的方法,其中实例化所述扩展模块是利用组件对象模型服务器、通过标准Microsoft对象实例化来实现的。
73.如权利要求70所述的方法,其中一个测验封装器从所述源文件获得所述信息,并将所述信息加载到所述确认扩展模块。
74.如权利要求73所述的方法,其中所述测验封装器包括编译器,并且其中来自所述资源文件的所述信息含有可扩展标置语言格式,确认所述信息进一步包括确定所述信息是否被正确格式化。
75.如权利要求74所述的方法,实例化所述扩展模块进一步包括利用在所述资源存储元素中含有可扩展标置语言的产品标识来调用所述扩展模块。
76.如权利要求70所述的方法,其中确认来自所述资源文件的所述信息是通过所述扩展模块执行的。
77.如权利要求70所述的方法,其中所述资源文件包括结构化存储持久性数据,并且所述资源存储元素包括结构化存储单元。
78.如权利要求70所述的方法,其中将信息从所述确认扩展模块卸载到所述资源存储元素是通过资源持久性接口来实现的。
79.如权利要求78所述的方法,其中所述资源持久性接口能够将所述信息作为数据流、数据集和目录中的至少一个而从所述确认扩展模块卸载到所述资源存储元素,并且其中一个资源存储元素类型是基于所述信息如何被加载到所述资源存储元素而被确定的。
80.一种用于至少一个测验的基于计算机的测验方法,所述至少一个测验具有展示格式和数据内容,所述至少一个测验是被测验驱动器控制的,所述测验驱动器具有控制功能的可执行代码,使得所述测验驱动器能够:利用显示装置向应试者提供所述至少一个测验,管理所述至少一个测验,控制所述至少一个测验的进度,控制所述至少一个测验的计分,并且控制所述至少一个测验的结果报告,所述方法包括下列步骤:
在所述至少一个测验的产生过程中实例化一个扩展模块;
将信息从一个源文件加载到所述扩展模块,所述信息与非交互式显示资料、测验导航、测验导航控制、项目、定时、选择、计分、结果和报告中的至少一个有关;
确认来自所述源文件的所述信息;
将所述信息从所述确认扩展模块卸载到一个资源文件内的资源存储元素;
在所述至少一个测验的提供过程中实例化所述扩展模块;
将所述资源文件内的所述资源存储元素提供给所述扩展模块;
在所述至少一个测验的提供过程中将信息从所述资源存储元素加载到所述扩展模块;和
在所述至少一个测验的提供过程中将所述信息从所述扩展模块提供到所述测验驱动器,从而使所述扩展模块扩展所述测验驱动器的功能,而不必对所述测验驱动器的所述可执行代码作程序设计修改。
81.一种用于至少一个测验的基于计算机的测验方法,所述至少一个测验具有展示格式和数据内容,所述方法包括下列步骤:
编辑与所述至少一个测验的所述数据内容、展示格式、进度、计分和结果报告中的至少一个有关的信息;
最初将所述信息存储在一个源文件中;
以一个测验封装器从所述源文件检索所述信息;
以一个扩展模块从所述测验封装器接收被存储在所述源文件中的所述信息;
以所述扩展模块确认从所述测验封装器接收到的所述信息;
将被所述扩展模块确认的所述信息存储到一个资源文件中;
通过一个测验驱动器来控制功能,以:利用显示装置向应试者提供所述至少一个测验,管理所述至少一个测验,控制所述至少一个测验的进度,控制所述至少一个测验的计分,并且控制所述至少一个测验的结果报告;
以所述扩展模块检索存储在所述资源文件中的所述信息;
在所述至少一个测验的提供过程中,将被所述扩展模块检索到的所述信息提供给所述测验驱动器,其中所述信息能够实现所述测验驱动器的功能;
通过一个实例文件来存储测验状态信息,该测验状态信息包括在所述至少一个测验过程中所述应试者对展示给该应试者的项目所提供的回答,如果所述至少一个测验被中断,则所述测验状态信息使所述至少一个测验能够重新开始;和
通过所述扩展模块和所述测验驱动器从所述实例文件检索所述测验状态信息。
82.如权利要求81所述的方法,其中所述实例文件进一步包括以下至少其中之一:在所述至少一个测验的各单元上已使用时间和剩余时间的计时,当前提供的单元,以及应试者得分。
83.一种测验可扩展标置语言系统,其用于具有至少一个测验的基于计算机的测验,所述至少一个测验具有展示格式和数据内容,所述系统包括:
测验驱动器,其至少执行下列其中之一:利用显示装置向应试者提供所述至少一个测验,管理所述至少一个测验,控制所述至少一个测验的进度,控制所述至少一个测验的计分,和控制所述至少一个测验的结果报告;
资源文件,其与所述测验驱动器有可操作的数据交换,所存储信息含有可扩展标置语言,并与所述至少一个测验的数据内容、展示格式、进度、计分和结果报告中的至少一个有关,所述信息是所述测验驱动器可访问的;和
扩展模块,其与所述测验驱动器和所述资源文件有可操作的数据交换,从所述资源文件检索与所述至少一个测验的数据内容、展示格式、进度、计分和结果报告中的至少一个有关的所述信息和所述测验可扩展标置语言,并在所述至少一个测验的提供过程中给所述测验驱动器提供所述信息和所述可扩展标置语言,所述扩展模块扩展所述测验驱动器的功能,而不必修改所述测验驱动器的可执行代码。
84.一种用于具有至少一个有展示格式和数据内容的测验的、利用测验可扩展标置语言的、基于计算机的测验方法,其用于至少一个测验的基于计算机的测验,测验驱动器控制功能而使所述测验驱动器能够至少执行下列其中之一:利用显示装置向应试者提供所述至少一个测验,管理所述至少一个测验,控制所述至少一个测验的进度,控制所述至少一个测验的计分,和控制所述至少一个测验的结果报告,所述方法包括顺序的、非顺序的和顺序独立的下列步骤中的至少一个:
实例化一个扩展模块;
在所述至少一个测验的提供过程中,将来自一个资源存储元素的含有可扩展标置语言的信息加载到所述扩展模块中,其中该来自所述资源存储元素的信息与所述至少一个测验的数据内容、展示格式、进度、计分和结果报告中的至少一个有关;和
在所述至少一个测验的提供过程中,将来自所述扩展模块的所述信息提供给所述测验驱动器,从而使所述扩展模块扩展所述测验驱动器的功能,而不必对所述测验驱动器的所述可执行代码作程序设计修改。