一种用于加载动态链接库的代码自动生成方法及装置
技术领域
本发明属于代码自动生成技术领域,尤其涉及的是一种用于加载动态链接库的代码自动生成方法及装置。
背景技术
加载DLL分为静态加载和动态加载两种方式。静态加载方式包含三种静态加载方法:
(1)手动编写加载DLL代码,不同语言采用的步骤也不一样:在C语言下添加对LIB文件的引用,并重新定义需要调用的函数和常量,函数和常量的定义和DLL对应的头文件中的定义类似,只是参数类型改为当前编程语言下的类型;在C#语言下,创建一个类,在类中声明和头文件中函数对应的定义;
(2)在美国国家仪器公司的LabWindows CVI下,装载DLL对应的FP文件实现自动加载;
(3)在微软公司的Microsoft Visual Studio集成开发环境中,添加美国国家仪器公司的Measurement Studio下的仪器驱动向导文件模板,选择DLL对应的FP文件,把FP文件中的函数定义和常量定义都自动生成加载代码。
动态加载DLL方法对应于不同的目标语言,具有不同的加载步骤。对应同一种编程语言下,加载步骤通常是一定的。例如对应于C语言下的加载步骤有:
创建一个函数声明,其参数数据类型要与调用的DLL头文件定义的函数原型相吻合;
通过Win32 API函数LoadLibrary()显式的调用DLL,此函数返回DLL的实例句柄;
通过Win32 API函数GetProcAddress()获取要调用的DLL的函数地址,把结果赋给自定义函数的指针类型;
使用函数声明来调用DLL中的函数;
最后调用完成后,通过Win32 API函数FreeLibrary()释放DLL函数。
在C#语言下的加载步骤有:
定义一个委托声明,其参数数据类型要与调用的DLL头文件定义的函数原型相吻合;
创建委托声明的委托变量;
通过Win32 API函数LoadLibrary()显式的调用DLL,此函数返回DLL的实例句柄;
通过Win32 API函数GetProcAddress()获取要调用的DLL的函数地址,把结果赋给委托变量;
使用委托来调用DLL中的函数;
最后调用完成后,通过Win32 API函数FreeLibrary()释放DLL函数。
综上所述,编写加载DLL的代码的过程,核心的工作是得到DLL内部的函数定义和常量定义列表;然后把函数和常量定义中的参数类型转换为目标编程语言下的参数类型;最后根据编程语言和加载方式,确定加载步骤,编写或生成加载代码。
目前的加载DLL的方法通常采用手动编码实现和利用第三方软件工具自动加载实现。
对应于采用手动编码实现DLL加载的方法,首先需要对目标编程语言下的加载DLL的静态、动态两种方式步骤有所了解,并熟悉不同编程语言的参数类型间的转换,提高了软件人员的专业要求;当DLL有更新时,需要软件人员手动的修改加载代码;当需要在新的语言下加载动态连接库时,需要软件人员重新编写加载代码实现。综上所述,手动编写加载DLL代码的方式,增加了软件人员的专业要求和工作量,造成人力资源的巨大浪费,降低软件人员的开发效率。
对应于利用第三方软件工具自动实现DLL加载的两种方法,都依赖于CVI生成的FP文件,并且都只能静态方式加载DLL。对应第一种方法,只支持CVI下对CVI编写的DLL的加载。第二种方法虽然支持多种目标语言对DLL的封装,但是依赖于Microsoft Visual Studio,并且只能生成Microsoft Visual Studio所支持编程语言的加载代码;并且自动生成代码的过程有一部分的局限性,每次都是把FP文件中的所有函数和常量都进行封装,不支持选择需要封装函数与常量的列表。
因此,现有技术存在缺陷,需要改进。
发明内容
本发明所要解决的技术问题是针对现有技术的不足,提供一种用于加载动态链接库的代码自动生成方法及装置。
本发明的技术方案如下:
一种用于加载动态链接库的代码自动生成装置,其中,包括函数原型和常量定义抽取模块、抽取规则编辑模块、代码模板和参数转换规则编辑模块、目标代码生成模块;所述抽取规则编辑模块,用于为抽取模块定义抽取规则;所述函数原型和常量定义抽取模块,用于根据定义好的抽取规则从头文件中抽取出函数原型和常量定义列表;所述代码模板和参数转换规则编辑模块,用于编辑代码模板和参数转换规则;所述目标代码生成模块,根据目标代码语言和加载方式,选择对应的代码模板和参数转换规则,将函数原型和常量定义转换为目标编程语言代码。
所述的用于加载动态链接库的代码自动生成装置,其中,所述抽取规则编辑模块具体执行以下步骤:
步骤1111:新建或者打开已有规则;
步骤1112:根据头文件中函数原型和变量定义格式编辑抽取规则;
步骤1113:找出几条典型的函数原型,检验该规则是否能解析出函数名称、变量名、变量类型等信息,如果是则进入步骤1114,否则执行步骤1112;
步骤1114:保存为新的规则。
所述的用于加载动态链接库的代码自动生成装置,其中,所述函数原型和常量定义抽取模块具体执行以下步骤:
步骤1121:函数原型和常量定义抽取模块装载头文件;
步骤1122:选择对应的抽取规则;
步骤1123:逐行解析头文件;
步骤1124:抽取出函数原型、常量,加到函数原型、常量列表中,生成常量列表和函数列表对象;
步骤1125:判断是否为最后一行,如是则执行步骤1126,如否则执行步骤1123;
步骤1126:保存为函数原型及常量列表文件。
所述的用于加载动态链接库的代码自动生成装置,其中,所述代码模板和参数转换规则编辑模块具体执行以下步骤:
步骤1131:新建规则或者打开已有规则:
步骤1132:代码模板是根据目标代码手动编辑代码模板;
步骤1133:判断检索规则是否完整,如是行执行步骤1134,如否则执行步骤1132;
步骤1134:保存为新的规则后结束;参数转换规则是源参数到目标参数的转换;检查函数列表中变量类型是否都在参数转换规则中,如果未包含在转换规则中,则自动添加到规则后面,并由用户自己添加目标参数类型。
所述的用于加载动态链接库的代码自动生成装置,其中,所述目标代码生成模块具体执行以下步骤:
步骤1141:加载准备好的函数原型、常量列表;
步骤1142:选择目标语言、加载方式,得到转换规则和代码模块;
步骤1143:选择需要生成的函数项、常量项集合;
步骤1144:转换为目标语言下的函数、常量列表;
步骤1145:依次执行,得到模板文件对象位置;
步骤1146:把函数和常量列表添加到模板位置;
步骤1147:判断函数项是否为集合中的最后一项,如是则执行步骤1148,如否则执行步骤1145;
步骤1148:保存目标语言代码,后结束。
一种用于加载动态链接库的代码自动生成方法,其中,包括以下步骤:
步骤1:先运行抽取规则编辑模块编辑抽取规则,运行函数原型和常量定义抽取模块来抽取函数原型和常量定义等信息;
步骤2:检验生成的函数原型和常量定义是否抽取完毕,如是,则进入步骤3,如否则进入步骤5;
步骤3:运行目标代码模板生成模块;
步骤4:检验目标代码生成模块的目标代码是否满足需要,是则结束,否则进入步骤6;
步骤5:运行抽取规则编辑模块修改规则后执行步骤1;
步骤6:运行代码模板和参数转换规则编辑模块来编辑代码模板和参数转换规则后,进入步骤3。
所述的一种用于加载动态链接库的代码自动生成方法,其中,步骤1中,抽取规则编辑模块具体执行以下步骤:
步骤1111:新建或者打开已有规则;
步骤1112:根据头文件中函数原型和变量定义格式编辑抽取规则;
步骤1113:找出几条典型的函数原型,检验该规则是否能解析出函数名称、变量名、变量类型等信息,如果是则进入步骤1114,否则执行步骤1112;
步骤1114:保存为新的规则。
所述的用于加载动态链接库的代码自动生成装置,其中,步骤1中,函数原型和常量定义抽取模块具体执行以下步骤:
步骤1121:函数原型和常量定义抽取模块装载头文件;
步骤1122:选择对应的抽取规则;
步骤1123:逐行解析头文件;
步骤1124:抽取出函数原型、常量,加到函数原型、常量列表中,生成常量列表和函数列表对象;
步骤1125:判断是否为最后一行,如是则执行步骤1126,如否则执行步骤1123;
步骤1126:保存为函数原型及常量列表文件。
所述的用于加载动态链接库的代码自动生成装置,其中,步骤6,代码模板和参数转换规则编辑模块具体执行以下步骤:
步骤1131:新建规则或者打开已有规则:
步骤1132:代码模板是根据目标代码手动编辑代码模板;
步骤1133:判断检索规则是否完整,如是行执行步骤1134,如否则执行步骤1132;
步骤1134:保存为新的规则后结束;参数转换规则是源参数到目标参数的转换;检查函数列表中变量类型是否都在参数转换规则中,如果未包含在转换规则中,则自动添加到规则后面,并由用户自己添加目标参数类型。
所述的用于加载动态链接库的代码自动生成装置,其中,步骤3中,目标代码生成模块具体执行以下步骤:
步骤1141:加载准备好的函数原型、常量列表;
步骤1142:选择目标语言、加载方式,得到转换规则和代码模块;
步骤1143:选择需要生成的函数项、常量项集合;
步骤1144:转换为目标语言下的函数、常量列表;
步骤1145:依次执行,得到模板文件对象位置;
步骤1146:把函数和常量列表添加到模板位置;
步骤1147:判断函数项是否为集合中的最后一项,如是则执行步骤1148,如否则执行步骤1145;
步骤1148:保存目标语言代码,后结束。
采用上述方案的优点是:DLL中的函数原型和常量定义的抽取不依赖于第三方软件。加载代码自动生成降低了开发人员要求,使开发人员不用关心任意编程语言下DLL的动态加载、静态加载具体实现方法,不用熟悉参数类型在不同语言下的对应关系。生成模块通过图形化选择需要加载的函数列表快速高效的生成目标语言的加载代码,提高了开发效率。
附图说明
图1为本发明装置的结构示意图。
图2为本发明装置工作流程图。
图3为本发明装置中抽取规则编辑模块工作流程图。
图4为本发明装置中函数原型和常量定义抽取模块工作流程图。
图5为本发明装置中代码模板和参数转换规则模块工作流程图。
图6为本发明装置中目标代码生成模块工作流程图。
具体实施方式
以下结合附图和具体实施例,对本发明进行详细说明。
实施例1
本发明提供一种用于加载动态链接库的代码自动生成装置,本发明装置11分为函数原型和常量定义抽取模块112、抽取规则编辑模块111、代码模板和参数转换规则编辑模块113、目标代码生成模块114四部分,如图1所示,抽取规则编辑模块111为抽取模块定义抽取规则;函数原型和常量定义抽取模块112根据定义好的抽取规则从头文件10中抽取出函数原型和常量定义列表;代码模板和参数转换规则编辑模块113,用于编辑代码模板和参数转换规则;目标代码生成模块114,根据目标代码语言和加载方式,选择对应的代码模板和参数转换规则,将函数原型和常量定义转换为目标编程语言代码12。
所述抽取规则编辑模块具体执行以下步骤:
步骤1111:新建或者打开已有规则;
步骤1112:根据头文件中函数原型和变量定义格式编辑抽取规则;
步骤1113:找出几条典型的函数原型,检验该规则是否能解析出函数名称、变量名、变量类型等信息,如果是则进入步骤1114,否则执行步骤1112;
步骤1114:保存为新的规则。
所述函数原型和常量定义抽取模块具体执行以下步骤:
步骤1121:函数原型和常量定义抽取模块装载头文件;
步骤1122:选择对应的抽取规则;
步骤1123:逐行解析头文件;
步骤1124:抽取出函数原型、常量,加到函数原型、常量列表中,生成常量列表和函数列表对象;
步骤1125:判断是否为最后一行,如是则执行步骤1126,如否则执行步骤1123;
步骤1126:保存为函数原型及常量列表文件。
所述代码模板和参数转换规则编辑模块具体执行以下步骤:
步骤1131:新建规则或者打开已有规则:
步骤1132:代码模板是根据目标代码手动编辑代码模板;
步骤1133:判断检索规则是否完整,如是行执行步骤1134,如否则执行步骤1132;
步骤1134:保存为新的规则后结束;参数转换规则是源参数到目标参数的转换;检查函数列表中变量类型是否都在参数转换规则中,如果未包含在转换规则中,则自动添加到规则后面,并由用户自己添加目标参数类型。
所述目标代码生成模块具体执行以下步骤:
步骤1141:加载准备好的函数原型、常量列表;
步骤1142:选择目标语言、加载方式,得到转换规则和代码模块;
步骤1143:选择需要生成的函数项、常量项集合;
步骤1144:转换为目标语言下的函数、常量列表;
步骤1145:依次执行,得到模板文件对象位置;
步骤1146:把函数和常量列表添加到模板位置;
步骤1147:判断函数项是否为集合中的最后一项,如是则执行步骤1148,如否则执行步骤1145;
步骤1148:保存目标语言代码,后结束。
在上述内容的基础上,本发明还提供一种用于加载动态链接库的代码自动生成方法,工作流程如图2所示:步骤1:先运行抽取规则编辑模块编辑抽取规则,运行函数原型和常量定义抽取模块来抽取函数原型和常量定义等信息;步骤2:检验生成的函数原型和常量定义是否抽取完毕,如是,则进入步骤3,如否则进入步骤5;步骤3:运行目标代码模板生成模块;步骤4:检验目标代码生成模块的目标代码是否满足需要,是则结束,否则进入步骤6;步骤5:运行抽取规则编辑模块修改规则后执行步骤1;步骤6:运行代码模板和参数转换规则编辑模块来编辑代码模板和参数转换规则后,进入步骤3;
抽取规则编辑模块是手动建立抽取规则,具体流程如图3所示。步骤1111:新建或者打开已有规则;步骤1112:根据头文件中函数原型和变量定义格式编辑抽取规则;步骤1113:找出几条典型的函数原型,检验该规则是否能解析出函数名称、变量名、变量类型等信息,如果是则进入步骤1114,否则执行步骤1112;步骤1114:保存为新的规则。
如图4所示:步骤1121:函数原型和常量定义抽取模块装载头文件;步骤1122:选择对应的抽取规则;步骤1123:逐行解析头文件;步骤1124:抽取出函数原型、常量,加到函数原型、常量列表中,生成常量列表和函数列表对象;步骤1125:判断是否为最后一行,如是则执行步骤1126,如否则执行步骤1123;步骤1126:保存为函数原型及常量列表文件。
如图5所示,代码模板和参数转换规则模块工作流程:步骤1131:新建规则或者打开已有规则:步骤1132:代码模板是根据目标代码手动编辑代码模板;步骤1133:判断检索规则是否完整,如是行执行步骤1134,如否则执行步骤1132;步骤1134:保存为新的规则后结束;参数转换规则是源参数到目标参数的转换;检查函数列表中变量类型是否都在参数转换规则中,如果未包含在转换规则中,则自动添加到规则后面,并由用户自己添加目标参数类型。
目标代码自动生成模块执行流程如图6所示:步骤1141:加载准备好的函数原型、常量列表;步骤1142:选择目标语言、加载方式,得到转换规则和代码模块;步骤1143:选择需要生成的函数项、常量项集合;步骤1144:转换为目标语言下的函数、常量列表;步骤1145:依次执行,行到模板文件对象位置;步骤1146:把函数和常量列表添加到模板位置;步骤1147:判断函数项是否为集合中的最后一项,如是则执行步骤1148,如否则执行步骤1145;步骤1148:保存目标语言代码,后结束。
采用上述方案的优点是:DLL中的函数原型和常量定义的抽取不依赖于第三方软件。加载代码自动生成降低了开发人员要求,使开发人员不用关心任意编程语言下DLL的动态加载、静态加载具体实现方法,不用熟悉参数类型在不同语言下的对应关系。生成模块通过图形化选择需要加载的函数列表快速高效的生成目标语言的加载代码,提高了开发效率。
应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应属于本发明所附权利要求的保护范围。