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

时间:2010-11-10 12:06:07

标签: actionscript-3 flash

当您将SWF加载到另一个SWF时,加载程序SWF可以使用ApplicationDomain.getDefinition(name:String)从加载的SWF中获取特定定义。例如:

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);
        }
    }
}

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

4 个答案:

答案 0 :(得分:14)

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

请参阅the official documentation for the methodthis blog post about the Flash Player release

答案 1 :(得分: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);

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

[76:SymbolClass] 
  Symbols:
    [0] TagID: 2, Name: $Test2
    [1] TagID: 1, Name: $Test

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

答案 2 :(得分:0)

您必须将加载的SWF放在当前的ApplicationDomain中。

使用ApplicationDomain.currentDomain在ContextLoader信息上执行此操作。

loader.load(request, new ContextLoader(false, ApplicationDomain.currentDomain));

它应该有用。

答案 3 :(得分:-1)

我从几天前在这里问过的上一个问题得到了答案(这是关于SWC,但在你的情况下,它并没有真正有所作为) Working with SWCs - getDefinitionByName issue

如果两个SWF共享相同的ApplicationDomain,您应该能够直接访问加载的SWF类:

//provided that SomeSymbol extends Sprite...
var someSymbolSprite:Sprite =new SomeSymbol();

另一方面,你将无法做到这一点

var SomeSymbol:Class = getDefinitionByName("SomeSymbol");

除非您从加载的SWF中创建对象库

var ssym:SomeSymbol;

查看以上链接了解更多详情。