如何在加载的SWF的ApplicationDomain中获取所有定义?

Luc*_*hez 13 flash actionscript-3

将SWF加载到另一个SWF时,加载器SWF可以使用加载的SWF获取特定定义ApplicationDomain.getDefinition(name:String).例如:

package 
{
    // ... imports

    public class SWFLoader extends Sprite
    {
        private var loadedAppDomain:ApplicationDomain;

        public function SWFLoader()
        {
            var request:URLRequest = new URLRequest("test.swf");
            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onTestLoadComplete);
            loader.load(request);
        }

        private function onTestLoadComplete(event:Event):void
        {
            var loaderInfo:LoaderInfo = LoaderInfo(event.target);
            loadedAppDomain = loaderInfo.applicationDomain;

            // Here we can get ANY defined symbol (class, namespace or function according to Adobe Flash help)
            var someSymbolClass:Class = Class(loadedAppDomain.getDefinition("SomeSymbol"));
            var someSymbolSprite:Sprite = Sprite(new someSymbolClass());

            addChild(sprite);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在SWF中获取所有定义,而无需明确指定每个定义?

Mar*_*ark 14

从Flash Player 11.3开始,您可以使用ApplicationDomain.getQualifiedDefinitionNames().

请参阅有关Flash Player版本的方法此博客文章的官方文档.


OXM*_*456 10

编辑:这是解决您问题的最快方法:http://www.bytearray.org/?p = 175

嗨,你可以使用这个库:https://github.com/claus/as3swf/wiki/ 没有时间做更深入的测试,但这是我发现的:

1 - 我创建了一个包含在库2中的.swf导出的MC,$ Test和$ Test2 2 - 一旦加载器加载了.swf,我运行以下代码:

var swf : SWF = new SWF(loader.contentLoaderInfo.bytes);
trace(swf);
Run Code Online (Sandbox Code Playgroud)

3 - 在输出中你会注意到这些行:

[76:SymbolClass] 
  Symbols:
    [0] TagID: 2, Name: $Test2
    [1] TagID: 1, Name: $Test
Run Code Online (Sandbox Code Playgroud)

我认为有一种方法可以通过库API直接获取此信息