Word试题库工具插件的设计毕业设计论文.docx
- 文档编号:17928384
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:41
- 大小:49.08KB
Word试题库工具插件的设计毕业设计论文.docx
《Word试题库工具插件的设计毕业设计论文.docx》由会员分享,可在线阅读,更多相关《Word试题库工具插件的设计毕业设计论文.docx(41页珍藏版)》请在冰点文库上搜索。
Word试题库工具插件的设计毕业设计论文
毕业设计(论文)
Word试题库设计
论文作者姓名:
申请学位专业:
申请学位类别:
指导教师姓名(职称):
论文提交日期:
Word试题库设计
摘要
编写试题、排版试卷一直以来都是一项繁重的工作。
手工录入试题然后排版试卷工作量大且容易出错,试题的收集保存也是以文件的形式,这使得查找试题变得相当困难。
改用数据库存储试题将使试题的存储和查找得到优化,这是大部分试题库软件的优势,但是这些试题库软件都使用软件自身的文本编辑器,功能十分有限,在数据的存储方面也只能存储纯文本的试题,不能存储图片、表格等。
这使得用户在编辑试题时十分不便,在数据的存储方面也有很大限制。
如果结合数据库的存储功能、结构化查询语言的查询功能和Word的文本编辑功能,利用Word进行试题编写、试卷排版,利用数据库存储试题,利用结构化查询语言查找试题、过滤显示同类试题,那么编写试题、排版试卷等工作将变得方便快捷。
为了实现Word与数据库之间的试题存取(能够支持图片、表格、公式的存取)以及其他一些功能编写的Word试题库工具插件以COM组件的形式嵌入Word程序中,通过它将Word与试题数据库有效的结合到一起,使用户既能够方便的编辑试题又能够将试题存入数据库或从数据库中取出,还能够通过结构化查询语句搜索试题。
关键词:
COM组件;Word插件;二进制字段;结构化查询语言
TheDesignofanWordfortheTestQuestionBank
Abstract
Editingtestquestionsandtypesettingexaminationpapersisalwaysanarduouswork,whichistediousandeasytomakemistake.Besides,thecollectionofthetestquestionsisintheformoffilesthatmakesitdifficulttosearchpropertestquestions.Usingthedatabasetostoretestquestionscanimprovethesearchingfunctionforthetestquestions,butsuchsoftwaresalmostusetheirowntexteditorswithlimitedformatcontrolfunctions.Attheaspectoftheirstorageform,theycommonlyonlysavetestquestionsinplaintext,whichmeanstheycanhardlystorethepicturesortablesthatmaybenesscesaryinthetestquestion.ConsideringthatlargepartoftestquestionsareeditedinMSWord,ifwecanutilizethepowerfulformatcontrolfunctioncombinedwiththebinarydatastoragefunctionofthedatabasetoprovidealocalizedtestquestionmanagementtool,theworkofeditingtestquestionsandtypesettingexaminationpaperswouldbecomemoreeffectiveandconvinent.WiththehelpofCOMcomponenttechnology,suchatoolcanbeimplementedintheformofWordAddinthatcanintegrateMSWordandthetestquestionbankseamlesslyandfacilitatetheuserstostorethetestquestionintothebankandretrievetestquestionsselectivelybytheStructuralQueryLanguage(SQL).
Keywords:
COM;WordAddin;BinaryField;SQL
论文总页数:
33页
1引言
1.1课题背景
目前大量试题使用Word编写,在Word中可以很方便地编写公式、插入图片和表格。
一些独立的试题库软件使用简单的文本编辑功能,在试题编辑方面没有Word方便。
但是Word仅能编辑试题,不能存储收集试题。
《Word试题库工具插件》以COM组件的形式嵌入Word程序中,通过它将Word与数据库有效的结合到一起,从而使用户既能够方便的编辑试题又能够将试题存入数据库或从数据库中取出。
1.2国内外研究现状
大多数试题库软件都使用软件自身的文本编辑器,功能十分有限;在数据的存储方面只能存储纯文本的试题,不能存储图片、表格等,这使得用户在编辑试题时十分不便,在数据的存储方面也有很大限制。
1.3本课题研究的意义
通过综合运用COM组件技术、插件技术、数据库技术开发的Word试题库工具插件能嵌入Word程序内,从而将Word与数据库有效的结合到一起。
使用户在编辑试题时既能用Word方便快捷的编辑试题又能方便的将试题存入数据库或从数据库提取试题。
使试题编辑工作更加方便快捷。
2理论基础
2.1COM组件技术
2.1.1什么是COM组件
COM即组件对象模型,是ComponentObjectModel的缩写。
COM是一种跨应用和语言共享二进制代码的方法。
与C++不同,它提倡源代码重用。
ATL便是一个很好的例证。
源码级重用虽然好,但只能用于C++。
它还带来了名字冲突的可能性,更不用说不断拷贝重用代码而导致工程膨胀和臃肿。
Windows使用DLLs在二进制级共享代码。
这也是Windows程序运行的关键——重用kernel32.dll,user32.dll等。
但DLLs是针对C接口而写的,它们只能被C或理解C调用规范的语言使用。
由编程语言来负责实现共享代码,而不是由DLLs本身。
这样的话DLLs的使用受到限制。
MFC引入了另外一种MFC扩展DLLs二进制共享机制。
但它的使用仍受限制——只能在MFC程序中使用。
COM通过定义二进制标准解决了这些问题,即COM明确指出二进制模块(DLLs和EXEs)必须被编译成与指定的结构匹配。
这个标准也确切规定了在内存中如何组织COM对象。
COM定义的二进制标准还必须独立于任何编程语言(如C++中的命名修饰)。
一旦满足了这些条件,就可以轻松地从任何编程语言中存取这些模块。
由编译器负责所产生的二进制代码与标准兼容。
这样使后来的人就能更容易地使用这些二进制代码。
在内存中,COM对象的这种标准形式在C++虚函数中偶尔用到,所以这就是为什么许多COM代码使用C++的原因。
但是记住,编写模块所用的语言是无关的,因为结果二进制代码为所有语言可用。
2.1.2COM组件的基本元素
coclass(简称组件对象类——componentobjectclass)被包含在DLL或EXE中,并且包含着一个或者多个接口的代码。
组件对象类(coclasss)实现这些接口。
COM对象在内存中表现为组件对象类(coclasss)的一个实例。
注意COM“类”和C++“类”是不相同的,尽管常常COM类实现的就是一个C++类。
COM服务器是包含了一个或多个coclass的二进制DLL或EXE。
注册(Registration)是创建注册表入口的一个过程,告诉Windows操作系统COM服务器放在什么位置。
取消注册(Unregistration)则相反——从注册表删除这些注册入口。
GUID(谐音为“fluid”,意思是全球唯一标示符——globallyuniqueidentifier)是个128位的数字。
它是一种独立于COM编程语言的标示方法。
每一个接口和coclass有一个GUID。
因为每一个GUID都是全球唯一的,所以避免了名字冲突(只要用COMAPI创建它们)。
有时还会碰到另一个术语UUID(意思也是全球唯一标示符——universallyiqueidentifier)。
UUIDs和GUIDs在实际使用时的用途是一样的。
类ID或者CLSID是命名coclass的GUID。
接口ID或者IID是命名接口的GUID。
在COM中广泛地使用GUID有两个理由:
1、GUIDs只是简单的数字,任何编程语言都可以对之进行处理。
2、GUIDs可以在任何机器上被任何人创建,一旦完成创建,它就是唯一的。
因此,COM开发人员可以创建自己特有的GUIDs而不会与其它开发人员所创建的GUIDs有冲突。
这样就消除了集中授权发布GUIDs的必要。
HRESULT是COM用来返回错误和成功代码的整型数字。
除此之外,别无它意,虽然以H作前缀,但没有句柄之意。
最后,COM库是在使用COM时与交互的操作系统的一部分,它常常指的就是COM本身。
但是为了避免混淆才分开描述的。
使用和处理COM对象
每一种语言都有其自己处理对象的方式。
例如,C++是在栈中创建对象,或者用new动态分配。
因为COM必须独立于语言,所以COM库为自己提供对象管理例程。
下面是对COM对象管理和C++对象管理所做的一个比较:
创建一个新对象
C++中,用new操作符,或者在栈中创建对象。
COM中,调用COM库中的API。
删除对象
C++中,用delete操作符,或将栈对象踢出。
COM中,所有的对象保持它们自己的引用计数。
调用者必须通知对象什么时候用完这个对象。
当引用计数为零时,COM对象将自己从内存中释放。
由此可见,对象处理的两个阶段:
创建和销毁,缺一不可。
当创建COM对象时要通知COM库使用哪一个接口。
如果这个对象创建成功,COM库返回所请求接口的指针。
然后通过这个指针调用方法,就像使用常规C++对象指针一样。
2.1.3关键接口
IUnknown接口
每一个COM接口都派生于IUnknown。
这个名字有点误导人,其中没有未知(Unknown)接口的意思。
它的原意是如果有一个指向某COM对象的IUnknown指针,就不用知道潜在的对象是什么,因为每个COM对象都实现IUnknown。
IUnknown有三个方法:
AddRef()–通知COM对象增加它的引用计数。
如果你进行了一次接口指针的拷贝,就必须调用一次这个方法,并且原始的值和拷贝的值两者都要用到。
在本文的例子中没有用到AddRef()方法。
Release()–通知COM对象减少它的引用计数。
参见前面的Release()示例代码段。
QueryInterface()–从COM对象请求一个接口指针。
当coclass实现一个以上的接口时,就要用到这个方法。
IClassFactory接口
IClassFactory的作用是创建COM组件。
创建组件的责任交给了一个单独的对象,这个对象就是类厂。
每个组件都必须有一个与之相关的类厂,这个类厂知道怎么样创建组件,当客户请求一个组件对象的实例时,实际上这个请求交给了类厂,由类厂创建组件实例,然后把实例指针交给客户程序。
这个过程在跨进程及远程创建组件时特别有用,因为这时就不是一个简单的new操作就可以的了,它必须要经过调度,而这些复杂的操作都交给类厂对象去做了。
IClassFactory最重要的一个函数就是CreateInstance,顾名思议就是创建组件实例,一般情况下我们不会直接调用它,API函数都为我们封装好它了,只有某些特殊情况下才会由我们自己来调用它。
IDispatch接口
IDispatch叫做调度接口。
调度接口把每一个函数每一个属性都编上号,客户程序要调用这些函数属性的时侯就把这些编号传给IDispatch接口就行了,IDispatch再根据这些编号调用相应的函数。
IDispatch接口的主要函数是Invoke,客户程序都调用它,然后Invoke再调用相应的函数。
2.1.4如何创建COM对象
为了创建COM对象并从这个对象获得接口,必须调用COM库的API函数,CoCreateInstance()。
其原型如下:
HRESULTCoCreateInstance(REFCLSIDrclsid,
LPUNKNOWNpUnkOuter,
DWORDdwClsContext,
REFIIDriid,
LPVOID*ppv);
以下是参数解释:
rclsid
coclass的CLSID,例如,可以传递CLSID_ShellLink创建一个COM对象来建立快捷方式。
pUnkOuter
这个参数只用于COM对象的聚合,利用它向现有的coclass添加新方法。
参数值为null表示不使用聚合。
dwClsContext
表示所使用COM服务器的种类。
本文使用的是最简单的COM服务器,一个进程内(in-process)DLL,所以传递的参数值为CLSCTX_INPROC_SERVER。
注意这里不要随意使用CLSCTX_ALL(在ATL中,它是个缺省值),因为在没有安装DCOM的Windows95系统上会导致失败。
riid
请求接口的IID。
例如,可以传递IID_IShellLink获得IShellLink接口指针。
ppv
接口指针的地址。
COM库通过这个参数返回请求的接口。
当调用CoCreateInstance()时,它负责在注册表中查找COM服务器的位置,将服务器加载到内存,并创建所请求的coclass实例。
以下是一个调用的例子,创建一个CLSID_ShellLink对象的实例并请求指向这个对象IShellLink接口指针。
HRESULThr;
IShellLink*pISL;
hr=CoCreateInstance(CLSID_ShellLink,//coclass的CLSID
NULL,//不是用聚合
CLSCTX_INPROC_SERVER,//服务器类型
IID_IShellLink,//接口的IID
(void**)&pISL);//指向接口的指针
if(SUCCEEDED(hr))
{
//用pISL调用方法
}
else
{
//不能创建COM对象,hr为出错代码
}
首先声明一个接受CoCreateInstance()返回值的HRESULT和IShellLink指针。
调用CoCreateInstance()来创建新的COM对象。
如果hr接受到一个表示成功的代码,则SUCCEEDED宏返回TRUE,否则返回FALSE。
FAILED是一个与SUCCEEDED对应的宏用来检查失败代码。
2.1.5如何删除COM对象
前面说过,不用释放COM对象,只要告诉它们已经用完对象。
IUnknown是每一个COM对象必须实现的接口,它有一个方法,Release()。
调用这个方法通知COM对象不再需要对象。
一旦调用了这个方法之后,就不能再次使用这个接口,因为这个COM对象可能从此就从内存中消失了。
如果的应用程序使用许多不同的COM对象,因此在用完某个接口后调用Release()就显得非常重要。
如果不释放接口,这个COM对象(包含代码的DLLs)将保留在内存中,这会增加不必要的开销。
如果的应用程序要长时间运行,就应该在应用程序处于空闲期间调用CoFreeUnusedLibraries()API。
这个API将卸载任何没有明显引用的COM服务器,因此这也降低了应用程序使用的内存开销。
继续用上面的例子来说明如何使用Release():
//像上面一样创建COM对象,然后,
if(SUCCEEDED(hr))
{
//用pISL调用方法
//通知COM对象不再使用它
pISL->Release();
}
2.2Word对象模型
2.2.1什么是Word对象模型
MicrosoftOfficeWord2003对象是按层次顺序排列的,层次结构顶端的两个主类是Application类和Document类。
这两个类非常重要,因为在大部分时间里,您要么是在使用Word应用程序本身,要么是以某种方式处理Word文档。
Word对象模型严格遵循用户界面。
Application对象提供整个应用程序的包装,每个Document对象表示单个Word文档,Paragraph对象对应单个段落,等等。
这些对象各自都有很多方法和属性,您可以使用这些方法和属性操作对象或与对象交互。
当您在VisualStudio.NET中创建新的Word项目时,可以选择创建新的WordDocument项目或WordTemplate项目。
VisualStudio.NET在新的Word项目中自动为Document项目和Template项目创建ThisDocument.vb或ThisDocument.cs代码文件。
ThisDocument文件包含一个名为OfficeCodeBehind的公共类。
OfficeCodeBehind类包含包装Word.Document对象和Word.Application对象的代码。
这两个变量是OfficeCodeBehind类的成员:
ThisDocument 允许访问Word中的所有内置Document成员,包括方法、属性及事件。
ThisApplication 访问Application对象的所有成员,包括事件。
这样,只需要使用ThisDocument和ThisApplication,就可以轻松访问代码中的对象;而不必分别声明Word.Document或Word.Application对象。
注意 生成的项目模板代码使用类型转换,因为许多Word方法和属性都返回Object类型。
例如,给_Startup过程传递的是对象类型形式的名为application和document的变量,转换函数用于分别将每个变量显式转换为Word.Application和Word.Document对象。
2.2.2Word对象模型抽象图
图1:
WORD对象模型
2.2.3主要对象模型介绍
1、Application对象
Application对象表示Word应用程序,是其他所有对象的父级。
它的所有成员通常作为一个整体应用于Word。
可以使用该对象的属性和方法来控制Word环境。
有关更多信息,请参见Word的Application对象。
2、Document对象
Document对象是Word编程的中枢。
当您打开文档或创建新文档时,就创建了新的Document对象,该对象被添加到Word的Documents集合中。
焦点所在的文档叫做活动文档,由Application对象的ActiveDocument属性表示。
有关更多信息,请参见Word的Document对象。
3、Selection对象
Selection对象表示当前选择的区域。
在Word用户界面中执行某项操作(例如,对文本进行加粗)时,应首先选择或突出显示文本,然后应用格式设置。
Selection对象始终存在于文档中。
如果未选中任何对象,它表示插入点。
此外,该对象还可以表示多个不连续的文本块。
有关更多信息,请参见Word的Selection对象。
4、Range对象
Range对象表示文档中的一个连续的区域,由一个起始字符位置和一个结束字符位置定义。
Range对象的数量并不局限于一个。
您可以在同一文档中定义多个Range对象。
Range对象具有以下特性:
它的组成成分可以是单独的插入点,也可以是一个文本范围或整个文档;
它包含非打印字符,例如空格、制表符和段落标记;
它可以是当前选择所表示的区域,也可以表示当前选择之外的区域;
它不随文档保存,仅存在于代码运行期间。
在向一个范围的末尾插入文本时,Word会自动扩展该范围以包含插入的文本。
有关更多信息,请参见Word的Range对象。
2.3数据库技术
数据库是依照某种数据模型组织起来并存放二级存储器中的数据集合。
这种数据集合具有如下特点:
尽可能不重复,以最优方式为某个特定组织的多种应用服务,其数据结构独立于使用它的应用程序,对数据的增、删、改和检索由统一软件进行管理和控制。
从发展的历史看,数据库是数据管理的高级阶段,它是由文件管理系统发展起来的。
数据库的基本结构分三个层次,反映了观察数据库的三种不同角度。
(1)物理数据层。
它是数据库的最内层,是物理存贮设备上实际存储的数据的集合。
这些数据是原始数据,是用户加工的对象,由内部模式描述的指令操作处理的位串、字符和字组成。
(2)概念数据层。
它是数据库的中间一层,是数据库的整体逻辑表示。
指出了每个数据的逻辑定义及数据间的逻辑联系,是存贮记录的集合。
它所涉及的是数据库所有对象的逻辑关系,而不是它们的物理情况,是数据库管理员概念下的数据库。
(3)逻辑数据层。
它是用户所看到和使用的数据库,表示了一个或一些特定用户使用的数据集合,即逻辑记录的集合。
数据库不同层次之间的联系是通过映射进行转换的。
数据库具有以下主要特点:
(1)实现数据共享。
数据共享包含所有用户可同时存取数据库中的数据,也包括用户可以用各种方式通过接口使用数据库,并提供数据共享。
(2)减少数据的冗余度。
同文件系统相比,由于数据库实现了数据共享,从而避免了用户各自建立应用文件。
减少了大量重复数据,减少了数据冗余,维护了数据的一致性。
(3)数据的独立性。
数据的独立性包括数据库中数据库的逻辑结构和应用程序相互独立,也包括数据物理结构的变化不影响数据的逻辑结构。
(4)数据实现集中控制。
文件管理方式中,数据处于一种分散的状态,不同的用户或同一用户在不同处理中其文件之间毫无关系。
利用数据库可对数据进行集中控制和管理,并通过数据模型表示各种数据的组织以及数据间的联系。
(5)数据一致性和可维护性,以确保数据的安全性和可靠性。
主要包括:
①安全性控制:
以防止数据丢失、错误更新和越权使用;②完整性控制:
保证数据的正确性、有效性和相容性;③并发控制:
使在同一时间周期内,允许对数据实现多路存取,又能防止用户之间的不正常交互作用;④故障的发现和恢复:
由数据库管理系统提供一套方法,可及时发现故障和修复故障,从而防止数据被破坏
2.4ODL文件语法
2.4.1ODL文件语法结构
[attributes]
librarylibname
{definitions};
其中:
[attributes]:
定义库的属性。
包括,如帮助文件,UUID,版本等。
如:
[uuid(CF9D9B76-EC4B-470D-99D
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Word 试题库 工具 插件 设计 毕业设计 论文
![提示](https://static.bingdoc.com/images/bang_tan.gif)