浏览器内ActiveX嵌套Flash正常交互的方法与流程

文档序号:15444932发布日期:2018-09-14 23:14阅读:587来源:国知局

本发明涉及浏览器内activex嵌套flash正常交互的方法。



背景技术:

flash动画主要由矢量图形组成,矢量图形具有储存容量小,并且在缩放时不会失真的优点。利用flash可以方便地做出炫丽的画面效果,而flash本身具有强大的交互优势,通过as脚本可以随心所欲的对其进行编程,正因为以上优点,flash已经越来越多地作为其它软件的ui(界面)来使用,通过flash来作为程序ui,不仅可以使得软件获得非常漂亮的画面效果,另外因为flash的独立性,可以将程序的界面部分与软件的开发分离开来,使得程序的开发更加快捷方便。在对画面要求比较高的三维游戏中,已经越来越多地使用flash作为ui,而网页游戏则直接使用flash开发而成。通过相关接口和特定的方式,flash中使用as3.0编写的函数可以便捷的回调外部调用程序中的函数,而外部软件可以直接通过callfunction调用flash中使用as3.0开发的函数。

但是,当外部调用程序本身就是activex控件,嵌套在浏览器中使用时,外部调用程序将无法通过callfunction接口来调用同样作为控件的flash的函数接口,如果调用将造成异常导致程序崩溃。这时由于浏览器为了浏览器安全而禁止了第三方控件的通信,直接屏蔽了callfunction函数的调用。



技术实现要素:

本发明方法所解决的技术问题在于使用一种程序容器的方式,保证在浏览器中使用activex控件,而该activex控件中又嵌套使用flash时,能够保证flash的callfuntion函数能够正常使用。

本发明具体包括如下步骤:

步骤1,使用visualstudio创建一个visualc++项目,项目类型为mfcactivex控件,代号为模块a,作为容器,根据应用的需要设置相应的接口和接口参数,统称为接口c,供浏览器调用(如javascript),参循mfc(微软基础类库,microsoftfoundationclasses,简称mfc)标准方法来进行接口的添加和设置,但在这里仅仅创建出接口和相应该接口需要的参数,而实际上不写入任何该接口功能实现的代码。

步骤2,创建嵌有flash控件的可执行程序(该程序功能可根据自身应用需求自行设定,功能接口根据本发明规则),代号为模块b,在模块b中实现模块a的接口c相对应的响应函数,统称为函数d,函数d中实现接口c中的实际应用功能,并设定模块b的类名为:win32application;

步骤3,将模块b设定为模块a的子程序模块,模块a作为模块b的父窗口模块,模块a的窗口事件将会因为父子窗口关系自动转发给模块b(参照windows窗口标准机制);

步骤4,同步模块a的窗口大小改变到模块b;

步骤5,建立接口c和函数d的交互连接,接口c包括两个类型:方法和回调,浏览器(如javascript)调用接口c时,能直接响应函数d(方法)或者函数d将结果传递给接口c(回调),继而返回给浏览器(如javascript);

步骤6,模块a销毁时,发送wm_close消息(即关闭消息)给模块b,作关闭同步处理。wm_close消息为windows的标准窗口消息,当任何窗口接收到该消息时,窗口即为执行销毁并关闭窗口程序的操作。

步骤3包括:

步骤3-1,根据类名:win32application,通过findwindowapi获取模块b的窗口句柄;findwindow是win32标准接口(api),通过该接口,可以通过程序的类名或者程序窗口的标题获取该程序的控制句柄(handle),该步骤正是使用该api,通过模块b的类名,让模块a获取模块b的控制句柄,通过该句柄,实现模块a对模块b的控制。

步骤3-2,将模块b的父窗口设置为模块a,模块a作为模块b的父窗口模块,模块a的窗口事件将会因为父子窗口关系自动转发给模块。

步骤4包括:

步骤4-1,获取模块a的窗口尺寸;

步骤4-2,将模块b的窗口尺寸设定为步骤4-1中获得的窗口尺寸,保证模块b的窗口与模块a的窗口大小一致。

步骤5包括:

步骤5-1,在模块b中重载wm_copydata映射函数;wm_copydata是windows窗口间的一个标准消息,该消息允许一个程序向另一个程序传递数据。模块b重载了wm_copydata消息后会生成该消息的映射函数,该函数中即能够接收其它程序发送过来的wm_copydata消息并进行处理。

步骤5-2,模块a中的接口c本身不做功能的实现,当浏览器(如javascript)调用接口c时,接口c会通过sendmessage函数发送一个wm_copydata消息给b模块,而接口中的参数都存放在copydatastruct结构体中随消息发出。sendmessage是windows的一个标准的api,用于给指定的程序发送消息。copydatastruct为一个数据结构体,其数据结构为:

dwdata:表示消息类型,使用整型,

cbdata:表示参数的长度,

lpdata:表示参数的内存地址;

步骤5-3,模块b接收wm_copydata映射函数消息的响应:接收到wm_copydata消息后,解析消息中传递过来的copydatastruct数据,通过数据中的dwdata(整型)来判断消息类型,根据类型来确定需要响应的函数d,而传递过来的参数指针地址都存放在内存地址lpdata中,可以直接转换为传递过来时的数据类型并进行使用。

步骤5中所述建立接口c和函数d的交互连接,浏览器调用接口c时,能直接响应函数d或者函数d将结果传递给接口c,其中函数d将结果传递给接口c的过程,包括如下步骤:

步骤5-4,获取属性的请求由外部javascript发起调用接口c,接口c在执行该获取属性的方法时,使用sendmessage函数向模块b发送请求wm_copydata消息,消息中的参数为copydatastruct结构体数据,数据中的dwdata消息类型为自行定义的获取属性的消息,模块b在收到该消息后,执行获取属性的操作即执行函数d,获取后,模块a和模块b将通过共享内存的方法将属性值从模块b传给模块a,最终传递给外部调用的程序javascript;

步骤5-5,模块b处理如下:模块b中创建共享内存并把需要传递的值拷贝至该共享内存首地址,在拷贝完成后通知模块a,模块a再从该内存中将该值取走。

如果在浏览器中直接调用一个内嵌flash的activex控件,则activex与flash交互的callfuntion函数就会失效并崩溃,但如果在一个独立的应用程序中嵌入flash,则callfuntion不受影响,因此本发明思路就是将flash嵌入到一个独立的应用程序(代号b)中,再将该程序(b)作为子程序嵌入到activex对象(代号a)中,这样a作为标准的activex控件正常被浏览器调用,而flash又是嵌入在独立的程序(b)中,与浏览器没有任何的关联,在这种情况下,flash的callfuntion就能够正常使用了。下面要解决的事情就是打通a和b之间的关联,使得a和b使用起来就是一个程序,能够正常使用activex定义的方法以及a中接收的键盘鼠标事件并在b中响应、能过a直接获取b的属性、在a中响应b的回调。

(1)响应方法

响应的方法包括activex暴露给javascript的方法以及鼠标单击、双击、滚轮事件以及键盘事件,所有这些方法和事件都由activex程序(a)接受,a接受后不作处理,直接转发给b,b收到这些消息后作相应的程序处理

(2)获取属性

在activex对象(a)中,会有相应的获取属性的函数暴露给javascript,但a不是主体程序,并没有相应的属性,因此a在收到获取属性的调用函数后也不做处理,直接把获取属性的请求发送给b,b在收到获取属性的调用请求后,通过共享内存的方法把属性传给a

有益效果:

目前解决此类问题主要有两种方式:

(1)使用网络通信的方式,通过socket形式进行消息交互,该方式依赖于网卡以及网络环境,并且由于本身在ie中打开,极易造成消息的不稳定.

(2)使用第三方脚本的形式来传递消息,本身通过第三方脚本在ie环境中对安全的级别有要求,并且该方式在处理消息时,对双方的开发依赖都很强。而使用本发明的方式,则可以将flash的开发与调用其程序的发开发独立开来,不用关心中间的消息传递部分

另外,使用本发明的方式,不仅可以解决程序调用flash控件时造成的callfunction异常问题,同时可以将开发的程序与ie环境的关系降低,只要定义好通信的消息形式,不论容器程序(代号a)是基于ie的activex,还是基于firefox或是chrome,只要各自的消息接口一致,将不需要将主体程序开发为三个版本,而只要开发相应的容器程序即可。

附图说明

下面结合附图和具体实施方式对本发明做更进一步的具体说明,本发明的上述或其他方面的优点将会变得更加清楚。

图1为本发明中浏览器与模块a和模块b之间的关系图。

图2为浏览器与模块a及模块b之间消息传递示意图。

具体实施方式

下面结合附图及实施例对本发明做进一步说明。

如图1和图2所示,本发明公开了浏览器内activex嵌套flash正常交互的方法,具体包括如下步骤:

步骤1,使用visualstudio创建一个visualc++项目,项目类型为mfcactivex控件,代号为模块a,作为容器,根据应用的需要设置相应的接口和接口参数,统称为接口c,供浏览器调用(如javascript),参循mfc标准方法来进行接口的添加和设置,但在这里仅仅创建出接口和相应该接口需要的参数,而实际上不写入任何该接口功能实现的代码。

步骤2,创建嵌有flash控件的可执行程序(该程序功能可根据自身应用需求自行设定,功能接口根据本发法规则),代号为模块b,在模块b中实现模块a的接口c相对应的响应函数,统称为函数d,函数d中实现接口c中的实际应用功能,并设定模块b的类名为:win32application;

步骤3,将模块b设定为模块a的子程序模块,模块a作为模块b的父窗口模块,模块a的窗口事件将会因为父子窗口关系自动转发给模块b(参照windows窗口标准机制);

步骤4,同步模块a的窗口大小改变到模块b;

步骤5,建立接口c和函数d的交互连接,接口c包括两个类型:方法和回调,浏览器(如javascript)调用接口c时,能直接响应函数d(方法)或者函数d将结果传递给接口c(回调),继而返回给浏览器(如javascript);

步骤6,模块a销毁时,发送wm_close消息(即关闭消息)给模块b,作关闭同步处理。wm_close消息为windows的标准窗口消息,当任何窗口接收到该消息时,窗口即为执行销毁并关闭窗口程序的操作。

步骤3包括:

步骤3-1,根据类名:win32application,通过findwindowapi获取模块b的窗口句柄;findwindow是win32标准接口(api),通过该接口,可以通过程序的类名或者程序窗口的标题获取该程序的控制句柄(handle),该步骤正是使用该api,通过模块b的类名,让模块a获取模块b的控制句柄,通过该句柄,实现模块a对模块b的控制。

步骤3-2,将模块b的父窗口设置为模块a,模块a作为模块b的父窗口模块,模块a的窗口事件将会因为父子窗口关系自动转发给模块。

步骤4包括:

步骤4-1,获取模块a的窗口尺寸;

步骤4-2,将模块b的窗口尺寸设定为步骤4-1中获得的窗口尺寸,保证模块b的窗口与模块a的窗口大小一致。

步骤5包括:

步骤5-1,在模块b中重载wm_copydata映射函数;wm_copydata是windows窗口间的一个标准消息,该消息允许一个程序向另一个程序传递数据。模块b重载了wm_copydata消息后会生成该消息的映射函数,该函数中即可以接收其它程序发送过来的wm_copydata消息并进行处理。

步骤5-2,模块a中的接口c本身不做功能的实现,当浏览器(如javascript)调用接口c时,接口c会通过sendmessage函数发送一个wm_copydata消息给b模块,而接口中的参数都存放在copydatastruct结构体中随消息发出。sendmessage是windows的一个标准的api,用于给指定的程序发送消息。copydatastruct为一个数据结构体,其数据结构为:

dwdata:表示消息类型,使用整型,

cbdata:表示参数的长度,

lpdata:表示参数的内存地址;

步骤5-3,模块b接收wm_copydata映射函数消息的响应:接收到wm_copydata消息后,解析消息中传递过来的copydatastruct数据,通过数据中的dwdata(整型)来判断消息类型,根据类型来确定需要响应的函数d,而传递过来的参数指针地址都存放在内存地址lpdata中,可以直接转换为传递过来时的数据类型并进行使用。

步骤5-4,获取属性的请求由外部javascript发起调用接口c,接口c在执行该获取属性的方法时,使用sendmessage函数向模块b发送请求wm_copydata消息,消息中的参数为copydatastruct结构体数据,数据中的dwdata消息类型为自行定义的获取属性的消息,模块b在收到该消息后,执行获取属性的操作即执行函数d,获取后,模块a和模块b将通过共享内存的方法将属性值从模块b传给模块a,最终传递给外部调用的程序javascript;

步骤5-5,模块b处理如下:假设需要获取模块b中的名字:name

在模块b中,通过createfilemapping()函数创建一个内存映射文件对象,如果创建成功则通过mapviewoffile()函数将此文件映射对象的视图映射进地址空间,同时得到此映射视图的首址,此时就是创建了一个共享内存,并获取了该内存的地址,此时,只要将要传递的name拷贝至该地址,即需要传递的内容被放进了共享内存。

当数据已经传递至共享内存后,此时模块b需要发送通知告诉模块a,数据已经传递完毕。

模块a在收到后,只需要从共享内存里把该值取走,即完成了数据从模块b到模块a的传递,此时模块a就可以使用该数据来响应相应的操作需求。

createfilemapping是windows的一个标准api函数,为一个指定的文件创建或打开一个已命名或未命名的文件映射对象,告知系统文件映射对象需要多少物理存储器。

mapviewoffile是windows的一个标准api函数,功能是将一个文件映射对象映射到当前应用程序的地址空间。

本发明提供了浏览器内activex嵌套flash正常交互的方法,具体实现该技术方案的方法和途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以实现。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1