CN111142848A - 一种软件程序编译方法、执行方法及装置 - Google Patents
一种软件程序编译方法、执行方法及装置 Download PDFInfo
- Publication number
- CN111142848A CN111142848A CN201811307720.7A CN201811307720A CN111142848A CN 111142848 A CN111142848 A CN 111142848A CN 201811307720 A CN201811307720 A CN 201811307720A CN 111142848 A CN111142848 A CN 111142848A
- Authority
- CN
- China
- Prior art keywords
- software program
- file
- program
- configuration file
- compiling
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/22—Procedural
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种软件程序编译方法、执行方法及装置,所述软件程序编译方法包括:在对所述软件程序进行编译时,获取所述软件程序对应的配置文件;将所述配置文件转换为预设格式的代码文件;将所述代码文件包含进所述软件程序对应的主程序文件以实现对所述软件程序的编译,并在完成所述软件程序的编译后,生成所述软件程序对应的可执行程序;所述软件程序执行方法包括:当所述软件程序对应的可执行程序运行时,获取所述可执行程序中代码文件;将所述代码文件转换为所述软件程序对应的配置文件;读取并加载所述配置文件,完成对所述软件程序的运行。本发明将代码和配置文件分开进行维护,实现软件的编译和执行。
Description
技术领域
本发明涉及计算机软件程序应用领域,尤其涉及一种软件程序编译方法、执行方法及装置。
背景技术
一般情况下,程序源代码经过编译后,都是exe格式,或者以dll、so等动态链接库等形式,它们组成了整个系统,成为其中的一个独立的存在。但是,随着代码的扩展,代码内部功能逐渐增多,必然会衍生一些分支,然后进行抽象,提取出一些数据,用于兼容各类配置。例如,一段程序最初可能是这样的:
Function()
{
print("hello");
}
于是这个程序在对外发布的时候,就是一个简单的exe可执行程序,文件架构也很简单,就只有一个文件,但往往随着需求的增加,很快可能又会变成这样:
Function(country)
{
if(country==China)
print("你好");
else if(country==Japan)
print("こんにちは");
else if(country==Korea)
print("안녕하세요");
else
print("hello");
}
可以预见,也许还会出现越来越多的分支代码,但是对于程序员来说,这些分支都是一样的,而且每次需求人员提一次需求,程序员就要修改一次代码,程序版本就要重新编译一次,并重新发布,所以,程序员一般会将这种情况进行处理,变成代码和配置文件两部分:
Function(country)
{
value = SearchFile(country, "data.ini"); //从配置文件中寻找country的值
print(value);
}
data.ini配置文件的内容如下:
China:你好
Japan:こんにちは
Korea:안녕하세요
上述这个处理过程,称之为代码抽象,或者数据剥离,这种抽象和剥离,其初衷就是时刻保持代码架构清晰,并且易于维护。因为经过这样剥离之后,程序员只需关注自己的代码,而data.ini文件就可以交给需求人员,由需求人员根据需要去进行维护和修改,双方各有各的版本管理控制,互不影响。
当然,实际情况会比上述例子复杂得多,每一个分支,可能不仅是一句话,而有可能是上万个数据需要处理,而且可能分布在程序各处,只不过它们的处理流程是一样的,被剥离出来了而已。所以好处是显而易见的,即使需求变化再频繁,只有data.ini文件需要更新,而程序代码不需要重新编译,软件版本也不会发生变化。
但是,经过数据剥离之后,却会带来另外一个明显的变化,那就是对外发布软件时,配套的文件数量会变多,甚至还会出现data2.ini、data3.ini等等。如果这个程序面对的客户,对发布口径要求特别严格(比如只固定接受1个exe文件),那么就会很麻烦。这种情况常常出现在不同的软件系统之间,因为双方是上下游关系,上游系统内部的代码变化(比如上述剥离),是不允许影响与下游系统在之前的约定(比如文件数量)的,所以在这种情况下,文件数量控制和代码优化,无法实现兼顾。
因此,现有技术还有待于改进和发展。
发明内容
本发明要解决的技术问题在于,针对现有技术缺陷,本发明提供一种软件程序编译方法、执行方法及装置,在不改变软件对外呈现状态的前提下,保持文件名称和文件数量不变,实现配置文件与代码剥离,不增加任何额外的存储空间,将代码和配置文件分开进行维护,实现软件程序的编译和执行。
本发明解决技术问题所采用的技术方案如下:
一种软件程序编译方法,其中,所述软件程序编译方法包括:
在对所述软件程序进行编译时,获取所述软件程序对应的配置文件;
将所述配置文件转换为预设格式的代码文件;
将所述代码文件包含进所述软件程序对应的主程序文件以实现对所述软件程序的编译,并在完成所述软件程序的编译后,生成所述软件程序对应的可执行程序。
可选地,所述软件程序编译方法还包括:
对所述软件程序进行抽象剥离得到所述主程序文件和所述配置文件。
可选地,所述将所述配置文件转换为预设格式的代码文件具体包括:
通过脚本程序将所述配置文件转换为预设格式的代码文件;
所述预设格式的代码文件为C文件;
所述C文件的内容只包含一个全局数组,所述全局数组的内容为所述配置文件中所有字符的ASCII码,所述脚本程序为一段独立程序,用于先行转换Ext.c文件。
可选地,当所述软件程序进行编译时,Ext.c文件的内容均以数组ascii_info的形式与主程序文件一起编入exe可执行文件。
一种软件程序编译装置,其中,所述软件程序编译装置包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的软件程序编译程序,所述软件程序编译程序被所述处理器执行时实现如上所述的软件程序编译方法的步骤。
一种软件程序执行方法,其中,所述软件程序执行方法包括:
当所述软件程序对应的可执行程序运行时,获取所述可执行程序中代码文件;
将所述代码文件转换为所述软件程序对应的配置文件;
读取并加载所述配置文件,完成对所述软件程序的运行。
可选地,,其中,所述代码文件为C文件。
可选地,所述将所述代码文件转换为所述软件程序对应的配置文件具体包括:
运行exe程序,通过脚本转换将所述C文件中的全局数组转换为所述软件程序对应的配置文件。
可选地,当所述软件程序进行更新时,通过抽象剥离获取所述软件程序的配置文件,将所述配置文件进行更新,完成所述软件程序的更新。
一种软件程序执行装置,其中,所述软件程序执行装置包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的软件程序执行程序,所述软件程序执行程序被所述处理器执行时实现如上所述的软件程序执行方法的步骤。
本发明公开了一种软件程序编译方法、执行方法及装置,所述软件程序编译方法包括:在对所述软件程序进行编译时,获取所述软件程序对应的配置文件;将所述配置文件转换为预设格式的代码文件;将所述代码文件包含进所述软件程序对应的主程序文件以实现对所述软件程序的编译,并在完成所述软件程序的编译后,生成所述软件程序对应的可执行程序;所述软件程序执行方法包括:当所述软件程序对应的可执行程序运行时,获取所述可执行程序中代码文件;将所述代码文件转换为所述软件程序对应的配置文件;读取并加载所述配置文件,完成对所述软件程序的运行。本发明在不改变软件对外呈现状态的前提下,保持文件名称和文件数量不变,实现配置文件与代码剥离,不增加任何额外的存储空间,将代码和配置文件分开进行维护,实现软件的编译和执行。
附图说明
图1是本发明软件程序编译方法的较佳实施例的流程图;
图2是本发明软件程序编译方法的较佳实施例中对配置数据进行抽象剥离示意图;
图3是本发明软件程序编译方法的较佳实施例中对源代码和配置文件分别进行维护的示意图;
图4是本发明软件程序编译方法的较佳实施例中将配置文件进行脚本转换成源代码过程的示意图;
图5是本发明软件程序执行方法的较佳实施例的流程图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚、明确,以下参照附图并举实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明较佳实施例所述的软件程序编译方法,如图1所示,所述软件程序编译方法包括以下步骤:
步骤S11、在对所述软件程序进行编译时,获取所述软件程序对应的配置文件;
步骤S12、将所述配置文件转换为预设格式的代码文件;
步骤S13、将所述代码文件包含进所述软件程序对应的主程序文件以实现对所述软件程序的编译,并在完成所述软件程序的编译后,生成所述软件程序对应的可执行程序。
具体地,在对软件程序进行编译前,对所述软件程序进行抽象剥离得到所述主程序文件和所述配置文件件;主程序文件主要包括代码将程序变成代码和配置文件两部分的过程称为抽象剥离,可以达到保持代码架构清晰的目的,易于维护,软件人员(程序员)只需要关注代码,配置文件由需求人员根据需要去进行维护和修改,各自进行版本的管理控制,互不影响。其中,所述配置文件包括:应用的源代码地址、编写语言及其运行环境。
当软件代码功能扩展时,对配置数据进行抽象剥离,如图2所示;当剥离完成后,以配置文件的形式与代码分别存放及维护,如图3所示,软件人员只需要关注源代码,配置文件由需求人员根据需要去进行维护和修改,各自进行版本的管理控制,互不影响。
如图4所示,当软件程序编译开始前,先用一段脚本程序,即通过脚本程序将所述配置文件转换为预设格式的代码文件,所述预设格式的代码文件为C文件,将配置文件转换成一个正常的C文件(源代码文件),其内容只有一个全局数组,而全局数组的内容,就是配置文件所有字符的ASCII码,该脚本程序是另外一段独立程序,用于先行转换Ext.c文件。
由于主程序中,有流程对ascii_info数组进行调用,所以在编译时,Ext.c文件的内容,均以数组ascii_info的形式,与主程序一起编入exe可执行文件。至此,编译结束后,程序对外呈现不变(文件数量没有增加),而且没有付出额外的空间代价。
基于上述软件程序编译方法,本发明对应公开了一种软件程序编译装置,其中,所述软件程序编译装置包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的软件程序编译程序,所述软件程序编译程序被所述处理器执行时实现如上所述的软件程序编译方法的步骤。
进一步地,本发明较佳实施例所述的软件程序执行方法,如图5所示,所述软件程序执行方法包括以下步骤:
步骤S21、当所述软件程序对应的可执行程序运行时,获取所述可执行程序中代码文件;
步骤S22、将所述代码文件转换为所述软件程序对应的配置文件;
步骤S23、读取并加载所述配置文件,完成对所述软件程序的运行。
其中,所述代码文件为C文件。
具体地,所述将所述代码文件转换为所述软件程序对应的配置文件具体包括:运行exe程序,通过脚本转换将所述C文件中的全局数组转换为所述软件程序对应的配置文件。
在exe程序运行的第一步,将全局变量array根据ASCII码转换回配置文件,并放置在原来的路径上。也就是说,在原来主程序流程中,一方面包含了ascii_info数组,另一方面,在程序运行的第一步,就会执行一段代码,用于依照ascii_info数组,来恢复Data.ini配置文件,这段代码的功能,与通过脚本转换将配置文件转换为源代码的过程是相逆的,如下:
extern char ascii_info[];
Restore()
{
WriteFile(ascii_info, "data.ini"); //将数组恢复成配置文件);
}
恢复Data.ini文件(配置文件)之后,程序的其他模块,即可按正常的SearchFile的方式,对配置文件进行加载和读取,整个流程与最初无异。
本发明将配置文件按ASCII码的方式,存入全局变量,进入代码主体,理论上,非文本格式的配置文件(例如小型SQL数据库),也可以按类似方式,直接用十六进制进行转换处理;整个过程不会新增任何额外的存储空间,仅仅是将配置文件的内容变成全局变量,其访问方式不变。
进一步地,当所述软件程序进行更新时,通过抽象剥离获取所述软件程序的配置文件,将所述配置文件进行更新,完成所述软件程序的更新。
基于上述软件程序执行方法,本发明对应公开了一种软件程序执行装置,其中,所述软件程序执行装置包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的软件程序执行程序,所述软件程序执行程序被所述处理器执行时实现如上所述的软件程序执行方法的步骤。
本发明中,在版本维护时,先将代码中的配置数据抽象剥离,以配置文件纳入版本管理,软件人员负责维护代码,需求人员负责维护配置文件,在代码中可以通过SearchFile(搜索文件)功能,搜索配置文件;在版本发布时,仍然可以保持最初的发布口径,文件名称和文件数量不会发生变化;在版本运行时,程序仍然可以按原来的SearchFile功能,来搜索配置文件,不需要对SearchFile功能进行修改。
软件版本在正常推衍的过程中,无法兼顾“低耦合”和“保持文件架构”,本发明在不改变软件对外呈现状态(例如文件名称和文件数量)的前提下,仍然可以实现配置与代码剥离,实现分开维护,统一发布。
综上所述,本发明提供一种软件程序编译方法、执行方法及装置,所述软件程序编译方法包括:在对所述软件程序进行编译时,获取所述软件程序对应的配置文件;将所述配置文件转换为预设格式的代码文件;将所述代码文件包含进所述软件程序对应的主程序文件以实现对所述软件程序的编译,并在完成所述软件程序的编译后,生成所述软件程序对应的可执行程序;所述软件程序执行方法包括:当所述软件程序对应的可执行程序运行时,获取所述可执行程序中代码文件;将所述代码文件转换为所述软件程序对应的配置文件;读取并加载所述配置文件,完成对所述软件程序的运行。本发明在不改变软件对外呈现状态的前提下,保持文件名称和文件数量不变,实现配置文件与代码剥离,不增加任何额外的存储空间,将代码和配置文件分开进行维护,实现软件的编译和执行。
当然,本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关硬件(如处理器,控制器等)来完成,所述的程序可存储于一计算机可读取的存储介质中,所述程序在执行时可包括如上述各方法实施例的流程。其中所述的存储介质可为存储器、磁碟、光盘等。
应当理解的是,本发明的应用不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。
Claims (10)
1.一种软件程序编译方法,其特征在于,所述软件程序编译方法包括:
在对所述软件程序进行编译时,获取所述软件程序对应的配置文件;
将所述配置文件转换为预设格式的代码文件;
将所述代码文件包含进所述软件程序对应的主程序文件以实现对所述软件程序的编译,并在完成所述软件程序的编译后,生成所述软件程序对应的可执行程序。
2.根据权利要求1所述的软件程序编译方法,其特征在于,所述软件程序编译方法还包括:
对所述软件程序进行抽象剥离得到所述主程序文件和所述配置文件。
3.根据权利要求1所述的软件程序编译方法,其特征在于,所述将所述配置文件转换为预设格式的代码文件具体包括:
通过脚本程序将所述配置文件转换为预设格式的代码文件;
所述预设格式的代码文件为C文件;
所述C文件的内容只包含一个全局数组,所述全局数组的内容为所述配置文件中所有字符的ASCII码,所述脚本程序为一段独立程序,用于先行转换Ext.c文件。
4.根据权利要求3所述的软件程序编译方法,其特征在于,当所述软件程序进行编译时,Ext.c文件的内容均以数组ascii_info的形式与主程序文件一起编入exe可执行文件。
5.一种软件程序编译装置,其特征在于,所述软件程序编译装置包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的软件程序编译程序,所述软件程序编译程序被所述处理器执行时实现如权利要求1-4任一项所述的软件程序编译方法的步骤。
6.一种软件程序执行方法,其特征在于,所述软件程序执行方法包括:
当所述软件程序对应的可执行程序运行时,获取所述可执行程序中代码文件;
将所述代码文件转换为所述软件程序对应的配置文件;
读取并加载所述配置文件,完成对所述软件程序的运行。
7.根据权利要求6所述的软件程序执行方法,其特征在于,所述代码文件为C文件。
8.根据权利要求7所述的软件程序执行方法,其特征在于,所述将所述代码文件转换为所述软件程序对应的配置文件具体包括:
运行exe程序,通过脚本转换将所述C文件中的全局数组转换为所述软件程序对应的配置文件。
9.根据权利要求6所述的软件程序执行方法,其特征在于,当所述软件程序进行更新时,通过抽象剥离获取所述软件程序的配置文件,将所述配置文件进行更新,完成所述软件程序的更新。
10.一种软件程序执行装置,其特征在于,所述软件程序执行装置包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的软件程序执行程序,所述软件程序执行程序被所述处理器执行时实现如权利要求6-9任一项所述的软件程序执行方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811307720.7A CN111142848B (zh) | 2018-11-05 | 2018-11-05 | 一种软件程序编译方法、执行方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811307720.7A CN111142848B (zh) | 2018-11-05 | 2018-11-05 | 一种软件程序编译方法、执行方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111142848A true CN111142848A (zh) | 2020-05-12 |
CN111142848B CN111142848B (zh) | 2023-09-19 |
Family
ID=70515715
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811307720.7A Active CN111142848B (zh) | 2018-11-05 | 2018-11-05 | 一种软件程序编译方法、执行方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111142848B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111580860A (zh) * | 2020-05-13 | 2020-08-25 | 吕家明 | 一种不同版本配置文件自动兼容方法及装置 |
CN112181837A (zh) * | 2020-09-30 | 2021-01-05 | 深圳市元征科技股份有限公司 | 一种信息处理方法、信息处理装置及终端设备 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2004078751A (ja) * | 2002-08-21 | 2004-03-11 | Nippon Telegr & Teleph Corp <Ntt> | コンパイル済みプログラムコード再利用方法、装置およびプログラム |
CN101226479A (zh) * | 2008-02-01 | 2008-07-23 | 中兴通讯股份有限公司 | 一种实现手机菜单动态配置的方法 |
CN102147758A (zh) * | 2011-03-16 | 2011-08-10 | 深圳创维数字技术股份有限公司 | 一种待测设备自动编译及配置方法、装置、系统 |
CN102207884A (zh) * | 2011-06-02 | 2011-10-05 | 深圳市茁壮网络股份有限公司 | 一种文件编译方法及装置 |
CN105893018A (zh) * | 2015-12-14 | 2016-08-24 | 乐视网信息技术(北京)股份有限公司 | 生成可执行程序的方法和装置 |
CN106155755A (zh) * | 2015-06-03 | 2016-11-23 | 上海红神信息技术有限公司 | 程序编译方法和程序编译器 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3801545B2 (ja) * | 2002-08-02 | 2006-07-26 | 松下電器産業株式会社 | コンパイラ用プログラム、コンパイラ装置及びコンパイル方法 |
CN103744684B (zh) * | 2014-01-24 | 2017-01-11 | 中国科学院自动化研究所 | 一种异构软硬件协同开发的方法及系统 |
-
2018
- 2018-11-05 CN CN201811307720.7A patent/CN111142848B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2004078751A (ja) * | 2002-08-21 | 2004-03-11 | Nippon Telegr & Teleph Corp <Ntt> | コンパイル済みプログラムコード再利用方法、装置およびプログラム |
CN101226479A (zh) * | 2008-02-01 | 2008-07-23 | 中兴通讯股份有限公司 | 一种实现手机菜单动态配置的方法 |
CN102147758A (zh) * | 2011-03-16 | 2011-08-10 | 深圳创维数字技术股份有限公司 | 一种待测设备自动编译及配置方法、装置、系统 |
CN102207884A (zh) * | 2011-06-02 | 2011-10-05 | 深圳市茁壮网络股份有限公司 | 一种文件编译方法及装置 |
CN106155755A (zh) * | 2015-06-03 | 2016-11-23 | 上海红神信息技术有限公司 | 程序编译方法和程序编译器 |
CN105893018A (zh) * | 2015-12-14 | 2016-08-24 | 乐视网信息技术(北京)股份有限公司 | 生成可执行程序的方法和装置 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111580860A (zh) * | 2020-05-13 | 2020-08-25 | 吕家明 | 一种不同版本配置文件自动兼容方法及装置 |
CN112181837A (zh) * | 2020-09-30 | 2021-01-05 | 深圳市元征科技股份有限公司 | 一种信息处理方法、信息处理装置及终端设备 |
Also Published As
Publication number | Publication date |
---|---|
CN111142848B (zh) | 2023-09-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11256523B2 (en) | Modular co-versioning in a dynamically linked runtime environment | |
US10459695B2 (en) | Correction of code errors using machine learning | |
EP2562641B1 (en) | Software application porting system | |
CN106775723B (zh) | 基于Android平台的系统固件定制的方法和Android设备 | |
CN105446712B (zh) | 一种应用程序缺陷修补方法及装置 | |
US10915429B2 (en) | Employing code overlays to facilitate software development | |
CN111897570B (zh) | 一种基于Maven插件的多依赖项文件提取方法及装置 | |
WO2015176492A1 (en) | A system and method thereof for creating dynamically attachable and detachable binary files | |
CN108984160B (zh) | 基于组件化的信息化快速开发框架系统 | |
US11288062B2 (en) | Automatic source code refactoring | |
US20110302565A1 (en) | Implicit workspace dependencies | |
CN112558980A (zh) | 多软件包管理方法及装置 | |
US20110126179A1 (en) | Method and System for Dynamic Patching Software Using Source Code | |
US20120246618A1 (en) | Method and a system for generating a software product | |
US10275234B2 (en) | Selective bypass of code flows in software program | |
CN110109671B (zh) | 一种webpack标签尺寸样式转换方法及装置 | |
US20230259339A1 (en) | Multi-Platform Compiling | |
CN111142848A (zh) | 一种软件程序编译方法、执行方法及装置 | |
CN114942933A (zh) | 一种自动更新数据库的方法及相关装置 | |
US20200097260A1 (en) | Software application developer tools platform | |
CN111176912A (zh) | 一种继电保护装置硬件配置信息管理系统和方法 | |
US9448818B2 (en) | Defining classes as singleton classes or non-singleton classes | |
US10102115B2 (en) | Incremental program construction from embedded program code for external testing | |
US9720660B2 (en) | Binary interface instrumentation | |
US20120330878A1 (en) | Conventions for inferring data models |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |