让CHROME浏览器支持COM类型组件的方法.pdf

上传人:1520****312 文档编号:4256306 上传时间:2018-09-12 格式:PDF 页数:17 大小:2.60MB
返回 下载 相关 举报
摘要
申请专利号:

CN201310459592.9

申请日:

2013.09.29

公开号:

CN103530116A

公开日:

2014.01.22

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):G06F 9/44申请日:20130929|||公开

IPC分类号:

G06F9/44

主分类号:

G06F9/44

申请人:

北京我知科技有限公司

发明人:

魏拾俊

地址:

100123 北京市朝阳区朝阳路71号锐城国际1015房间

优先权:

专利代理机构:

北京金恒联合知识产权代理事务所 11324

代理人:

吴云华

PDF下载: PDF下载
内容摘要

本发明公开了一种让Chrome浏览器支持COM类型组件的方法,通过改造Chrome浏览器的V8引擎,使V8和COM的数据类型,尤其是对象,可以相互转换,让V8引擎可以支持COM对象,从而实现了对Chrome浏览器网站的兼容。本发明的方法简单、可行,不需要网站开发人员做任何改动,节省了高昂的开发费用,也不需要用户去手工选择兼容模式,提高了用户体验。

权利要求书

权利要求书
1.  一种让Chrome浏览器支持COM类型组件的方法,包括:
将Chrome浏览器的V8基本数据类型与IE浏览器的COM基本数据类型进行相互转换;
将IE浏览器的COM对象转换为Chrome浏览器的V8对象;
将Chrome浏览器的V8对象转换为IE浏览器的COM对象。

2.  根据权利要求1的方法,其中,COM对象转换为V8对象的步骤包括:
通过COM对象的类型库,获取COM对象的属性和方法信息;
创建V8对象,并将COM对象的属性映射为V8对象的属性;
将COM对象的方法映射到V8对象的方法;
将V8对象和COM对象关联起来。

3.  根据权利要求2的方法,其中,创建V8对象并将COM对象的属性映射为V8对象的属性的步骤包括:
编写一个类并实现Accessor接口,然后生成该类的实例;
创建V8对象,并把生成的Accessor实例作为参数传递给V8;
将COM对象的属性名称添加到生成的V8的对象里面。

4.  根据权利要求3的方法,其中,Accessor接口包含用于获取对象的属性的Get方法和用于设置对象的属性的Set方法,其中,Set或Get方法的实现步骤包括:
直接根据属性名称,获取或设置COM对象的属性;
对于Get方法,将COM对象的属性值转换为V8类型,并返回给调用者;对于Set方法,将V8参数转换为COM类型,并设置给COM对象。

5.  根据权利要求2的方法,其中,将COM对象的方法映射到V8对象的方法的步骤包括:
编写一个类并实现Handler接口,然后创建该类的实例;
创建V8对象或使用已有的V8对象,给该V8对象添加方法,并把实现的Handler对象的实例作为参数传递给该V8对象。

6.  根据权利要求5的方法,其中,handler接口通过Execute方法来执行COM对象的方法,Execute方法的实现步骤包括:
使用循环,将参数从V8类型转换为COM类型;
调用COM对象相应的方法,并将转换后的参数,传递给COM对象;
将返回值转换为V8类型,并返回给调用者。

7.  根据权利要求2的方法,其中,将V8对象和COM对象关联起来的步骤包括:
当V8引擎通过Accessor或Handler接口访问对象的属性或方法时,通过Accessor或Handler对象,找到对应的COM对象,并将相应的参数传给COM对象,在COM对象执行完相应的方法后,将COM对象的返回值,返回给V8引擎。

8.  根据权利要求1的方法,其中,V8对象转换为COM对象的步骤包括:
初始化过程,将V8对象的每个属性或方法映射为一个唯一的ID;
实现IDispatch接口,以实现COM对象调用到V8对象调用的转换。

9.  根据权利要求8的方法,其中,初始化过程包括:
获取V8对象所有的属性和方法的名称;
按照一定的顺序,给每个属性和方法的名称分配一个不同的ID;
记住每个属性和方法的名称与它的ID之间的对应关系。

10.  根据权利要求8或9的方法,其中,实现IDispatch接口的步骤包括:实现方法GetIDsOfNames和方法Invoke,其中,方法Invoke的实现包括:
通过ID,查找到对应的属性和方法的名称;
将所有的COM类型的参数,转换为V8类型的参数;
根据不同的调用类型-方法或属性,执行V8对象的不同的方法;
将具体的方法或属性的返回值,转换为COM类型,并进行返回。

说明书

说明书让Chrome浏览器支持COM类型组件的方法
技术领域
本发明涉及一种让Chrome浏览器支持COM类型组件的方法,属于计算机网络技术领域。
背景技术
浏览器插件是一种扩展浏览器功能的方式,目前被广泛应用于一些网银,行业网站以及企业内部办公环境下面的网站。浏览器插件机制主要有两种,一种是IE支持的COM方式,这种方式非常简单,在Windows环境下获得了广泛的应用;另外一种是NPAPI方式,主要被Chrome,Firefox等浏览器支持,但这种方式开发难度很高,目前仅仅被一些大公司支持,例如Flash插件等。
Chrome以及其它Chrome核心的浏览器当前已经非常流行了,如Chrome,360安全浏览器,百度浏览器,猎豹浏览器等等。但是,Chrome浏览器以及其它Chrome核心的浏览器并不支持COM对象,这导致很多网站无法正常访问,例如很多网银无法登录,一些企业的内部网站也无法正常使用。
对于上述问题,目前主要通过以下两种方式解决:
一是网站开发人员针对不同的浏览器,开发不同的网站或者插件。例如:针对IE,开发COM类型的插件;而针对Chrome浏览器,则开发NPAPI类型的插件。然而NPAPI插件相关资料很少,开发难度非常高。相反COM插件非常容易开发。因此,现在网站大部分都是先开发COM类型的插件,甚至很多网站都只有COM类型的插件,如火车票预定12306网站,至今仍然仅支持IE浏览器。由此可见,即便是这样的大公司,想要开发NPAPI类型的插件,难度也非常高。
另一种是浏览器提供IE兼容模式。例如:360安全浏览器提供了兼容模式,实际上就是利用IE浏览器来打开这些网站。但是,这种方式仍然对用户要求很高,因为必须要让用户来手工选择使用兼容模式,而且用户也未必知道去选择兼容模式,这会导致浏览器的用户使用体验不好。
因此,如何让Chrome浏览器支持COM类型组件,是网站开发中亟待解决的技术问题之一。
发明内容
本发明的目的是提供了一种让Chrome浏览器支持COM类型组件的方法,该方法既不需要网站开发人员做任何改动,节省了高昂的开发费用,也不需要用户去手工选择兼容模式,提高了用户体验。
本发明提供的让Chrome浏览器支持COM类型组件的方法,包括:
将Chrome浏览器的V8基本数据类型与IE浏览器的COM基本数据类型进行相互转换;
将IE浏览器的COM对象转换为Chrome浏览器的V8对象;
将Chrome浏览器的V8对象转换为IE浏览器的COM对象。
根据本发明的一个具体但非限制性的实施方案,其中,COM对象转换为V8对象的步骤包括:
通过COM对象的类型库,获取COM对象的属性和方法信息;
创建V8对象,并将COM对象的属性映射为V8对象的属性;
将COM对象的方法映射到V8对象的方法;
将V8对象和COM对象关联起来。
根据本发明的一个具体但非限制性的实施方案,其中,创建V8对象并将COM对象的属性映射为V8对象的属性的步骤包括:
编写一个类并实现Accessor接口,然后生成该类的实例;
创建V8对象,并把生成的Accessor实例作为参数传递给V8;
将COM对象的属性名称添加到生成的V8的对象里面。
根据本发明的一个具体但非限制性的实施方案,其中,Accessor接口包含用于获取对象的属性的Get方法和用于设置对象的属性的Set方法,其中,Set或Get方法的实现步骤包括:
直接根据属性名称,获取或设置COM对象的属性;
对于Get方法,将COM对象的属性值转换为V8类型,并返回给调用者;对于Set方法,将V8参数转换为COM类型,并设置给COM对象。
根据本发明的一个具体但非限制性的实施方案,其中,将COM对象的方法映射到V8对象的方法的步骤包括:
编写一个类并实现Handler接口,然后创建该类的实例;
创建V8对象或使用已有的V8对象,给该V8对象添加方法,并把实现的Handler对象的实例作为参数传递给该V8对象。
根据本发明的一个具体但非限制性的实施方案,其中,handler接口通过Execute方法来执行COM对象的方法,Execute方法的实现步骤包括:
使用循环,将参数从V8类型转换为COM类型;
调用COM对象相应的方法,并将转换后的参数,传递给COM对象;
将返回值转换为V8类型,并返回给调用者。
根据本发明的一个具体但非限制性的实施方案,其中,将V8对象和COM对象关联起来的步骤包括:
当V8引擎通过Accessor或Handler接口访问对象的属性或方法时,通过Accessor或Handler对象,找到对应的COM对象,并将相应的参数传给COM对象,在COM对象执行完相应的方法后,将COM对象的返回值,返回给V8引擎。
根据本发明的一个具体但非限制性的实施方案,其中,V8对象转换为COM对象的步骤包括:
初始化过程,将V8对象的每个属性或方法映射为一个唯一的ID;
实现IDispatch接口,以实现COM对象调用到V8对象调用的转换。
根据本发明的一个具体但非限制性的实施方案,其中,初始化过程包括:
获取V8对象所有的属性和方法的名称;
按照一定的顺序,给每个属性和方法的名称分配一个不同的ID;
记住每个属性和方法的名称与它的ID之间的对应关系。
根据本发明的一个具体但非限制性的实施方案,其中,实现IDispatch接口的步骤包括:实现方法GetIDsOfNames和方法Invoke,其中,方法Invoke的实现包括:
通过ID,查找到对应的属性和方法的名称;
将所有的COM类型的参数,转换为V8类型的参数;
根据不同的调用类型-方法或属性,执行V8对象的不同的方法;
将具体的方法或属性的返回值,转换为COM类型,并进行返回。
本发明有益效果主要体现在:
本发明通过改造Chrome浏览器和其它Chrome核心的浏览器的V8引擎,使V8和COM的数据类型,尤其是对象,可以相互转换,让V8引擎可以支持COM对象,从而实现了对Chrome浏览器网站的兼容。本发明的方法简单、易行,不需要网站开发人员做任何改动,从而节省了高昂的开发费用,也不需要用户去手工选择兼容模式,提高了用户体验。
附图说明
图1是本发明的让Chrome浏览器支持COM类型组件的方法示意图。
图2是COM对象转换为V8对象的方法流程图。
图3是V8对象转换为COM对象的方法流程图。
具体实施方式
下面结合附图详细说明本发明的具体实施方式。
首先我们介绍一下背景知识。网页里面的插件一般采用C++编写,并且许要提供JavaScript访问的能力。不同的浏览器,采用的JavaScript运行环境不同,所以对插件的处理方式也不一样。对于IE浏览器,可以使用COM来扩展浏览器的功能。IE使用的JavaScript解析器内置了COM对象访问的功能,实际上微软IE本身就大量使用了COM对象,因此COM对象在IE里面的使用非常方便。而对于Chrome和其它Chrome核心的浏览器,则使用了V8引擎。V8是Google提供的一个JavaScript运行环境,采用C++编写。V8同样提供了扩展功能,可以利用C++等语言来进行扩展。要扩展浏览器功能,实际上就是让浏览器加载外部的一些组件,例如COM或者NPAPI编写的插件,然后通过网页中的JavaScript脚本,来访问或者使用这些插件。这些插件,在JavaScript里面,都是作为对象存在,和浏览器内置的一些对象相同。
因此,要想让JavaScript可以访问COM对象,让Chrome浏览器支持COM类型组件,就需要实现Chrome浏览器的V8数据类型与IE浏览器的COM数据类型之间的相互转换。
图1是本发明的让Chrome浏览器支持COM类型组件的方法示意图。我们把V8的数据类型(JavaScript里面的数据类型)和COM的数据类型,分为基本数据类型和对象两种。其中,基本数据类型包括整数、浮点数、字符串、日期以及数组等数据类型。这些任意的数据类型,在V8里面,使用Value来表示;在COM里面,使用VARIANT来表示。因此,我们需要将V8的Value和COM的VARIANT进行转换。
对于基本数据类型如整数、浮点数、字符串、日期以及数组等,转换比较容易。如V8类型转换为COM类型(Value->VARIANT),由于V8数据类型比较少,可以采取一一对应的方式找到相应的COM的数据类型。例如,V8里面的整数类型,在程序里面,我们可以获得V8整数类型的数值,然后根据这个整数,生成一个新的COM整数类型即可。对于浮点数,也可以按照这种方式进行转换。对于字符串,则需要将C语言的字符串转换为Windows的BSTR类型字符串。对于日期,同样需要将C语言的日期转换为Windows的日期格式。而对于COM类型转换为V8类型(VARIANT->Value),由于COM类型比较多,我们需要进行一些适当的转换。例如,将64位整数转换为字符串来表示。COM里面,整数有short、long、64位整数,有符号和无符号整数区分,对于64位整数,需要转换为字符串(JavaScript不支持);对于其它类型的整数,需要全部转换为32位整数。对于浮点数,日期,字符串,数组等,可以转换为V8里面相对应的类型。对于其它类型,例如指针类型,IUnknown之类的类型,则无 法转换为V8对应的类型,需要进行错误处理。
而对于对象,转换则复杂得多。因为不同的对象完成的工作是不一样的,无法直接转换,必须在程序使用到这些对象的时候,让这些对象自己去完成相应的处理才行。对象类型的转换分为两个方面:
-COM对象转换为V8对象。要让COM对象可以被V8访问,就必须将COM对象模拟成一个V8对象。
-V8对象转换为COM对象。由于COM对象在被使用的时候,很多情况下需要使用浏览器内置的一些对象,例如document,window等对象,此时就必须将这些V8对象,转换为COM对象,让COM对象可以正常的访问这些浏览器对象。
下面结合图2对COM对象转换为V8对象的过程进行详细描述:
1.通过COM对象的类型库(TypeLibrary),获取COM对象的属性和方法信息。
由于V8对象,在创建的时候就需要提供属性和方法的名称,因此,在创建V8对象后,需要进行初始化,来给V8对象添加COM对象本身具有的属性和方法。要获取这些属性和方法,需要通过COM的类型库来获取。对于COM对象,一般会提供类型库,可以通过类型库获取这些信息。
通过COM对象的GetTypeInfo,可以查询到COM对象的类型库接口(ITypeInfo),然后通过类型库,可以查询到COM对象的所有方法和属性名称。
以下是一种典型的实现方法:
(1)获取到类型库的数量;
(2)通过一个循环,获取到每一个类型库;
(3)获得类型库后,通过循环,获取当前类型库的每一个函数的描述信息;
(4)获取每一个函数的名称,类型(属性或者方法)。
2.创建V8对象,并将COM对象的属性映射为V8对象的属性。
在创建V8对象的时候,需要提供一个Accessor。在V8中,Accessor是一个接口,包含Get和Set方法。其中,Get方法用于获取对象的属性,Set方法用于设置对象的属性。
下面是创建V8对象并将COM对象的属性映射为V8对象的属性的具体实现方法:
(1)编写一个类(class)并实现Accessor接口,然后生成该类的实例;
(2)创建V8对象,并把生成的Accessor实例作为参数传递给V8。
对应的代码如下:


在这里,我们创建了一个V8对象。需要注意的是,在创建对象的时候,我们传入了一个Accessor参数,这个参数,是一个Accessor对象。
Accessor是一个接口,需要实现这个接口,才可以创建一个V8对象。Accessor的作用就是告诉V8,创建了一个对象,并且可以通过Accessor的Get/Set方法,来获取或者写入一个对象的属性。当读取一个JavaScript对象属性的时候,V8将会调用Accessor的Get方法,而写入一个对象的时候,将会调用Set方法。
(3)将COM对象的属性名称添加到生成的V8的对象里面。可以通过下面的代码实现:
const char*propertyName="property1";
value->SetValue(propertyName,V8_ACCESS_CONTROL_DEFAULT,V8_PROPERTY_ATTRIBUTE_NONE);
通过上述方法,就可以在JavaScript里面访问property1这个属性了。例如,当我们来读这个属性的时候,obj1.property1,将会调用Accessor的Get方法。
3.将COM对象的方法映射到V8对象的方法。
对于一个对象,有时也会具有一些方法,因此需要给该V8对象增加方法,具体需要实现如下:
(1)编写一个类(class)并实现Handler接口,然后创建该类的实例。Handler是V8定义的一个接口。
(2)创建V8对象或使用已有的V8对象,给该V8对象添加方法,并把实现的Handler对象的实例作为参数传递给该V8对象。
对应的代码如下:

在这里,我们给这个对象增加了一个fun1这样的方法。
Handler是一个接口,我们需要实现这个接口才可以创建一个V8对象的方法。Handler的定义如下:

handler的作用,就是通过Execute来执行一个COM对象的方法。Execute的参数里面,包含了方法名字(name),参数(arguments)以及返回值(retval)。当我们在JavaScript里面,调用一个对象的方法的时候,V8就会把这个方法的名字,参数传递给Handler的Execute方法。此时我们就可以在自己的代码中处理相应的事情了。
4.将V8对象和COM对象关联起来。
当V8引擎通过Accessor或者Handler来访问对象的属性或方法的时候,我们需要通过Accessor或者Handler对象,找到对应的COM对象,并且将相应的参数传递给COM对象,在COM对象执行完相应的方法后,将COM对象的返回值,返回给V8引擎。
这时候,我们可以在实现Accessor或者Handler接口的时候,将COM对象的引用,作为Accessor或者Handler对象的成员保存。
下面是一种典型的实现了COM对象转换为V8对象的例子:
编写一个类(class),并且实现了Access和Handler接口,然后将COM的对象作为这个类的成员变量保存。

CMyV8Object这个类,同时实现了Accessor和Handler,并且将COM对象作为成员变量保存(m_spObject)。当然,也可以使用不同的类来实现Accessor和Handler。
Execute方法的实现如下:
(1)使用循环,将参数从V8类型转换为COM类型。
(2)调用COM对象相应的方法,并将转换后的参数,传递给COM对象。
(3)将返回值转换为V8类型,并返回给调用者。
对应的代码如下:

Set/Get方法的实现如下:
(1)直接根据属性名称,可以获取/设置COM对象的属性。
(2)对于Get方法,需要将COM对象的属性值转换为V8类型,并返回给调用者;同样,对于Set方法,则需要将V8参数转换为COM类型,并设置给COM对象。
对应的代码如下:

在COM对象里面,也经常会使用一些外部对象,当然,这些外部对象也都需要满足COM的规范。因此,要让V8完整支持COM对象,那么也需要将V8的对象,转换为COM对象,以便COM对象里面使用浏览器的内部对象。
对于浏览器内部对象,要转换为一个COM对象,通常需要实现IDispatch接口(IUnknown接口是一个通用接口,按照常规方式实现即可)。最常用的实现方式,就是编写一个类,继承并实现IDispatch接口。
IDispatch接口是COM定义的一个接口,主要用于给对象提供脚本程序访问的能力。COM通过这个接口,可以告诉调用者,COM对象有哪些方法和属性,这些属性,方法有哪些参数,这些参数的类型等等信息。同时,该接口还负责具体的属性的读取或者写入,以及具体每一个方法的执行。
IDispatch接口一共有四个方法,定义分别如下:

其中两个是类型库相关的方法GetTypeInfoCount和GetTypeInfo,前面将COM对象转换为V8对象的时候已经使用了这两个方法。对于用于转换V8对象的COM对象来说,一般不需要实现这两个方法,只需要简单返回一个错误码即可(E_NOTIMPL)。而其它两个方法GetIDsOfNames和Invoke则必须实现,否则就无法完成V8对象到COM对象的转换。因为这两个方法负责对象具体功能的实现。
下面结合图3将详细描述V8对象转换为COM对象的过程:
通常为了实现一个接口,就是编写一个类(Class),然后让这个类继承需要实现的接口(例如IDispatch)。具体需要完成以下几步:
1.初始化过程,将V8对象的每一个属性或方法映射为一个唯一的ID。
由于V8对象,都是通过名字来使用属性和方法的,而对于COM对象,则需要通过ID来调用。因此,我们需要给V8对象的每一个属性或者方法,来分配一个唯一的ID。首先,获取V8对象所有的属性和方法的名称。V8对象提供了一个方法,可以获取到自身所有的属性和方法的名称(key)。在获取到所有的属性和方法的名称(key)之后,可以按照一定的顺序,给它们分配不同的ID,并且把对应关系记住,例如可以使用字典来记住这个对应关系。具体可以参照下面的方式进行:
(1)把V8对象作为类的成员变量保存;
(2)给这个类添加两个成员,分别是名称到ID对应关系的字典(std::map<CString,int>m_mapNameID;)以及ID到名称对应关系的字典(std::map<int,CString>m_mapIDName;);
(3)通过V8对象,获得V8对象字典中所有的属性和方法的名称(key);
(4)通过一个循环,给这些属性和方法的名称(key)分配不同的ID;
(5)把属性和方法的名称(key)和ID的对应关系,记录在字典(m_mapNameID,m_mapIDName)中保存起来。
这样在初始化的时候,记住了V8对象的各种信息以及ID和V8对象属性/方法名称的对应关系,方便后面的步骤中使用。
字典是一种可以快速查询关联对象的容器,当然也可以使用一些其它方法,例如数组等等来记住这些名称和ID的关系。
2.实现IDispatch接口,从而实现COM对象调用到V8对象调用的转换。
方法GetTypeInfoCount:用于获取COM对象类型库(TypeInfo)的数量。在一般情况下,我们可以不实现这个方法,仅仅返回一个方法没有实现的错误(E_NOTIMPL)即可。
方法GetTypeInfo:用于获取某一个类型库(TypeInfo)。同上,我们也可以不实现这个方法,仅仅是返回错误即可。
方法GetIDsOfNames:用于获取某一个或者多个方法或者属性名称的ID。要实现这个方法,就需要使用前面用于存储V8对象和ID关系的字典(m_mapNameID)。通过查询名称和ID对应的字典,可以返回每一个名称对应的ID。
方法Invoke:用于获取/设置对象属性,或者调用具体的方法。这个就是V8对象转换为COM对象最核心的部分。根据Invoke传入参数的不同,可以知道调用者是想获取属性,设置属性还是调用具体的方法。然后,还需要把COM的数据类型转换为V8的数据类型,并调用V8对象相关的方法,来获取属性,设置属性或者执行相应的方法调用。最后,还需要将V8对象的属性值,或者方法 返回值,经过转换(V8类型数据转换为COM类型数据)返回给COM的调用者。下面是具体的步骤:
(1)通过前面保存的id以及保存的属性和方法的名称(key)和id的对应关系如m_mapIDName,查找到对应的key。
(2)将所有的COM类型的参数,转换为V8类型的参数。不同的方法参数数量可能不同,因此需要通过循环来进行转换。
(3)根据不同的调用类型如属性或者方法,执行V8对象的不同的方法,例如ExecuteFunction或者GetValue/SetValue。
首先,根据wFlags参数,来判断读取/写入属性或者调用方法,来调用V8对象不同的方法。例如:
a)DISPATCH_METHOD:表示调用具体方法,我们需要让V8对象调用它自身的方法,并获得返回值,在这里,需要调用V8对象的ExecuteFunction方法来执行具体的方法。
b)DISPATCH_PROPERTYGET:表示获取某一个属性,则获取V8对象的属性;此时,需要调用V8对象的GetValue方法来获取具体的属性。
c)DISPATCH_PROPERTYPUT:表示设置某一个属性,则设置V8对象的属性。此时,需要调用V8对象的SetValue方法来设置具体的属性。
(4)将具体的方法或者属性的返回值,转换为COM类型,并进行返回。
通过上述方法,我们实现了V8类型和COM类型的相互转换。通过这种改造,就可以让Chrome浏览器正常支持包括COM对象在内的COM类型组件了,从而实现了对Chrome浏览器网站的兼容。
以上仅是本发明的具体应用范例,对本发明的保护范围不构成任何限制。凡采用等同变换或者等效替换而形成的技术方案,均落在本发明权利保护范围之内。

让CHROME浏览器支持COM类型组件的方法.pdf_第1页
第1页 / 共17页
让CHROME浏览器支持COM类型组件的方法.pdf_第2页
第2页 / 共17页
让CHROME浏览器支持COM类型组件的方法.pdf_第3页
第3页 / 共17页
点击查看更多>>
资源描述

《让CHROME浏览器支持COM类型组件的方法.pdf》由会员分享,可在线阅读,更多相关《让CHROME浏览器支持COM类型组件的方法.pdf(17页珍藏版)》请在专利查询网上搜索。

1、(10)申请公布号 CN 103530116 A (43)申请公布日 2014.01.22 C N 1 0 3 5 3 0 1 1 6 A (21)申请号 201310459592.9 (22)申请日 2013.09.29 G06F 9/44(2006.01) (71)申请人北京我知科技有限公司 地址 100123 北京市朝阳区朝阳路71号锐 城国际1015房间 (72)发明人魏拾俊 (74)专利代理机构北京金恒联合知识产权代理 事务所 11324 代理人吴云华 (54) 发明名称 让Chrome浏览器支持COM类型组件的方法 (57) 摘要 本发明公开了一种让Chrome浏览器支持COM 类。

2、型组件的方法,通过改造Chrome浏览器的V8引 擎,使V8和COM的数据类型,尤其是对象,可以相 互转换,让V8引擎可以支持COM对象,从而实现 了对Chrome浏览器网站的兼容。本发明的方法简 单、可行,不需要网站开发人员做任何改动,节省 了高昂的开发费用,也不需要用户去手工选择兼 容模式,提高了用户体验。 (51)Int.Cl. 权利要求书2页 说明书12页 附图2页 (19)中华人民共和国国家知识产权局 (12)发明专利申请 权利要求书2页 说明书12页 附图2页 (10)申请公布号 CN 103530116 A CN 103530116 A 1/2页 2 1.一种让Chrome浏览器。

3、支持COM类型组件的方法,包括: 将Chrome浏览器的V8基本数据类型与IE浏览器的COM基本数据类型进行相互转换; 将IE浏览器的COM对象转换为Chrome浏览器的V8对象; 将Chrome浏览器的V8对象转换为IE浏览器的COM对象。 2.根据权利要求1的方法,其中,COM对象转换为V8对象的步骤包括: 通过COM对象的类型库,获取COM对象的属性和方法信息; 创建V8对象,并将COM对象的属性映射为V8对象的属性; 将COM对象的方法映射到V8对象的方法; 将V8对象和COM对象关联起来。 3.根据权利要求2的方法,其中,创建V8对象并将COM对象的属性映射为V8对象的属 性的步骤包。

4、括: 编写一个类并实现Accessor接口,然后生成该类的实例; 创建V8对象,并把生成的Accessor实例作为参数传递给V8; 将COM对象的属性名称添加到生成的V8的对象里面。 4.根据权利要求3的方法,其中,Accessor接口包含用于获取对象的属性的Get方法 和用于设置对象的属性的Set方法,其中,Set或Get方法的实现步骤包括: 直接根据属性名称,获取或设置COM对象的属性; 对于Get方法,将COM对象的属性值转换为V8类型,并返回给调用者;对于Set方法, 将V8参数转换为COM类型,并设置给COM对象。 5.根据权利要求2的方法,其中,将COM对象的方法映射到V8对象的方。

5、法的步骤包括: 编写一个类并实现Handler接口,然后创建该类的实例; 创建V8对象或使用已有的V8对象,给该V8对象添加方法,并把实现的Handler对象 的实例作为参数传递给该V8对象。 6.根据权利要求5的方法,其中,handler接口通过Execute方法来执行COM对象的方 法,Execute方法的实现步骤包括: 使用循环,将参数从V8类型转换为COM类型; 调用COM对象相应的方法,并将转换后的参数,传递给COM对象; 将返回值转换为V8类型,并返回给调用者。 7.根据权利要求2的方法,其中,将V8对象和COM对象关联起来的步骤包括: 当V8引擎通过Accessor或Handle。

6、r接口访问对象的属性或方法时,通过Accessor或 Handler对象,找到对应的COM对象,并将相应的参数传给COM对象,在COM对象执行完相应 的方法后,将COM对象的返回值,返回给V8引擎。 8.根据权利要求1的方法,其中,V8对象转换为COM对象的步骤包括: 初始化过程,将V8对象的每个属性或方法映射为一个唯一的ID; 实现IDispatch接口,以实现COM对象调用到V8对象调用的转换。 9.根据权利要求8的方法,其中,初始化过程包括: 获取V8对象所有的属性和方法的名称; 按照一定的顺序,给每个属性和方法的名称分配一个不同的ID; 记住每个属性和方法的名称与它的ID之间的对应关系。

7、。 权 利 要 求 书CN 103530116 A 2/2页 3 10.根据权利要求8或9的方法,其中,实现IDispatch接口的步骤包括:实现方法 GetIDsOfNames和方法Invoke,其中,方法Invoke的实现包括: 通过ID,查找到对应的属性和方法的名称; 将所有的COM类型的参数,转换为V8类型的参数; 根据不同的调用类型-方法或属性,执行V8对象的不同的方法; 将具体的方法或属性的返回值,转换为COM类型,并进行返回。 权 利 要 求 书CN 103530116 A 1/12页 4 让 Chrome 浏览器支持 COM 类型组件的方法 技术领域 0001 本发明涉及一种让。

8、Chrome浏览器支持COM类型组件的方法,属于计算机网络技术 领域。 背景技术 0002 浏览器插件是一种扩展浏览器功能的方式,目前被广泛应用于一些网银,行业网 站以及企业内部办公环境下面的网站。浏览器插件机制主要有两种,一种是IE支持的COM 方式,这种方式非常简单,在Windows环境下获得了广泛的应用;另外一种是NPAPI方式,主 要被Chrome,Firefox等浏览器支持,但这种方式开发难度很高,目前仅仅被一些大公司支 持,例如Flash插件等。 0003 Chrome以及其它Chrome核心的浏览器当前已经非常流行了,如Chrome,360安全 浏览器,百度浏览器,猎豹浏览器等等。

9、。但是,Chrome浏览器以及其它Chrome核心的浏览 器并不支持COM对象,这导致很多网站无法正常访问,例如很多网银无法登录,一些企业的 内部网站也无法正常使用。 0004 对于上述问题,目前主要通过以下两种方式解决: 0005 一是网站开发人员针对不同的浏览器,开发不同的网站或者插件。例如:针对IE, 开发COM类型的插件;而针对Chrome浏览器,则开发NPAPI类型的插件。然而NPAPI插件 相关资料很少,开发难度非常高。相反COM插件非常容易开发。因此,现在网站大部分都是 先开发COM类型的插件,甚至很多网站都只有COM类型的插件,如火车票预定12306网站, 至今仍然仅支持IE浏。

10、览器。由此可见,即便是这样的大公司,想要开发NPAPI类型的插件, 难度也非常高。 0006 另一种是浏览器提供IE兼容模式。例如:360安全浏览器提供了兼容模式,实际 上就是利用IE浏览器来打开这些网站。但是,这种方式仍然对用户要求很高,因为必须要 让用户来手工选择使用兼容模式,而且用户也未必知道去选择兼容模式,这会导致浏览器 的用户使用体验不好。 0007 因此,如何让Chrome浏览器支持COM类型组件,是网站开发中亟待解决的技术问 题之一。 发明内容 0008 本发明的目的是提供了一种让Chrome浏览器支持COM类型组件的方法,该方法既 不需要网站开发人员做任何改动,节省了高昂的开发。

11、费用,也不需要用户去手工选择兼容 模式,提高了用户体验。 0009 本发明提供的让Chrome浏览器支持COM类型组件的方法,包括: 0010 将Chrome浏览器的V8基本数据类型与IE浏览器的COM基本数据类型进行相互 转换; 0011 将IE浏览器的COM对象转换为Chrome浏览器的V8对象; 说 明 书CN 103530116 A 2/12页 5 0012 将Chrome浏览器的V8对象转换为IE浏览器的COM对象。 0013 根据本发明的一个具体但非限制性的实施方案,其中,COM对象转换为V8对象的 步骤包括: 0014 通过COM对象的类型库,获取COM对象的属性和方法信息; 0。

12、015 创建V8对象,并将COM对象的属性映射为V8对象的属性; 0016 将COM对象的方法映射到V8对象的方法; 0017 将V8对象和COM对象关联起来。 0018 根据本发明的一个具体但非限制性的实施方案,其中,创建V8对象并将COM对象 的属性映射为V8对象的属性的步骤包括: 0019 编写一个类并实现Accessor接口,然后生成该类的实例; 0020 创建V8对象,并把生成的Accessor实例作为参数传递给V8; 0021 将COM对象的属性名称添加到生成的V8的对象里面。 0022 根据本发明的一个具体但非限制性的实施方案,其中,Accessor接口包含用于获 取对象的属性的。

13、Get方法和用于设置对象的属性的Set方法,其中,Set或Get方法的实现 步骤包括: 0023 直接根据属性名称,获取或设置COM对象的属性; 0024 对于Get方法,将COM对象的属性值转换为V8类型,并返回给调用者;对于Set方 法,将V8参数转换为COM类型,并设置给COM对象。 0025 根据本发明的一个具体但非限制性的实施方案,其中,将COM对象的方法映射到 V8对象的方法的步骤包括: 0026 编写一个类并实现Handler接口,然后创建该类的实例; 0027 创建V8对象或使用已有的V8对象,给该V8对象添加方法,并把实现的Handler 对象的实例作为参数传递给该V8对象。。

14、 0028 根据本发明的一个具体但非限制性的实施方案,其中,handler接口通过Execute 方法来执行COM对象的方法,Execute方法的实现步骤包括: 0029 使用循环,将参数从V8类型转换为COM类型; 0030 调用COM对象相应的方法,并将转换后的参数,传递给COM对象; 0031 将返回值转换为V8类型,并返回给调用者。 0032 根据本发明的一个具体但非限制性的实施方案,其中,将V8对象和COM对象关联 起来的步骤包括: 0033 当V8引擎通过Accessor或Handler接口访问对象的属性或方法时,通过 Accessor或Handler对象,找到对应的COM对象,并。

15、将相应的参数传给COM对象,在COM对 象执行完相应的方法后,将COM对象的返回值,返回给V8引擎。 0034 根据本发明的一个具体但非限制性的实施方案,其中,V8对象转换为COM对象的 步骤包括: 0035 初始化过程,将V8对象的每个属性或方法映射为一个唯一的ID; 0036 实现IDispatch接口,以实现COM对象调用到V8对象调用的转换。 0037 根据本发明的一个具体但非限制性的实施方案,其中,初始化过程包括: 0038 获取V8对象所有的属性和方法的名称; 说 明 书CN 103530116 A 3/12页 6 0039 按照一定的顺序,给每个属性和方法的名称分配一个不同的ID。

16、; 0040 记住每个属性和方法的名称与它的ID之间的对应关系。 0041 根据本发明的一个具体但非限制性的实施方案,其中,实现IDispatch接口的步 骤包括:实现方法GetIDsOfNames和方法Invoke,其中,方法Invoke的实现包括: 0042 通过ID,查找到对应的属性和方法的名称; 0043 将所有的COM类型的参数,转换为V8类型的参数; 0044 根据不同的调用类型-方法或属性,执行V8对象的不同的方法; 0045 将具体的方法或属性的返回值,转换为COM类型,并进行返回。 0046 本发明有益效果主要体现在: 0047 本发明通过改造Chrome浏览器和其它Chro。

17、me核心的浏览器的V8引擎,使V8和 COM的数据类型,尤其是对象,可以相互转换,让V8引擎可以支持COM对象,从而实现了对 Chrome浏览器网站的兼容。本发明的方法简单、易行,不需要网站开发人员做任何改动,从 而节省了高昂的开发费用,也不需要用户去手工选择兼容模式,提高了用户体验。 附图说明 0048 图1是本发明的让Chrome浏览器支持COM类型组件的方法示意图。 0049 图2是COM对象转换为V8对象的方法流程图。 0050 图3是V8对象转换为COM对象的方法流程图。 具体实施方式 0051 下面结合附图详细说明本发明的具体实施方式。 0052 首先我们介绍一下背景知识。网页里面。

18、的插件一般采用C+编写,并且许要提 供JavaScript访问的能力。不同的浏览器,采用的JavaScript运行环境不同,所以对插 件的处理方式也不一样。对于IE浏览器,可以使用COM来扩展浏览器的功能。IE使用的 JavaScript解析器内置了COM对象访问的功能,实际上微软IE本身就大量使用了COM对 象,因此COM对象在IE里面的使用非常方便。而对于Chrome和其它Chrome核心的浏览器, 则使用了V8引擎。V8是Google提供的一个JavaScript运行环境,采用C+编写。V8同 样提供了扩展功能,可以利用C+等语言来进行扩展。要扩展浏览器功能,实际上就是让浏 览器加载外部。

19、的一些组件,例如COM或者NPAPI编写的插件,然后通过网页中的JavaScript 脚本,来访问或者使用这些插件。这些插件,在JavaScript里面,都是作为对象存在,和浏 览器内置的一些对象相同。 0053 因此,要想让JavaScript可以访问COM对象,让Chrome浏览器支持COM类型组件, 就需要实现Chrome浏览器的V8数据类型与IE浏览器的COM数据类型之间的相互转换。 0054 图1是本发明的让Chrome浏览器支持COM类型组件的方法示意图。我们把V8的 数据类型(JavaScript里面的数据类型)和COM的数据类型,分为基本数据类型和对象两 种。其中,基本数据类型。

20、包括整数、浮点数、字符串、日期以及数组等数据类型。这些任意的 数据类型,在V8里面,使用Value来表示;在COM里面,使用VARIANT来表示。因此,我们需 要将V8的Value和COM的VARIANT进行转换。 0055 对于基本数据类型如整数、浮点数、字符串、日期以及数组等,转换比较容易。如V8 说 明 书CN 103530116 A 4/12页 7 类型转换为COM类型(Value-VARIANT),由于V8数据类型比较少,可以采取一一对应的方 式找到相应的COM的数据类型。例如,V8里面的整数类型,在程序里面,我们可以获得V8 整数类型的数值,然后根据这个整数,生成一个新的COM整数。

21、类型即可。对于浮点数,也可 以按照这种方式进行转换。对于字符串,则需要将C语言的字符串转换为Windows的BSTR 类型字符串。对于日期,同样需要将C语言的日期转换为Windows的日期格式。而对于COM 类型转换为V8类型(VARIANT-Value),由于COM类型比较多,我们需要进行一些适当的转 换。例如,将64位整数转换为字符串来表示。COM里面,整数有short、long、64位整数,有 符号和无符号整数区分,对于64位整数,需要转换为字符串(JavaScript不支持);对于其 它类型的整数,需要全部转换为32位整数。对于浮点数,日期,字符串,数组等,可以转换为 V8里面相对应的。

22、类型。对于其它类型,例如指针类型,IUnknown之类的类型,则无法转换为 V8对应的类型,需要进行错误处理。 0056 而对于对象,转换则复杂得多。因为不同的对象完成的工作是不一样的,无法直接 转换,必须在程序使用到这些对象的时候,让这些对象自己去完成相应的处理才行。对象类 型的转换分为两个方面: 0057 -COM对象转换为V8对象。要让COM对象可以被V8访问,就必须将COM对象模拟 成一个V8对象。 0058 -V8对象转换为COM对象。由于COM对象在被使用的时候,很多情况下需要使用 浏览器内置的一些对象,例如document,window等对象,此时就必须将这些V8对象,转换为 C。

23、OM对象,让COM对象可以正常的访问这些浏览器对象。 0059 下面结合图2对COM对象转换为V8对象的过程进行详细描述: 0060 1.通过COM对象的类型库(T ypeLibrary),获取COM对象的属性和方法信息。 0061 由于V8对象,在创建的时候就需要提供属性和方法的名称,因此,在创建V8对象 后,需要进行初始化,来给V8对象添加COM对象本身具有的属性和方法。要获取这些属性 和方法,需要通过COM的类型库来获取。对于COM对象,一般会提供类型库,可以通过类型 库获取这些信息。 0062 通过COM对象的GetTypeInfo,可以查询到COM对象的类型库接口(ITypeInfo。

24、), 然后通过类型库,可以查询到COM对象的所有方法和属性名称。 0063 以下是一种典型的实现方法: 0064 (1)获取到类型库的数量; 0065 (2)通过一个循环,获取到每一个类型库; 0066 (3)获得类型库后,通过循环,获取当前类型库的每一个函数的描述信息; 0067 (4)获取每一个函数的名称,类型(属性或者方法)。 0068 2.创建V8对象,并将COM对象的属性映射为V8对象的属性。 0069 在创建V8对象的时候,需要提供一个Accessor。在V8中,Accessor是一个接口, 包含Get和Set方法。其中,Get方法用于获取对象的属性,Set方法用于设置对象的属性。。

25、 0070 下面是创建V8对象并将COM对象的属性映射为V8对象的属性的具体实现方法: 0071 (1)编写一个类(class)并实现Accessor接口,然后生成该类的实例; 0072 (2)创建V8对象,并把生成的Accessor实例作为参数传递给V8。 0073 对应的代码如下: 说 明 书CN 103530116 A 5/12页 8 0074 0075 0076 在这里,我们创建了一个V8对象。需要注意的是,在创建对象的时候,我们传入了 一个Accessor参数,这个参数,是一个Accessor对象。 0077 Accessor是一个接口,需要实现这个接口,才可以创建一个V8对象。Ac。

26、cessor的 作用就是告诉V8,创建了一个对象,并且可以通过Accessor的Get/Set方法,来获取或者 写入一个对象的属性。当读取一个JavaScript对象属性的时候,V8将会调用Accessor的 Get方法,而写入一个对象的时候,将会调用Set方法。 0078 (3)将COM对象的属性名称添加到生成的V8的对象里面。可以通过下面的代码实 现: 0079 const char*propertyName=“property1“; 0080 value-SetValue(propertyName,V8_ACCESS_CONTROL_DEFAULT,V8_PROPERTY_ ATTRIB。

27、UTE_NONE); 0081 通过上述方法,就可以在JavaScript里面访问property1这个属性了。例如,当 我们来读这个属性的时候,obj1.property1,将会调用Accessor的Get方法。 0082 3.将COM对象的方法映射到V8对象的方法。 0083 对于一个对象,有时也会具有一些方法,因此需要给该V8对象增加方法,具体需 要实现如下: 0084 (1)编写一个类(class)并实现Handler接口,然后创建该类的实例。Handler是 V8定义的一个接口。 说 明 书CN 103530116 A 6/12页 9 0085 (2)创建V8对象或使用已有的V8对象。

28、,给该V8对象添加方法,并把实现的 Handler对象的实例作为参数传递给该V8对象。 0086 对应的代码如下: 0087 0088 在这里,我们给这个对象增加了一个fun1这样的方法。 0089 Handler是一个接口,我们需要实现这个接口才可以创建一个V8对象的方法。 Handler的定义如下: 0090 0091 handler的作用,就是通过Execute来执行一个COM对象的方法。Execute的 参数里面,包含了方法名字(name),参数(arguments)以及返回值(retval)。当我们在 JavaScript里面,调用一个对象的方法的时候,V8就会把这个方法的名字,参数。

29、传递给 Handler的Execute方法。此时我们就可以在自己的代码中处理相应的事情了。 0092 4.将V8对象和COM对象关联起来。 0093 当V8引擎通过Accessor或者Handler来访问对象的属性或方法的时候,我们需 要通过Accessor或者Handler对象,找到对应的COM对象,并且将相应的参数传递给COM 对象,在COM对象执行完相应的方法后,将COM对象的返回值,返回给V8引擎。 0094 这时候,我们可以在实现Accessor或者Handler接口的时候,将COM对象的引用, 作为Accessor或者Handler对象的成员保存。 0095 下面是一种典型的实现了。

30、COM对象转换为V8对象的例子: 0096 编写一个类(class),并且实现了Access和Handler接口,然后将COM的对象作为 这个类的成员变量保存。 0097 说 明 书CN 103530116 A 7/12页 10 0098 CMyV8Object这个类,同时实现了Accessor和Handler,并且将COM对象作为成员 变量保存(m_spObject)。当然,也可以使用不同的类来实现Accessor和Handler。 0099 Execute方法的实现如下: 0100 (1)使用循环,将参数从V8类型转换为COM类型。 0101 (2)调用COM对象相应的方法,并将转换后的参。

31、数,传递给COM对象。 0102 (3)将返回值转换为V8类型,并返回给调用者。 0103 对应的代码如下: 0104 说 明 书CN 103530116 A 10 8/12页 11 0105 Set/Get方法的实现如下: 0106 (1)直接根据属性名称,可以获取/设置COM对象的属性。 0107 (2)对于Get方法,需要将COM对象的属性值转换为V8类型,并返回给调用者;同 样,对于Set方法,则需要将V8参数转换为COM类型,并设置给COM对象。 0108 对应的代码如下: 0109 说 明 书CN 103530116 A 11 9/12页 12 0110 在COM对象里面,也经常会。

32、使用一些外部对象,当然,这些外部对象也都需要满足 COM的规范。因此,要让V8完整支持COM对象,那么也需要将V8的对象,转换为COM对象, 说 明 书CN 103530116 A 12 10/12页 13 以便COM对象里面使用浏览器的内部对象。 0111 对于浏览器内部对象,要转换为一个COM对象,通常需要实现IDispatch接口 (IUnknown接口是一个通用接口,按照常规方式实现即可)。最常用的实现方式,就是编写一 个类,继承并实现IDispatch接口。 0112 IDispatch接口是COM定义的一个接口,主要用于给对象提供脚本程序访问的能 力。COM通过这个接口,可以告诉调。

33、用者,COM对象有哪些方法和属性,这些属性,方法有哪 些参数,这些参数的类型等等信息。同时,该接口还负责具体的属性的读取或者写入,以及 具体每一个方法的执行。 0113 IDispatch接口一共有四个方法,定义分别如下: 0114 0115 其中两个是类型库相关的方法GetTypeInfoCount和GetTypeInfo,前面将COM对 象转换为V8对象的时候已经使用了这两个方法。对于用于转换V8对象的COM对象来说, 一般不需要实现这两个方法,只需要简单返回一个错误码即可(E_NOTIMPL)。而其它两个方 法GetIDsOfNames和Invoke则必须实现,否则就无法完成V8对象到C。

34、OM对象的转换。因 为这两个方法负责对象具体功能的实现。 0116 下面结合图3将详细描述V8对象转换为COM对象的过程: 0117 通常为了实现一个接口,就是编写一个类(Class),然后让这个类继承需要实现的 接口(例如IDispatch)。具体需要完成以下几步: 0118 1.初始化过程,将V8对象的每一个属性或方法映射为一个唯一的ID。 0119 由于V8对象,都是通过名字来使用属性和方法的,而对于COM对象,则需要通过ID 来调用。因此,我们需要给V8对象的每一个属性或者方法,来分配一个唯一的ID。首先,获 取V8对象所有的属性和方法的名称。V8对象提供了一个方法,可以获取到自身所有。

35、的属 性和方法的名称(key)。在获取到所有的属性和方法的名称(key)之后,可以按照一定的顺 序,给它们分配不同的ID,并且把对应关系记住,例如可以使用字典来记住这个对应关系。 具体可以参照下面的方式进行: 说 明 书CN 103530116 A 13 11/12页 14 0120 (1)把V8对象作为类的成员变量保存; 0121 (2)给这个类添加两个成员,分别是名称到ID对应关系的字典 (std:mapm_mapNameID;)以及ID到名称对应关系的字典 (std:mapm_mapIDName;); 0122 (3)通过V8对象,获得V8对象字典中所有的属性和方法的名称(key); 0。

36、123 (4)通过一个循环,给这些属性和方法的名称(key)分配不同的ID; 0124 (5)把属性和方法的名称(key)和ID的对应关系,记录在字典(m_mapNameID,m_ mapIDName)中保存起来。 0125 这样在初始化的时候,记住了V8对象的各种信息以及ID和V8对象属性/方法名 称的对应关系,方便后面的步骤中使用。 0126 字典是一种可以快速查询关联对象的容器,当然也可以使用一些其它方法,例如 数组等等来记住这些名称和ID的关系。 0127 2.实现IDispatch接口,从而实现COM对象调用到V8对象调用的转换。 0128 方法GetTypeInfoCount:用于。

37、获取COM对象类型库(TypeInfo)的数量。在一般 情况下,我们可以不实现这个方法,仅仅返回一个方法没有实现的错误(E_NOTIMPL)即可。 0129 方法GetTypeInfo:用于获取某一个类型库(TypeInfo)。同上,我们也可以不实现 这个方法,仅仅是返回错误即可。 0130 方法GetIDsOfNames:用于获取某一个或者多个方法或者属性名称的ID。要实现 这个方法,就需要使用前面用于存储V8对象和ID关系的字典(m_mapNameID)。通过查询名 称和ID对应的字典,可以返回每一个名称对应的ID。 0131 方法Invoke:用于获取/设置对象属性,或者调用具体的方法。。

38、这个就是V8对象 转换为COM对象最核心的部分。根据Invoke传入参数的不同,可以知道调用者是想获取属 性,设置属性还是调用具体的方法。然后,还需要把COM的数据类型转换为V8的数据类型, 并调用V8对象相关的方法,来获取属性,设置属性或者执行相应的方法调用。最后,还需要 将V8对象的属性值,或者方法返回值,经过转换(V8类型数据转换为COM类型数据)返回给 COM的调用者。下面是具体的步骤: 0132 (1)通过前面保存的id以及保存的属性和方法的名称(key)和id的对应关系如 m_mapIDName,查找到对应的key。 0133 (2)将所有的COM类型的参数,转换为V8类型的参数。。

39、不同的方法参数数量可能 不同,因此需要通过循环来进行转换。 0134 (3)根据不同的调用类型如属性或者方法,执行V8对象的不同的方法,例如 ExecuteFunction或者GetValue/SetValue。 0135 首先,根据wFlags参数,来判断读取/写入属性或者调用方法,来调用V8对象不 同的方法。例如: 0136 a)DISPATCH_METHOD:表示调用具体方法,我们需要让V8对象调用它自身的方法, 并获得返回值,在这里,需要调用V8对象的ExecuteFunction方法来执行具体的方法。 0137 b)DISPATCH_PROPERTYGET:表示获取某一个属性,则获取。

40、V8对象的属性;此时,需 要调用V8对象的GetValue方法来获取具体的属性。 0138 c)DISPATCH_PROPERTYPUT:表示设置某一个属性,则设置V8对象的属性。此时,需 说 明 书CN 103530116 A 14 12/12页 15 要调用V8对象的SetValue方法来设置具体的属性。 0139 (4)将具体的方法或者属性的返回值,转换为COM类型,并进行返回。 0140 通过上述方法,我们实现了V8类型和COM类型的相互转换。通过这种改造,就可 以让Chrome浏览器正常支持包括COM对象在内的COM类型组件了,从而实现了对Chrome 浏览器网站的兼容。 0141 以上仅是本发明的具体应用范例,对本发明的保护范围不构成任何限制。凡采用 等同变换或者等效替换而形成的技术方案,均落在本发明权利保护范围之内。 说 明 书CN 103530116 A 15 1/2页 16 图1 图2 说 明 书 附 图CN 103530116 A 16 2/2页 17 图3 说 明 书 附 图CN 103530116 A 17 。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1