Flash与外部程序通信

随着时间的推移,flash开始渐渐的淡出人们的视野,现在最新版本的chrome浏览器已经默认不开启flash了,但仍有大量的厂家在使用,也有大量的flash作品,比如DMM的舰队collection、一些国内的页游以及大部分还未更换成H5技术的视频网站,当年本篇文章并非考古,而是因为某些缘由,我想起了多年前的一款软件,相信年轻时经常玩flash小游戏的朋友们不会陌生。

这个软件可是当年为数不多可以对flash进行实时修改的神器,但当时并未考虑过其原理,而这个软件作者早已不再更新并无法联系了,已经无法在win7下使用。

通过查询了多方资料,以及一些分析,我大胆的对该软件做出了如下猜测:

1.软件本体是C++编写,调用ActiveX控件来加载flash

2.真实的flash并非直接通过控件加载,控件加载的是壳flash

3.壳flash通过与C++程序交互并修改目标flash达成目的

 

猜不如放点干货,首先是与flash控件通信

测试语言:C# (其他语言思路相同)

我们首先在项目中添加 AxInterop.ShockwaveFlashObjects.dll

并引用

using AxShockwaveFlashObjects;

然后这样加载一个影片

private AxShockwaveFlashObjects.AxShockwaveFlash player;
player.LoadMovie(0, Application.StartupPath + “\\Test.swf”); //第一个参数是所在层
player.Play(); //播放flash

调用flash的方式如下

player.CallFunction(“<invoke name=\”函数名\” returntype=\”xml\”><arguments><string>” + 传入参数 + “</string></arguments></invoke>”);

以上部分为外部exe程序调用

下面来看flash部分

首先你要有上面需要调用的函数的对应的名字

function 函数名(val:String):void
{
若干操作…
}

这样函数就会被顺利调用了

 

而flash反调exe也比较简单,只要调用

ExternalInterface.call(“命令“, 参数);

即可

 

我们在C#中首先注册flash的消息回调

this.player.FlashCall += new AxShockwaveFlashObjects._IShockwaveFlashEvents_FlashCallEventHandler(this.player_FlashCall);

在player_FlashCall函数中,我们即可从_IShockwaveFlashEvents_FlashCallEvent拿到flash传给我们的东西,格式为XML,自行解析处理即可

 

如有错误,请大家指正,谢谢

发表评论

电子邮件地址不会被公开。 必填项已用*标注