CN104142857B - 一种页面静音的方法及装置 - Google Patents

一种页面静音的方法及装置 Download PDF

Info

Publication number
CN104142857B
CN104142857B CN201310168181.4A CN201310168181A CN104142857B CN 104142857 B CN104142857 B CN 104142857B CN 201310168181 A CN201310168181 A CN 201310168181A CN 104142857 B CN104142857 B CN 104142857B
Authority
CN
China
Prior art keywords
function
interface
jing yin
created
call
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.)
Active
Application number
CN201310168181.4A
Other languages
English (en)
Other versions
CN104142857A (zh
Inventor
尚子峰
关亮亮
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN201310168181.4A priority Critical patent/CN104142857B/zh
Publication of CN104142857A publication Critical patent/CN104142857A/zh
Application granted granted Critical
Publication of CN104142857B publication Critical patent/CN104142857B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Stored Programmes (AREA)

Abstract

本发明适用于互联网技术领域,提供了一种页面静音的方法及装置,所述方法包括:调用动态链接库中的第一函数以创建接口;在创建的所述接口为第一接口时,调用所述第一接口中的第二函数创建接口;在所述第二函数创建的接口为第二接口时,调用所述第二接口中的第三函数,通过调用的所述第三函数设置静音。通过本发明,可有效解决webkit内核下页面静音失效的问题。

Description

一种页面静音的方法及装置
技术领域
本发明属于互联网技术领域,尤其涉及一种webkit内核下页面静音的方法及装置。
背景技术
目前主流浏览器都提供有页面静音功能,通过控制与声音播放相关的浏览器进程,可以对当前浏览页面进行静音。
然而,在webkit内核下,某些页面(例如QQ空间)与声音播放相关的进程是一个独立的进程,即声音播放等过程不在webkit进程内,导致在webkit内核下无法对所述页面进行静音控制。
发明内容
本发明实施例的目的在于提供一种页面静音的方法,以解决现有技术在webkit内核下页面静音失效的问题。
本发明实施例是这样实现的,一种页面静音的方法,所述方法包括:
调用动态链接库中的第一函数以创建接口;
在创建的所述接口为第一接口时,调用所述第一接口中的第二函数创建接口;
在所述第二函数创建的接口为第二接口时,调用所述第二接口中的第三函数,通过调用的所述第三函数设置静音。
本发明实施例的另一目的在于提供一种页面静音的装置,所述装置包括:
第一调用单元,用于调用动态链接库中的第一函数以创建接口;
第二调用单元,用于在创建的所述接口为第一接口时,调用所述第一接口中的第二函数创建接口;
静音单元,用于在所述第二函数创建的接口为第二接口时,调用所述第二接口中的第三函数,通过调用的所述第三函数设置静音。
本发明实施例与现有技术相比存在的有益效果是:本发明实施例通过创建接口,调用接口中的静音函数(即第三函数)来控制与声音播放相关的进程,进而达到页面静音的效果,有效解决webkit内核下页面静音失效的问题。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例一提供的页面静音方法的实现流程图;
图2是本发明实施例二提供的页面静音方法的具体流程图;
图3是本发明实施例三提供的页面静音装置的组成结构图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
为了更好的理解本发明实施例,下面对本发明实施例中出现的一些概念进行下说明:
COM,即组件对象模型,以WIN32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行代码组成,给应用程序、操作***以及其他组件提供服务。在COM构架下,用户可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用***。
钩子(Hook),是一个处理消息的程序段,用于监视指定窗口的某种消息,所监视的窗口可以是其他进程所创建的。每当特定的消息发出,在没有到达目标窗口前,Hook先捕获该消息,即Hook先得到控制权,可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
为了说明本发明所述的技术方案,下面通过具体实施例来进行说明。
实施例一:
图1示出了本发明实施例一提供的页面静音方法的实现流程,该方法过程详述如下:
在步骤S101中,调用动态链接库中的第一函数以创建接口。
在本实施例中,调用动态链接库(如ole32.dll)中的第一函数(例如CoCreateInstanceEx函数)具体过程包括:
创建第一函数,所述创建的第一函数与所述动态链接库中的第一函数含有相同的参数;
将所述动态链接库中的第一函数的指针替换为所创建的第一函数的指针,以完成对所述动态链接库中第一函数的HooK。
本实施例HooK所述动态链接库中第一函数的目的在于使得后续对所述动态链接库中第一函数的调用都会进入所创建的第一函数中,方便对所述动态链接库中第一函数调用过程的控制。
其中,动态链接库中第一函数的原型示例如下:
HRESULT CoCreateInstanceEx(
REFCLSID rclsid,//待创建的COM的类标识符
IUnknown*punkOuter,//指向接口IUnknown的指针
DWORD dwClsCtx,//运行可执行代码的上下文
COSERVERINFO*pServerInfo,//要创建COM的机器的信息。如果该值为NULL,表示COM在本地机器上创建。否则在注册表中RemoteServerName键描述的机器上创建
ULONG cmq,//pResults中MULTI_QI结构体的数目
MULTI_QI*pResults//MULTI_QI结构的数组,返回的已经创建好的COM);
本实施例创建的第一函数与所述动态链接库中的第一函数含有相同的参数,例如创建的CoCreateInstanceEx函数参数包括(REFCLSID,IUnknown*,DWORD,COSERVERINFO*,ULONG,MULTI_QI*)。
在步骤S102中,在创建的所述接口为第一接口(如IUnknown接口)时,调用所述第一接口中的第二函数创建接口。
在本实施例中,所述调用所述第一接口中的第二函数创建接口具体包括:
创建第二函数(如QueryInterface函数),所述创建的第二函数与所述第一接口中的第二函数含有相同的参数;
将所述第一接口中的第二函数的指针替换为所创建的第二函数的指针。
以步骤S101中创建的CoCreateInstanceEx函数为例,创建的CoCreateInstanceEx函数中最后一个参数类型定义如下:
其中pIID与pItf都是数组指针,他们的大小相同,数据相对应。pIID通知待创建的COM类型,pItf返回创建好的COM指针。
本实施例通过调用动态链接库中的CoCreateInstanceEx函数,之后遍历pIID中的所有IID,如果找到IID_IUnknown,则pItf中与之对应的IUnknown*是***返回的创建好的COM接口指针。此时通过创建的QueryInterface函数的指针替换IUnknown接口中的QueryInterface函数指针,即完成对IUnknown接口中QueryInterface函数的HooK。
其中,创建的QueryInterface函数与IUnknown接口中QueryInterface函数含有相同的参数,即QueryInterface(REFIID,void**),功能是通过参数void**返回参数REFIID描述的接口。
在步骤S103中,在所述第二函数创建的接口为第二接口(如IPlayerCtrl接口)时,调用所述第二接口中的第三函数(如SetPlayURL函数),通过调用的所述第三函数设置静音。
在本实施例中,所述调用所述第二接口中的第三函数,通过调用的所述第三函数设置静音具体包括:
创建第三函数,所述创建的第三函数与所述第二接口中的第三函数含有相同的参数;
将所述第二接口中的第三函数的指针替换为所创建的第三函数的指针;
在所创建的第三函数内,调用所述第二接口中的第三函数,通过调用的所述第三函数设置静音。具体的是,通过调用所述第三函数的第一子函数(如put_Mute函数)设置静音。
以QueryInterface函数为例,如果第一接口中的QueryInterface函数创建的接口为IPlayerCtrl(即QueryInterface函数的参数REFIID为IID_IPlayerCtrl),则创建SetPlayURL函数,将所述IPlayerCtrl接口中的SetPlayURL函数的指针替换为所创建的SetPlayURL函数的指针,即完成对所述IPlayerCtrl接口中SetPlayURL的HooK。
其中,SetPlayURL函数原型为:HRESULT SetPlayURL(IPlayerCtrl*This,longlSongId,BSTR bstrSongURL,BSTR bstrP2PURL);
如果要设置静音,则在创建的SetPlayURL函数中调用IPlayerCtrl接口中的SetPlayURL函数,通过调用所述SetPlayURL函数的put_Mute函数设置静音,即This->put_Mute(TRUE)。
本发明实施例通过创建接口,调用接口中的静音函数(即第三函数)来控制与声音播放相关的进程(通过创建的接口可以调用不同进程内的函数来实现相同的功能),进而达到页面静音的效果,从而有效解决webkit内核下页面静音失效的问题。
实施例二:
图2示出了本发明实施例二提供的页面静音方法的具体流程,该方法过程详述如下:
在步骤S201中,HooK CoCreateInstanceEx函数以创建第一接口。
在本实施例中,所述CoCreateInstanceEx函数为动态链接库ole32.dll中的函数。其中,CoCreateInstanceEx函数原型示例如下:
HRESULT CoCreateInstanceEx(
REFCLSID rclsid,
IUnknown*punkOuter,
DWORD dwClsCtx,
COSERVERINFO*pServerInfo,
ULONG cmq,
MULTI_QI*pResults);
在本实施例中HooK CoCreateInstanceEx函数的具体过程是创建CoCreateInstanceEx函数,所创建的CoCreateInstanceEx函数与ole32.dll组件中的CoCreateInstanceEx函数含有相同的参数,并将ole32.dll组件中CoCreateInstanceEx函数的指针替换为创建的CoCreateInstanceEx函数指针,使得以后***对ole32.dlll组件中CoCreateInstanceEx函数的调用都会进入创建的CoCreateInstanceEx函数内,方便对所述ole32.dlll组件中CoCreateInstanceEx函数调用过程的控制。
在步骤S202中,判断创建的第一接口是否为Iunknown接口,若判断结果为“是”,则执行步骤S203,否则结束流程。
其中,所述Iunknown接口中包含有接口查询函数QueryInterface函数。QueryInterface函数参数为(REFIID,void**),该函数的功能是通过参数void**返回参数REFIID描述的接口。
在步骤S203中,Hook所述QueryInterface函数创建第二接口。
具体包括:创建QueryInterface函数,通过创建的QueryInterface函数的指针替换IUnknown接口中QueryInterface函数的指针。其中,所述创建的QueryInterface函数与所述IUnknown接口中的QueryInterface函数包含相同的参数。
在步骤S204中,判断创建的第二接口是否为IPlayerCtrl接口,若判断结果为“是”,则执行步骤S205,否则结束流程。
在本实施例中,所述IPlayerCtrl接口用于控制与声音播放相关的进程。其中,所述IPlayerCtrl接口中包含有与声音播放相关的控制函数SetPlayURL函数。SetPlayURL函数原型为:HRESULT SetPlayURL(IPlayerCtrl*This,long lSongId,BSTR bstrSongURL,BSTR bstrP2PURL)。
在步骤S205中,Hook所述SetPlayURL函数。
具体包括:创建的SetPlayURL函数,将所述IPlayerCtrl接口中的SetPlayURL函数的指针替换为所创建的SetPlayURL函数的指针。其中,创建的SetPlayURL函数与IPlayerCtrl接口中的SetPlayURL函数包含有相同的参数。
在步骤S206中,调用put_Mute函数设置静音。
在设置静音时,Hook所述SetPlayURL函数,在Hook后的SetPlayURL函数中通过调用SetPlayURL函数中的子函数put_Mute函数设置静音,即This->put_Mute(TRUE)。
举例说明上述过程,当使用webkit内核的浏览器(例如Chrome或Safari等浏览器)打开QQ空间,播放QQ空间的某些音视频文件时,由于QQ空间与声音播放相关的进程是一个独立的进程,因此需要创建一个接口,即创建IPlayerCtrl接口,通过创建的所述IPlayerCtrl接口调用与声音播放相关进程内的函数(SetPlayURL函数)来控制音视频的播放。同时为了方便对函数调用过程的控制,在自定义的SetPlayURL函数中调用***内的所述SetPlayURL函数来播放音乐。当接收到用户设置静音的指令(即用户点击播放器上的静音按键)后,HooK所述SetPlayURL函数,在Hook后的SetPlayURL函数中通过调用SetPlayURL函数中的子函数put_Mute函数来设置静音,即This->put_Mute(TRUE),将put_mute函数中的settings.mute:Boolean设置为TRUE。
实施例三:
图3示出了本发明实施例三提供的页面静音装置的组成结构,为了便于说明,仅示出了与本发明实施例相关的部分。
该页面静音装置可以是运行于各播放器内的软件单元、硬件单元或者软硬件相结合的单元,也可以作为独立的挂件集成到播放器或者播放器的应用***中。
该页面静音装置包括第一调用单元31、第二调用单元32以及静音单元33。其中,各单元的具体功能如下:
第一调用单元31,用于调用动态链接库中的第一函数以创建接口;
第二调用单元32,用于在创建的所述接口为第一接口时,调用所述第一接口中的第二函数创建接口;
静音单元33,用于在所述第二函数创建的接口为第二接口时,调用所述第二接口中的第三函数,通过调用的所述第三函数设置静音。
进一步的,所述第一调用单元31包括:
创建模块311,用于创建第一函数,所述创建的第一函数与所述动态链接库中的第一函数含有相同的参数;
替换模块312,用于将所述动态链接库中的第一函数的指针替换为所创建的第一函数的指针。
进一步的,所述第二调用单元32包括:
创建模块321,用于创建第二函数,所述创建的第二函数与所述第一接口中的第二函数含有相同的参数;
替换模块322,用于将所述第一接口中的第二函数的指针替换为所创建的第二函数的指针。
进一步是,所述静音单元33包括:
创建模块331,用于创建模块,用于创建第三函数,所述创建的第三函数与所述第二接口中的第三函数含有相同的参数;
替换模块332,用于将所述第二接口中的第三函数的指针替换为所创建的第三函数的指针;
静音模块333,用于在所创建的第三函数内,调用所述第二接口中的第三函数,通过调用的所述第三函数设置静音。
进一步的,所述静音单元33具体用于:
通过调用所述第三函数的第一子函数设置静音。
在本实施例中,所述第一函数为CoCreateInstanceEx函数,所述第一接口为IUnknown接口,所述第二函数为QueryInterface函数,所述第二接口为IPlayerCtrl接口,所述第三函数为SetPlayURL函数,所述第一子函数为put_Mute函数。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。实施例中的各功能单元或模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的单元或模块既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本申请的保护范围。上述装置中单元、模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
综上所述,本发明实施例通过创建接口,调用接口中的静音函数(即第三函数)来控制与声音播放相关的进程(通过创建的接口可以调用不同进程内的函数来实现相同的功能),进而达到页面静音的效果,从而有效解决webkit内核下页面静音失效的问题。
本领域普通技术人员还可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以在存储于一计算机可读取存储介质中,所述的存储介质,包括ROM/RAM、磁盘、光盘等。
以上内容是结合具体的优选实施方式对本发明所作的进一步详细说明,不能认定本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在不脱离本发明构思的前提下做出若干等同替代或明显变型,而且性能或用途相同,都应当视为属于本发明由所提交的权利要求书确定的专利保护范围。

Claims (10)

1.一种页面静音的方法,其特征在于,所述方法包括:
调用动态链接库中的第一函数以创建接口,其中,调用动态链接库中的第一函数其过程包括:HOOK动态链接库中的第一函数;
在创建的所述接口为第一接口时,调用所述第一接口中的第二函数创建接口,其中,调用所述第一接口中的第二函数其过程包括:HOOK所述第一接口中的第二函数;
在所述第二函数创建的接口为第二接口时,调用所述第二接口中的第三函数,通过调用的所述第三函数设置静音,其中,调用所述第二接口中的第三函数其过程包括:HOOK所述第二接口中的第三函数;
其中,所述第一函数为CoCreateInstanceEx函数,所述第二函数为QueryInterface函数,所述第三函数为SetPlayURL函数。
2.如权利要求1所述的方法,其特征在于,所述调用动态链接库中的第一函数以创建接口包括:
创建第一函数,所述创建的第一函数与所述动态链接库中的第一函数含有相同的参数;
将所述动态链接库中的第一函数的指针替换为所创建的第一函数的指针。
3.如权利要求1所述的方法,其特征在于,所述调用所述第一接口中的第二函数以创建接口包括:
创建第二函数,所述创建的第二函数与所述第一接口中的第二函数含有相同的参数;
将所述第一接口中的第二函数的指针替换为所创建的第二函数的指针。
4.如权利要求1所述的方法,其特征在于,所述调用所述第二接口中的第三函数,通过调用的所述第三函数设置静音包括:
创建第三函数,所述创建的第三函数与所述第二接口中的第三函数含有相同的参数;
将所述第二接口中的第三函数的指针替换为所创建的第三函数的指针;
在所创建的第三函数内,调用所述第二接口中的第三函数,通过调用的所述第三函数设置静音。
5.如权利要求1或4所述的方法,其特征在于,所述通过调用的所述第三函数设置静音包括:
通过调用所述第三函数的第一子函数设置静音。
6.一种页面静音的装置,其特征在于,所述装置包括:
第一调用单元,用于调用动态链接库中的第一函数以创建接口,其中,调用动态链接库中的第一函数其过程包括:HOOK动态链接库中的第一函数;
第二调用单元,用于在创建的所述接口为第一接口时,调用所述第一接口中的第二函数创建接口,其中,调用所述第一接口中的第二函数其过程包括:HOOK所述第一接口中的第二函数;
静音单元,用于在所述第二函数创建的接口为第二接口时,调用所述第二接口中的第三函数,通过调用的所述第三函数设置静音,其中,调用所述第二接口中的第三函数其过程包括:HOOK所述第二接口中的第三函数;
其中,所述第一函数为CoCreateInstanceEx函数,所述第二函数为QueryInterface函数,所述第三函数为SetPlayURL函数。
7.如权利要求6所述的装置,其特征在于,所述第一调用单元包括:
创建模块,用于创建第一函数,所述创建的第一函数与所述动态链接库中的第一函数含有相同的参数;
替换模块,用于将所述动态链接库中的第一函数的指针替换为所创建的第一函数的指针。
8.如权利要求6所述的装置,其特征在于,所述第二调用单元包括:
创建模块,用于创建第二函数,所述创建的第二函数与所述第一接口中的第二函数含有相同的参数;
替换模块,用于将所述第一接口中的第二函数的指针替换为所创建的第二函数的指针。
9.如权利要求6所述的装置,其特征在于,所述静音单元包括:
创建模块,用于创建模块,用于创建第三函数,所述创建的第三函数与所述第二接口中的第三函数含有相同的参数;
替换模块,用于将所述第二接口中的第三函数的指针替换为所创建的第三函数的指针;
静音模块,用于在所创建的第三函数内,调用所述第二接口中的第三函数,通过调用的所述第三函数设置静音。
10.如权利要求6或9所述的装置,其特征在于,所述静音单元具体用于:
通过调用所述第三函数的第一子函数设置静音。
CN201310168181.4A 2013-05-06 2013-05-06 一种页面静音的方法及装置 Active CN104142857B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201310168181.4A CN104142857B (zh) 2013-05-06 2013-05-06 一种页面静音的方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201310168181.4A CN104142857B (zh) 2013-05-06 2013-05-06 一种页面静音的方法及装置

Publications (2)

Publication Number Publication Date
CN104142857A CN104142857A (zh) 2014-11-12
CN104142857B true CN104142857B (zh) 2018-02-23

Family

ID=51852038

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310168181.4A Active CN104142857B (zh) 2013-05-06 2013-05-06 一种页面静音的方法及装置

Country Status (1)

Country Link
CN (1) CN104142857B (zh)

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103034695A (zh) * 2012-12-03 2013-04-10 北京奇虎科技有限公司 浏览器中进行声音控制的方法及装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8426716B2 (en) * 2011-01-07 2013-04-23 Apple Inc. Intelligent keyboard interface for virtual musical instrument

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103034695A (zh) * 2012-12-03 2013-04-10 北京奇虎科技有限公司 浏览器中进行声音控制的方法及装置

Also Published As

Publication number Publication date
CN104142857A (zh) 2014-11-12

Similar Documents

Publication Publication Date Title
KR101855866B1 (ko) 전자 디바이스들 사이의 액티비티 계속
WO2021098269A1 (zh) 一种深度学习模型分布式运算的方法及装置
CN106201430A (zh) 一种音量调节的方法及电子设备
TW201229700A (en) Hybrid simulation system and method
KR20170012428A (ko) 액티비티 협력을 위한 동반 애플리케이션
CN107423387A (zh) 一种基于中间件的分库分表的方法与装置
CN110908837B (zh) 应用程序异常处理方法、装置、电子设备及存储介质
CN104572781A (zh) 一种交易日志产生方法和装置
JP6966432B2 (ja) クラウドファイル処理方法および装置
CN101727423B (zh) 可重配置fpga上可抢占硬件多任务***及其实现方法
CN103020003A (zh) 面向多核程序确定性重演的内存竞争记录装置及其控制方法
CN101937360B (zh) 一种创建虚拟机的方法和装置
CN108198582B (zh) 一种NAND Flash控制方法、装置及SSD
CN111930651B (zh) 一种指令执行方法、装置、设备及可读存储介质
CN104142857B (zh) 一种页面静音的方法及装置
JP2006236105A5 (zh)
CN104731564A (zh) ***接口调用记录的生成方法和装置
CN105808338A (zh) 一种在处理中实现中断响应核可配置的方法及装置
CN104142965A (zh) 一种基于社交应用的网页浏览方法及装置、终端设备
WO2014101455A1 (zh) 浏览器活动对象的执行方法、***及浏览器
US20240061581A1 (en) Data I/O Processing Method and Apparatus, Storage Medium, and Device
US20180157627A1 (en) Tool for providing actionable functionality on a website
CN108509125A (zh) 翻页的方法、装置、终端及计算机可读存储介质
CN103870313A (zh) 一种虚拟机任务调度方法及***
CN106407792A (zh) 控制移动终端的方法及音箱

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
EXSB Decision made by sipo to initiate substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant