专利名称::动态链接的电脑系统中扩增程序功能的方法
技术领域:
:本发明涉及一种动态链接的电脑系统中扩增程序功能的方法,特别是涉及一种在不对原程序码重新编译、链接的情况下,加入新编程序码以扩增新功能,且使不同电脑系统都可共用所增加新编程序码的方法。在一电脑系统中,要发展出一应用程序,使电脑系统可按设计者在应用程序中的规划,进行一连串的处理过程,必须经过程序源代码(sourcecode)撰写、将程序源代码编译(Compile)成电脑系统可执行的格式(PortableExecutable以下简称PE格式)、再将该PE格式码与电脑系统提供的公用模组件(UtilityModule)链接(Link)等步骤,之后电脑系统才能正确地按设计者的规划进行处理。程序源代码通常是以适合人阅读的高级语言(HighLevelLanguage)来编写,用方便程序撰写者进行思考、规划;而PE格式码则是一种适合电脑系统读取的机器码(machinecode),该PE格式码因涉及电脑系统的硬件结构,及其低级运作〔通常与寄存器(Register)、指针(Pointer)、地址(Address)、堆栈(Stack)等有关〕,极为复杂而难懂;公用模组件则是电脑系统中,将大多数程序经常进行运作,按计算机系统的特定格式,写成可被其他程序重复引用的模组件,例如微软公司(Microsoft)视窗(Windows)操作系统(OperatingSystem)下的动态链接库(DynamicLinkLibrary)。而现今的电脑系统为了减少众多程序中,每一个别程序都包括其本身引用的公用模组件,造成系统资源的大量浪费(例如一公用模组件被1000个程序所引用,则该各程序中便存在着1000份重复的该公用模组件,占用大量存储空间),多采用动态链接(DynamicLinking)模式,在该模式下,程序中仅存有其所引用公用模组件的相关信号(如公用模组件的名称及其输入参数、输出参数等),电脑系统在程序执行时,才动态地将程序本身与其所引用的公用模组件进行链接,之后程序才能正常地执行。当设计者依照其构想、规划、撰写一应用程序(Applicationprogram)使电脑系统按其意思进行处理后,通常该应用程序的内容就不再变动,此时当使用者有了新构思,欲在该应用程序中加入新功能,例如,在一程序执行以前加入使用期限检查等功能时,现有技术通常采用下列两种方法实施1.应用程序重整即先编写好一段程序源代码(sourcecode),此段程序源代码用以执行所希望添加的新功能,再将这段程序源代码所执行的功能加入可执行程序中,即将这段新编写的程序源代码,与原可执行程序的程序源代码结合,成为一包括扩增功能的新程序源代码,再重新编译(Compile)该新程序源代码,得到一个新的PE格式码--PE,再将该PE格式码与电脑系统的公用模组件链接(Link),之后电脑系统才能正确进行处理。如此新的可执行程序PE即可完成扩增的功能,并且不影响原可执行程序应有的功能,其缺点是必须取得欲扩增功能PE格式文件的程序源代码,且需要在相关的电脑系统环境下进行编译(Compile)和链接(Link),例如微软公司的Windows操作系统下的程序码,只能在Windows操作系统环境下进行编译(Compile)和链接(Link),而微软公司的NT操作系统下的程序码只能在NT操作系统环境下进行编译(Compile)和链接(Link),故应用程序重整的方法受操作系统的限制,费时费力,如图1A所示。2.用汇编语言(AssemblyLanguage)编写一段程序码,这段汇编语言程序码可以实现附加功能,再修改原PE格式码的入口点(EntryPoint,即程序开始执行的起点),使之与自编程序码相呼应,指向自编程序码的开始执行位置,此种方法也可在原程序码中实现附加的功能,但必须修改原来PE格式码的内容,其缺点在(a)复杂,因PE格式码是电脑所执行的机器码(MachineCode),较为艰涩难懂;(b)由于汇编语言与硬件结构密切相关,不同的硬件结构有不同的汇编语言,因此该方法虽优于前一种技术方法,但对于每一种不同的硬件平台结构(CPU类型),都要重新编写一对应的汇编语言程序码,因而在应用上有很大的限制,如图1B。本发明所采用的方法,克服上述两种现有技术的缺点,无须重新编译或链接,不受操作系统与硬件平台的限制,即可达到扩充功能的目的,如图1C所示。本发明为一种动态链接的电脑系统中扩增程序功能的方法,该方法主要是利用该电脑系统的动态链接特性,在其可执行程序码(PE格式码)中,将对公用模组件的引用,改以对新编程序码的引用取代,使原程序码在执行以前,必先执行新编程序码,以在不对原程序码重新编译、链接的情况下,加入新编程序码以扩增功能。本发明的目的在于由修改可执行程序中的动态链接信号,以在不重新编译、链接的情况下,在一可执行程序中加入新编程序码以扩增功能,且使不同电脑系统都可共用所增加的新编程序码。本发明的目的是这样实现的,即提供一种动态链接的电脑系统中扩增程序功能的方法,该方法包括以一新增公用模组件取代一可执行程序中引用的一原有公用模组件,并将该原有公用模组件的相关引用参数存储于该可执行程序中;在该新增公用模组件执行完后,使该可执行程序引用该原有公用模组件,随后执行该可执行程序。下面结合附图,详细说明本发明的实施例,其中图1A,图1B和图1C为现有技术与本发明的原理对照图;图2为本发明一实施例对一可执行程序实施前后的对照图;图3为本发明一实施例的部分流程图;图4为本发明一实施例的部分流程图;图5为本发明一实施例的屏幕显示图。本发明是一种动态链接的电脑系统中扩增程序功能的方法,尤指一种一公用模组件,可使自行编写的程序码在一可执行程序码之前执行,使扩充原可执行程序码的功能,且在此扩充功能的过程,不需对原可执行程序码重新编译、链接,而在执行完自行编写的程序码以后,动态地将原可执行程序码还原为未加入自行编写的程序码以前的内容,使执行完自行编写的程序码之后,可正常执行原可执行程序码的功能。为能清楚揭露本发明的技术特点,以下就本发明在微软公司Windows操作系统下的一实施例说明,在该实施例中,原可执行程序为OLD.exe,该可执行程序中引用了公用模组件,文件名为Kerne132.dll的动态链接库(DynamicLinkLibray-DLL),而自行编写的程序码则存于文件名为AddIn.dll的动态链接库中,而NEW.exe为引用了AddIn.dll新的可执行程序,本实施例的实施步骤逐一说明如下在动态链接的电脑系统中,PE格式文件都包括有一引入库表(ImportLibraryList),其结构如下此引入库表(ImportLibraryList)中的每一项表示了对一个32比特动态链接库的引入,其中最主要的信号是要引入的动态链接库的文件名,及要由此动态链接库中引入的函数的函数名称或序号表(引入函数表);在每一动态链接库中,也都包括一与引入函数表对应的表(输出函数表),其中列出了一动态链接库文件中的所有输出函数。当Windows操作系统执行可执行程序OLD.exe时,会先行搜寻(Search)其引入库表(ImportLibraryList),将该表中包括有其文件名的每一动态链接库(本实施例中为Kerne132.dll),由磁盘载入存储器内,然后对照引入库表中的信号,将存储器内该动态链接库Kerne132.dll中,每一引入函数(ImportFunction)的地址(address),填写到引入函数表中,之后才执行动态链接库Kerne132.dll的入口点函数(EntryFunction)。当Windows操作系统完成此搜寻工作后,可执行程序OLD.exe所使用到的所有动态链接库都已载入存储器内,也正确填写了所有要引用的引入函数(ImportFunction)的地址,此时Windows操作系统才执行可执行程序OLD.exe的入口点函数(EntryFunction),并开始执行可执行程序OLD.exe中的程序码。由此可知,引入库表(ImportLibraryList)中所指定的动态链接库Kerne132.dll,其入口点函数会优先于可执行程序OLD.exe的入口点函数执行,即动态链接库的入口点函数必先于可执行程序的入口点函数执行。故只要自行编写一个动态链接库AddIn.dll,在该动态链接库的入口点函数中完成欲新加入的功能,再修改可执行程序OLD.exe,使其引入库表中包括有自行编写的动态链接库AddIn.dll,即可达成在可执行程序OLD.exe执行前,先执行自编程序码AddIn.dll的目的。而由于32比特可执行程序格式上的限制,在其引入库表中增加一项相当困难,因此较可行的做法是修改引入库表中的一项,使其所包括的动态链接库的文件名、要由此动态链接库中引入函数的名称或序号,变更为自行编写的动态链接库的文件名,及由该动态链接库中引入函数的名称或序号的表(引入函数表)。因此,被修改的可执行程序OLD.exe中至少需引入一动态链接库,而实际上,Windows操作系统下的32比特可执行程序都满足此条件,为便于以下的描述,在此以Kerne132.dll为引入库表中的待修改项所包括的动态链接库,详述本发明修改可执行程序OLD.exe的步骤。为能在一可执行程序OLD.exe执行之前,先执行包括在AddIn.dll中自行编写的程序码,首先要对磁盘中存储的该可执行程序码文件OLD.exe进行修改,其修改的流程如图3中所示。首先读取磁盘中要修改的可执行程序文件OLD.exe(步骤3-10),并判断其是否为32比特(Bit)可执行程序(步骤3-11),否则结束修改动作;若OLD.exe为32比特可执行程序,对该可执行程序文件进行修改,其修改方法与Windows操作系统32比特可执行程序的结构密切相关。若OLD.exe为32比特可执行程序,由其引入库表中,找出对Kerne132.dll引入的项目,而为避免该引入库表中,原来对Kerne132.dll及其对应的引入函数表的相关信号被覆盖掉,故于修改前,须先将待修改项中所包括的信号(即文件名Kerne132.dll与该文件中所包括引入函数的名称或序号的表),保存下来附加于NEW.exe文件尾部(步骤3-12),以便在执行完自编程序码AddIn.dll之后,由NEW.exe文件尾部所保留的该各信号,使可执行程序NEW.exe的引入库表中,被修改项目可还原成Kerne132.dll的文件名,及该文件中所包括引入函数的名称或序号的表。进行修改时,将该项目的引入文件名Kerne132.dll更改为自行编写的动态链接库的文件名AddIn.dll,并将该项目中的引入函数表改为由AddIn.dll引入函数的名称或序号的表(引入函数表),且该表只引入AddIn.dll中的一个函数(步骤3-13),如此,原可执行程序OLD.exe的引入库表中就包括一引入AddIn.dll的项目;之后将存储器中修改过的可执行程序NEW.exe写回磁盘,以保存修改结果(步骤3-14)。本发明该实施例,将原可执行程序OLD.exe修改为可执行程序NEW.exe,就两者文件间的内容作一比较,如图2所示。请参阅图4所示的流程图,依据本发明的方法,在可执行程序NEW.exe中加入自行编写的动态链接库AddIn.dll后,其处理流程如下Windows操作系统执行可执行程序NEW.exe时,根据其引入库表,将AddIn.dll载入存储器,并执行其入口点函数(EntryFunction)(步骤4-11),在AddIn.dll的入口点函数中,可执行任何程序码以进行所希望的新增功能(步骤4-12),之后若不继续执行程序NEW.exe,则直接结束(步骤4-18)。执行完AddIn.dll的入口点函数中的新增功能后,判断是否要继续执行程序NEW.exe(步骤4-13),如要继续执行程序NEW.exe,则修改存储器中的可执行程序NEW.exe,使其引入Kerne132.dll动态链接库,使其可正确执行,具体步骤如下将引入库表中被覆盖掉,而保存在文件尾部的Kerne132.dll文件名,与其引入函数的名称或序号的表(引入函数表),填写到可执行程序NEW.exe引入库表中的原来位置(步骤4-14),接着依Windows操作系统的方法,由磁盘中将Kerne132.dll载入至存储器,并对照引入库表中Kerne132.dll的引入项,将存储器内Kerne132.dll中引入函数的正确地址填写到引入库表中(步骤4-15),接着由AddIn.dll的入口点函数返回(步骤4-16),此时存储器中的可执行程序NEW.exe与未在引入库表中加入AddIn.dll前的OLD.exe相同,因此Windows操作系统可正确执行该可执行程序NEW.exe,进行原有功能(步骤4-17),直至其完全结束而退出执行(步骤4-18)。本发明可于AddIn.dll的入口点函数中,执行任何程序码以进行所希望的新增功能(步骤4-12),以下举两具体范例说明在一试用版程序中加入试用期的保护,其目的是在原可执行程序中加入试用信息的处理,以于其执行前先显示试用期限信息(请参阅图5所示),并限制用户使用该试用版程序期间(如30天),同时显示购买正式版程序的方法;若用户选择继续执行,而当时尚未超出试用期限,则动态恢复原可执行程序使其正常执行,而若当时已超出试用期限,则结束该试用版程序的执行。另一范例应用在限制特定使用者执行应用程序上,如将一密码检查功能加入解压缩程序前,则未被授权的使用者(未持有密码或密码错误)因无合格密码以执行解压缩程序,故可使未被授权的使用者不能解压缩文件档案,以防止其查看该文件档案的内容。本发明的方法因使自行编写的程序码在现有的应用程序之前执行,且不需对现有应用程序再进行编译、链接,以及修改其可执行程序文件,故依本发明的方法可不受开发环境限制,适用于各种硬件平台,实施简易且具有移植性。以上所述,仅为本发明的实施例,但是,本发明所保护的权利范围,并不局限于此,凡熟悉该项技术人员,依据本发明所揭露的技术内容,可作些改变,均应属于本发明的保护范围。权利要求1.一种动态链接的电脑系统中扩增程序功能的方法,其特征在于,该方法包括以一新增公用模组件取代一可执行程序中引用的一原有公用模组件,并将该原有公用模组件的相关引用参数存储于该可执行程序中;在该新增公用模组件执行完后,使该可执行程序引用该原有公用模组件,随后执行该可执行程序。2.如权利要求1所述的一种动态链接的电脑系统中扩增程序功能的方法,其特征在于,该方法以多个新增公用模组件取代一可执行程序中引用的多个原有公用模组件,并将该各原有公用模组件的相关引用参数存储于该可执行程序中。3.如权利要求1所述的一种动态链接的电脑系统中扩增程序功能的方法,其特征在于,该电脑系统至少包括一存储单元,该存储单元用以存储执行中的可执行程序及其相关数据。4.如权利要求1所述的一种动态链接的电脑系统中扩增程序功能的方法,其特征在于,该新增公用模组件,包括将存储单元中,一可执行程序已修改为引用该新增公用模组件的相关引用参数,以可执行程序文件的尾端所存储,引用该原有公用模组件的相关引用参数值取代。5.如权利要求1所述的一种动态链接的电脑系统中扩增程序功能的方法,其特征在于,进一步包括建立至少一新增公用模组件,该新增公用模组件可供电脑系统中的一可执行程序相关引用参数值引用。6.如权利要求1所述的一种动态链接的电脑系统中扩增程序功能的方法,其特征在于,该电脑系统至少包括一输出屏幕。7.如权利要求6所述的一种动态链接的电脑系统中扩增程序功能的方法,其特征在于,新增公用模组件由输出屏幕输出至少一显示画面。8.如权利要求7所述的一种动态链接的电脑系统中扩增程序功能的方法,其特征在于,该显示画面示出该可执行程序的开始使用日期。9.如权利要求7所述的一种动态链接的电脑系统中扩增程序功能的方法,其特征在于,该显示画面显示出该可执行程序的使用期限。10.如权利要求7所述的一种动态链接的电脑系统中扩增程序功能的方法,其特征在于,该显示画面示出该可执行程序的版本更新介绍。11.如权利要求1所述的一种动态链接的电脑系统中扩增程序功能的方法,其特征在于,该电脑系统至少包括一输入键盘。12.如权利要求11所述的一种动态链接的电脑系统中扩增程序功能的方法,其特征在于,新增公用模组件由输入键盘接收至少一输入数据。13.如权利要求12所述的一种动态链接的电脑系统中扩增程序功能的方法,该新增公用模组件根据该输入数据,将存储单元中,该可执行程序已修改为引用该新增公用模组件的相关引用参数,以可执行程序文件的尾端所存储,引用该原有公用模组件的相关引用参数值取代。14.如权利要求11所述的一种动态链接的电脑系统中扩增程序功能的方法,其特征在于,该新增公用模组件根据该输入数据决定其执行方式。15.如权利要求14所述的一种动态链接的电脑系统中扩增程序功能的方法,其特征在于,该新增公用模组件根据该输入数据,结束该可执行程序的执行。全文摘要一种动态链接的电脑系统中扩增程序功能的方法,利用动态链接的运作方式,将扩增功能以公用模组件的形式完成,并在一程序中以公用模组件取代其原先引用的另一公用模组件,同时存储被取代公用模组件的相关引用数据,使该程序执行前先执行扩增功能的公用模组件,随后扩增功能的公用模组件按所存储相关引用数据,将被其取代的公用模组件还原至程序中,使其正常执行程序并以扩增功能公用模组件的执行结果,决定其执行方式。文档编号G06F9/45GK1254127SQ98124159公开日2000年5月24日申请日期1998年11月12日优先权日1998年11月12日发明者林光信,陈玄同,侯震宇申请人:英业达股份有限公司