加载和修改AS3 SWF

时间:2009-12-03 16:26:59

标签: flash actionscript-3 reflection

是否可以加载ActionScript 3 SWF并与之交互,例如通过替换其某些功能或编辑变量?类似于在.NET中使用反射和代码生成的方式。

我希望在现有的第三方AS3应用程序上添加额外的功能层。

3 个答案:

答案 0 :(得分:7)

如果要将其加载到另一个AS3 SWF,是的,您可以访问加载的SWF的公共属性。你无法替换功能 - 你可以调用函数,即公共函数。

var ldr:Loader = new Loader();
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
ldr.load(new URLRequest("filename.swf"));
private function onLoad(e:Event):void
{
    var swf:Object = LoaderInfo(e.target).content;
    swf.somePublicVar = newValue;
    swf.somePublicObject.publicMethod();
    swf.getChildAt(0).x = 30;
    //assuming there is a sprite at index 1
    var child:Sprite = Sprite(swf.getChildAt(1));
    child.graphics.lineStyle(1);
    child.graphics.drawCircle(10, 10, 10);
}

如果您要从其他域加载第三方SWF(而不是将其复制到您的域并从那里加载),following rule适用

  • 如果加载的内容是使用ActionScript 3.0编写的SWF文件,则不能通过另一个安全沙箱中的SWF文件进行跨脚本编写,除非通过调用Security.allowDomain()或者{{3}}批准了该跨脚本编排安排加载的内容文件中的Security.allowInsecureDomain()方法。

简而言之,除非SWF创建者明确允许从您的域中修改它,否则您无法通过远程加载来修改它。如果您可以将SWF复制到您的域中,则不适用。

答案 1 :(得分:0)

嗯,你可以通过挖掘对象的层次结构来控制公开可用的东西(剪辑和其他swf组件),这只是基本的东西。另一种选择是你可以在运行时反编译加载的swf。这个library听起来非常有趣。

答案 2 :(得分:0)

Aspose.Flash可以帮助你编辑变量,因为它支持动作脚本字节代码反编译,但是它不是免费的,除非你使用外部as3编译器(例如来自Adobe的免费编译器),否则无法发出新函数和开源)