CN100462914C - 构件初始化过程中的构造方法 - Google Patents
构件初始化过程中的构造方法 Download PDFInfo
- Publication number
- CN100462914C CN100462914C CNB200610029755XA CN200610029755A CN100462914C CN 100462914 C CN100462914 C CN 100462914C CN B200610029755X A CNB200610029755X A CN B200610029755XA CN 200610029755 A CN200610029755 A CN 200610029755A CN 100462914 C CN100462914 C CN 100462914C
- Authority
- CN
- China
- Prior art keywords
- interface
- component
- class
- client
- constructed fuction
- 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.)
- Expired - Fee Related
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
本发明涉及一种构件初始化过程中的构造方法,包括在构件描述文件中添加构件接口元数据和特定的构造函数、根据特定的构造函数在服务端生成包括构造接口方法的构造接口类代码框架、根据所述的构件接口元数据在客户端生成构造调用方法、在客户端产生构件对象类厂、在服务端查询相应的构造接口类、根据查询到的构造接口类调用相应的构造接口方法并将操作结果作为返回值返回。采用该种构件初始化过程中的构造方法,可靠实现了构件远程构造方式,并能够较好的支持分布式系统应用,提高了开发人员的开发效率和程序的执行效率,降低了开发难度,增强了程序运行性能的稳定性,适用范围较为广泛,为分布式构件化软件系统的进一步发展奠定了坚实的基础。
Description
技术领域
本发明涉及计算机软件技术领域,特别涉及计算机构件化软件系统领域,具体是指一种构件初始化过程中的构造方法。
背景技术
随着现代构件化计算机软件技术的进一步发展,CAR(Component Assembly Runtime)构件技术是一种使用面向构件编程(Component Oriented Programming,简称COP)技术,它定义了一套网络编程时代的构件编程模型和编程规范,规定了一组构件间相互调用的标准,使得二进制构件能够自描述,能够在运行时动态链接。
目前,CAR构件技术已在某些先进的嵌入式操作系统上实现,在该嵌入式操作系统的SDK(Software Development Kit)下,用户很容易编写出自己的构件。
CAR构件技术的基础思想来源于微软的COM,但它对微软的COM进行了拓展,并且二者不兼容。CAR构件技术由CAR语言(构件描述语言,描述构件的元数据信息)、CAR编译器、自动代码生成工具以及CAR构件基础库支持。CAR构件技术体现了网络编程时代的特性,编程界面简单。
CAR构件构造机制类似普通的C++对象的构造过程,C++对象通过类的不同的构造函数在不同的情况下构造C++对象,不同的构造函数表现在不同的参数。同时,对于传统的C++对象的构造机制来说,主要有两个功能:一个是分配对象所需的空间,另一个初始化成员变量。C++的构造函数是普通的函数,故它不能远程化执行,而且它没有返回值,所以构造失败时,想知道失败的原因会变的异常困难,而对于需要远程构造的构件来说,构造失败会是个常见的现象,客户端需要了解失败的原因,以作出相应的处理,而传统的C++的构造过程和机制就无法满足这样的需求,因此限制了分布式系统中的构件技术的进一步发展。
发明内容
本发明的目的是克服了上述现有技术中的缺点,提供一种能够根据构件描述文件自动生成构件的构造接口类代码框架、支持客户端和服务端的远程构造方式、将构造结果返回、执行效率较高、运行性能稳定可靠、适用范围较为广泛的构件初始化过程中的构造方法。
为了实现上述的目的,本发明的构件初始化过程中的构造方法如下:
该构件初始化过程中的构造方法,使用通过计算机网络相连接的服务端和客户端,其主要特点是,所述的方法包括以下步骤:
(1)系统进行初始化操作;
(2)系统根据用户操作,在构件描述文件中添加构件接口描述信息和特定的构造函数,所述的特定的构造函数的格式为:构造函数标识([输入]输入参数);
(3)系统读取该构件描述文件,产生元数据信息,并根据该特定的构造函数在服务端生成包括构造接口方法的构造接口类代码框架,包括以下步骤:
(a)在服务端生成构造接口类的代码;
(b)根据所述的特定的构造函数生成该构造接口类的构造接口方法,该构造接口方法的格式为:错误代码接口方法标识(输入参数,构件指针),其中错误代码为该构造接口方法的返回值;
(c)在该构造接口方法的执行过程中进行产生该构件对象并进行初始化的操作,并将构件产生和初始化操作的错误代码作为返回值返回;
(4)系统得到元数据信息,并根据该元数据信息在客户端生成构造调用方法,具体为:
在客户端根据构件接口元数据,产生特定的构造函数和构件接口构造调用方法,该构造调用方法的格式为:错误代码构造方法标识(输入参数,构件指针),其中错误代码为该构造调用方法的返回值;
(5)系统根据用户调用和元数据信息,在客户端产生构件类厂对象;
(6)系统在服务端查询相应的构造接口类;
(7)系统根据查询到的构造接口类调用相应的构造接口方法,并将操作结果作为返回值返回,从而完成构件的初始化构造。
该构件初始化过程中的构造方法的构造函数标识为constructor。
该构件初始化过程中的构造方法的在客户端生成构造调用方法还包括以下步骤:
(41)在该构造调用方法的执行过程中产生构件类厂对象、在服务端查询相应的构造接口类、根据该构造接口类调用相应的构造接口方法以完成产生构件和初始化构造的操作,并将上述操作的错误代码作为返回值返回。
该构件初始化过程中的构造方法的构造方法标识为New。
采用了该发明的构件初始化过程中的构造方法,由于系统在初始化过程中根据构件描述文件中的构件接口元数据和特定的构造函数信息在服务端生成包括构造接口方法的构造接口类代码框架,同时在客户端自动生成对应的构造调用方法,并将操作的结果作为返回值返回给用户,从而可靠实现了客户端和服务端的构件远程构造方式,并能够较好的支持分布式系统应用;同时将构造结果返回用户,便于用户针对性的进行处理,从而提高了开发人员的开发效率和程序的执行效率,降低了开发难度,增强了程序运行性能的稳定性,适用范围较为广泛,为分布式构件化软件系统的进一步发展奠定了坚实的基础。
附图说明
图1为本发明的构件初始化过程中的构造方法的执行过程示意图。
图2为本发明的构件初始化过程中的构造方法的执行过程中的内存结构示意图。
图3为本发明的构件初始化过程中的构造方法的接口继承关系示意图。
具体实施方式
为了能够更清楚地理解本发明的技术内容,特举以下实施例详细说明。
请参阅图1所示,该构件初始化过程中的构造方法,包括通过计算机网络相连接的服务端和客户端,其中,所述的方法包括以下步骤:
(1)系统进行初始化操作;
(2)系统根据用户操作,在构件描述文件中添加构件接口描述信息和特定的构造函数,该特定的构造函数的格式为:构造函数标识([输入]输入参数),其中该构造函数标识可以为constructor,当然也可以根据编程开发人员的习惯采用其它的标识字符串;
(3)系统读取该构件描述文件,产生元数据,并根据该特定的构造函数在服务端生成包括构造接口方法的构造接口类代码框架,包括以下步骤:
(a)在服务端生成构造接口类的代码;
(b)根据所述的特定的构造函数生成该构造接口类的构造接口方法,该构造接口方法的格式为:错误代码接口方法标识(输入参数,构件指针),其中错误代码为该构造接口方法的返回值;
(c)在该构造接口方法的执行过程中进行产生该构件并进行初始化的操作,并将构件产生和初始化操作的错误代码作为返回值返回;
(4)系统得到元数据,并根据该元数据在客户端生成构造调用方法,包括以下步骤:
(a)在客户端根据构件接口元数据,产生特定的构造函数和构件接口构造调用方法,该构造调用方法的格式为:错误代码构造方法标识(输入参数,构件指针),其中错误代码为该构造调用方法的返回值,其中该构造方法标识可以为New,当然也可以根据编程开发人员的习惯采用其它的标识字符串;
(b)在该构造调用方法的执行过程中产生构件类厂对象、在服务端查询相应的构造接口类、根据该构造接口类调用相应的构造接口方法以完成产生构件和初始化构造的操作,并将上述操作的错误代码作为返回值返回;
(5)系统根据用户调用和元数据信息,在客户端产生构件类厂对象;
(6)系统在服务端查询相应的构造接口类;
(7)系统根据查询到的构造接口类调用相应的构造接口方法,并将操作结果作为返回值返回,从而完成构件的初始化构造。
在实际应用当中,采用本发明的上述方法的CAR构件在进行构造的过程中,具有以下特点:
(1)远程构造特性
远程化是CAR构件接口的能力,而CAR构件的构造则是个接口方法。这样就允许从远程带参数得构造某个CAR构件。
构件的本地构造方法,例如在(100,110)的位置构造一个图形控件按钮对象:
Position pos={100,110};
IButtonSam*pbs=NULL;
ECODE ec=CButtonSam.New(&pos,&pbs);
if(FAILED(ec)){
printf("Failed to create object with using Positon,\
ec=0x%08x\n",ec);
goto ErrorExit;
}
构件的远程(指异进程)构造方法,比如:
ec=CButtonSam.NewInContext(CTX_DIFF_DOMAIN,&pos,&pbs);
告诉系统将服务创建指异进程,类似微软com对象的创建,其他的过程没有大的差别。
(2)CAR构件的构造的返回值特性
以上面的例子来说明。构造时返回ec,它是系统定义的error code,通过分析它的值,就可以知道再构造时发生了什么错误,进而做出响应的处理。
这时构件对象的服务接口由New函数的最后一个参数带传出来,而传统的C++构造函数也是不能通过参数带出构造结果的。
(3)框架代码的自动生成特性
首先是服务端代码自动生成:
CAR构件给程序员提供了最大程度的方便,只需要在构件描述文件(car文件)中添加特殊的构造函数constructor(),系统便会自动生成构造接口,如_CButtonSam_IClassObject_,它带有和构造参数相对应的接口方法,比如:CreateObjectWithPos(/*[in]*/PPosition pos,/*[out]*/IObject**ppNewObj)。从中可以看出,它的函数名和程序员在构造对象时所带的构造参数紧密相关,此方法会根据用户传进来的参数构造出构件对象。由于接口_CButtonSam_IClassObject_对用户是不可见的,故其接口CreateObjectWithPos()由系统根据car文件生成代码,用户只需要实现GetPosition()和constuctor()函数就可以了。
构件描述文件(Car文件)的写法,请见如下所示:
module
{
typedef struct{
intx;
inty;
}Position,*PPosition;
//服务端所支持的其它接口
interface IButtonSam{
GetPosition(
[out]PPosition pPos);
}
class CButtonSam{
constructor(
[in]PPosition pos);
//服务端所支持的其它接口
interface IButtonSam;
}
}
接着是客户端代码自动生成:
根据构件接口元数据,系统为客户端生成方法ECODE New(/*[in]*/PPosition pos,/*[out]*/IButtonSam**pIButtonSam),该方法先调用传统的EzGetClassObject方法产生构件对象类厂,再查询到构造接口如_CButtonSam_IClassObject_,再根据参数的不同调用相应的构造接口方法,如:CreateObjectWithPos等。其执行流程请参阅图1所示,其中中间部分为由系统生成的代码,最左边部分为客户端用户关心的代码,最右边为服务端用户关心的代码。
在CAR构件的构造机制的实现过程中,为了让CAR构件DLL能具备的远程的构造能力,就需要设计接口函数帮助构件完成初始化,构造好的CAR构件DLL执行时的内存结构请参阅图2所示,其中的V1指向IButtonSam的函数指针表,V2指向接口_CButtonSam_IClassObject_的函数指针表,V1和V2指针等同com中的vptr,是虚函数表指针。
其接口的继承关系请参阅图3所示,其中的CButtonSam是服务端需要实现的按钮类。
在本发明的具体实施方式中,CAR构件的构造机制的应用范例如下:
以图形控件按钮为例,先产生Car文件如下:
module
{
typedef struct{
int x;
inty;
}Position,*PPosition;
interface IButtonSam{
GetPosition(
[out]PPosition pPos);
}
class CButtonSam{
constructor(
[in]PPosition pos);
interface IButtonSam;
}
}
其中的constructor([in]PPosition pos)是CButtonSam类的构造函数,CAR文件的编译器在发现有构造函数存在car文件的class中,会生成有_CButtonSam_IClassObject_接口代码框架,它包含接口构造方法CARAPI CreateObjectWithPos(PPosition pos,IObject**pNewObj),对应于constructor方法:
ECODE_CButtonSamClassObject_::CreateObjectWithPos(
/*[in]*/PPosition pos,
/*[out]*/IObject**ppNewObj)
{
ECODE_ecode_;
CButtonSam*_pNewObj_;
_ecode_=_CButtonSamCreateObject(IID_IObject,(IObject**)&_pNewObj_);
if(FAILED(_ecode_))return_ecode_;
_ecode_=_pNewObj_->constructor(pos);
if(FAILED(_ecode_)){
_pNewObj_->Release();
return_ecode_;
}
*ppNewObj=(_IObject*)_pNewObj_;
return NOERROR;
}
其中:
CARAPI_CButtonSamCreateObject(RIID riid,IObject**ppObj)
{
ECODE ec;
CButtonSam*pObj=new CButtonSam;
if(!pObj)return E_OUT_OF_MEMORY;
((_IObject*)pObj)->AddRef();
if(FAILED(ec))goto ErrorExit;
ec=((_IObject*)pObj)->QueryInterface(riid,ppObj);
ErrorExit:
pObj->Release();
return ec;
}
这样客户程序只要以接口方法的形式调用相应的方法就可完成初始化,客户端包含的对构件的使用非常类似C++的类对象构造,如下所示:
EXTERN_Cintmain(int argc,char**argv)
{
Position pos={100,110},postmp;
IButtonSam*pbs=NULL;
ECODE ec=CButtonSam.New(&pos,&pbs);
if(FAILED(ec)){
printf("Failed to create object with using Positon,ec=0x%08x\n",ec);
goto ErrorExit;
}
printf("Succeed to create button with position{x=%d,y=%d}\n",pos.x,pos.y);
pbs->GetPosition(&postmp);
printf("Get positon:x=%d,y=%d\n",postmp.x,postmp.y);
pbs->Release();
pbs=NULL;
ErrorExit:
if(pbs)pbs->Release();
return 0;
}
其中,New函数实现是由系统根据Car文件提供的元数据生成的如下代码来完成的:
class_CButtonSamClassObject_
{
public:
static ECODE New(
/*[in]*/PPosition pos,
/*[out]*/IButtonSam**pIButtonSam)
{
ECODE_ecode=NOERROR;
IObject*_pNewObject=NULL;
_CButtonSam_IClassObject_*_p_CButtonSam_IClassObject_=NULL;
_ecode=EzGetClassObject(CLSID__CButtonSamClassObject_,
CTX_SAME_DOMAIN,(IObject**)&_p_CButtonSam_IClassObject_);
if(FAILED(_ecode))goto Exit;
_ecode=_p_CButtonSam_IClassObject_->CreateObjectWithPos(pos,&_pNewObject);
if(FAILED(_ecode))goto Exit;
_ecode=_pNewObject->QueryInterface(IID_IButtonSam,(IObject**)pIButtonSam);
if(FAILED(_ecode))goto Exit;
Exit:
if(_pNewObject)_pNewObject->Release();
if(_p_CButtonSam_IClassObject_)_p_CButtonSam_IClassObject_->Release();
return_ecode;
}
};
采用了上述的构件初始化过程中的构造方法,由于系统在初始化过程中根据构件描述文件中的构件接口元数据和特定的构造函数信息在服务端生成包括构造接口方法的构造接口类代码框架,同时在客户端自动生成对应的构造调用方法,并将操作的结果作为返回值返回给用户,从而可靠实现了客户端和服务端的构件远程构造方式,并能够较好的支持分布式系统应用;同时将构造结果返回用户,便于用户针对性的进行处理,从而提高了开发人员的开发效率和程序的执行效率,降低了开发难度,增强了程序运行性能的稳定性,适用范围较为广泛,为分布式构件化软件系统的进一步发展奠定了坚实的基础。
在此说明书中,本发明已参照其特定的实施例作了描述。但是,很显然仍可以作出各种修改和变换而不背离本发明的精神和范围。因此,说明书和附图应被认为是说明性的而非限制性的。
Claims (4)
1.一种构件初始化过程中的构造方法,使用通过计算机网络相连接的服务端和客户端,其特征在于,所述的方法包括以下步骤:
(1)系统进行初始化操作;
(2)系统根据用户操作,在构件描述文件中添加构件接口描述信息和特定的构造函数,所述的特定的构造函数的格式为:构造函数标识([输入]输入参数);
(3)系统读取该构件描述文件,产生元数据信息,并根据该特定的构造函数在服务端生成包括构造接口方法的构造接口类代码框架,包括以下步骤:
(a)在服务端生成构造接口类的代码;
(b)根据所述的特定的构造函数生成该构造接口类的构造接口方法,该构造接口方法的格式为:错误代码接口方法标识(输入参数,构件指针),其中错误代码为该构造接口方法的返回值;
(c)在该构造接口方法的执行过程中进行产生该构件对象并进行初始化的操作,并将构件产生和初始化操作的错误代码作为返回值返回;
(4)系统得到元数据信息,并根据该元数据信息在客户端生成构造调用方法,具体为:在客户端根据构件接口元数据,产生特定的构造函数和构件接口构造调用方法,该构造调用方法的格式为:错误代码构造方法标识(输入参数,构件指针),其中错误代码为该构造调用方法的返回值;
(5)系统根据用户调用和元数据信息,在客户端产生构件类厂对象;
(6)系统在服务端查询相应的构造接口类;
(7)系统根据查询到的构造接口类调用相应的构造接口方法,并将操作结果作为返回值返回,从而完成构件的初始化构造。
2.根据权利要求1所述的构件初始化过程中的构造方法,其特征在于,所述的构造函数标识为constructor。
3.根据权利要求2所述的构件初始化过程中的构造方法,其特征在于,所述的在客户端生成构造调用方法还包括以下步骤:
(41)在该构造调用方法的执行过程中进行产生构件类厂对象、在服务端查询相应的构造接口类、根据该构造接口类调用相应的构造接口方法以完成产生构件和初始化构造的操作,并将上述操作的错误代码作为返回值返回。
4.根据权利要求3所述的构件初始化过程中的构造方法,其特征在于,所述的构造方法标识为New。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB200610029755XA CN100462914C (zh) | 2006-08-04 | 2006-08-04 | 构件初始化过程中的构造方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB200610029755XA CN100462914C (zh) | 2006-08-04 | 2006-08-04 | 构件初始化过程中的构造方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1904825A CN1904825A (zh) | 2007-01-31 |
CN100462914C true CN100462914C (zh) | 2009-02-18 |
Family
ID=37674096
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB200610029755XA Expired - Fee Related CN100462914C (zh) | 2006-08-04 | 2006-08-04 | 构件初始化过程中的构造方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN100462914C (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6434740B1 (en) * | 1998-07-15 | 2002-08-13 | International Business Machines Corporation | Apparatus and method for visual construction simplification |
CN1514361A (zh) * | 2002-12-31 | 2004-07-21 | 北京科泰世纪科技有限公司 | 构件自描述封装方法及运行的方法 |
CN1514353A (zh) * | 2002-12-31 | 2004-07-21 | 北京科泰世纪科技有限公司 | 基于动态内核实现跨地址空间创建构件对象的方法 |
CN1519716A (zh) * | 2003-01-22 | 2004-08-11 | 北京科泰世纪科技有限公司 | 基于构件定义语言自动生成c++程序的方法 |
US20060036999A1 (en) * | 2004-08-13 | 2006-02-16 | Fay Thomas R | System and method for managing test and measurement components |
-
2006
- 2006-08-04 CN CNB200610029755XA patent/CN100462914C/zh not_active Expired - Fee Related
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6434740B1 (en) * | 1998-07-15 | 2002-08-13 | International Business Machines Corporation | Apparatus and method for visual construction simplification |
CN1514361A (zh) * | 2002-12-31 | 2004-07-21 | 北京科泰世纪科技有限公司 | 构件自描述封装方法及运行的方法 |
CN1514353A (zh) * | 2002-12-31 | 2004-07-21 | 北京科泰世纪科技有限公司 | 基于动态内核实现跨地址空间创建构件对象的方法 |
CN1519716A (zh) * | 2003-01-22 | 2004-08-11 | 北京科泰世纪科技有限公司 | 基于构件定义语言自动生成c++程序的方法 |
US20060036999A1 (en) * | 2004-08-13 | 2006-02-16 | Fay Thomas R | System and method for managing test and measurement components |
Non-Patent Citations (6)
Title |
---|
CAR构件编程技术中的自描述特性. 郑炜,陈榕,苏翼鹏,殷人昆.计算机工程与应用,第9期. 2005 |
CAR构件编程技术中的自描述特性. 郑炜,陈榕,苏翼鹏,殷人昆.计算机工程与应用,第9期. 2005 * |
从C++多态到CAR多态研究软件复用的发展. 杨亚俊,陈榕,杨青松.计算机工程与设计,第26卷第9期. 2005 |
从C++多态到CAR多态研究软件复用的发展. 杨亚俊,陈榕,杨青松.计算机工程与设计,第26卷第9期. 2005 * |
支持构件自描述的CAR_CLSID机理剖析. 赵泛舟,梁宇洲,陈榕,张素琴.计算机工程与应用,第11期. 2005 |
支持构件自描述的CAR_CLSID机理剖析. 赵泛舟,梁宇洲,陈榕,张素琴.计算机工程与应用,第11期. 2005 * |
Also Published As
Publication number | Publication date |
---|---|
CN1904825A (zh) | 2007-01-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Mei et al. | ABC/ADL: An ADL supporting component composition | |
Bálek et al. | Software connectors and their role in component deployment | |
WO2009061146A2 (en) | A method for software development and operation based on component reuse and dependency injection | |
CN101211273B (zh) | 在构件编程中自动生成Singleton模式的方法 | |
Kalibera et al. | Distributed component system based on architecture description: The sofa experience | |
Bálek | Connectors in software architectures | |
Hnetynka et al. | Comparing the service component architecture and fractal component model | |
CN100462914C (zh) | 构件初始化过程中的构造方法 | |
Lange et al. | A tool for choreography-based analysis of message-passing software | |
Arbab et al. | Synthesis of connectors from scenario-based interaction specifications | |
Bardaro et al. | From models to software through automatic transformations: An AADL to ROS end-to-end toolchain | |
Yu et al. | Dynamic software architecture oriented service composition and evolution | |
Yoo et al. | The robot software communications architecture (RSCA): QoS-aware middleware for networked service robots | |
Issarny et al. | Component-based programming of distributed applications | |
CN100373332C (zh) | 构建耦合系统的方法 | |
Wada et al. | Leveraging metamodeling and attribute-oriented programming to build a model-driven framework for domain specific languages | |
Bures et al. | Runtime support for advanced component concepts | |
Kim | Modeling of Distributed Systems with SOA & MDA. | |
Jouve et al. | High-level programming support for robust pervasive computing applications | |
Kautz et al. | Methodology for an Early Exploration of Embedded Systems using Portable Test and Stimulus Standard | |
Hnetynka et al. | Advanced Features of Hierarchical Component Models. | |
Cao et al. | A framework for architecting and high-level programming support of CORBA applications | |
Tešanović | Developing Reusable and Reconfigurable Real-Time Software Using Aspects and Components | |
Sindico et al. | An industrial application of a system engineering process integrating model-driven architecture and model based design | |
Clauß | A proposal for uniform abstract modeling of feature interactions in UML |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 1103587 Country of ref document: HK |
|
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: GR Ref document number: 1103587 Country of ref document: HK |
|
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20090218 Termination date: 20180804 |