2010-11-10 12 views
13

Cuando carga un SWF en otro, el SWF del cargador puede obtener definiciones específicas del archivo SWF cargado utilizando ApplicationDomain.getDefinition(name:String). Por ejemplo:¿Cómo obtener todas las definiciones en un ApplicationDomain de un SWF cargado?

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

¿Cómo puedo obtener todas las definiciones en un archivo SWF, sin especificar cada una explícitamente?

Respuesta

14

A partir de Flash Player 11.3, puede usar ApplicationDomain.getQualifiedDefinitionNames().

Ver the official documentation for the method y this blog post about the Flash Player release.

+0

Hermoso. Finalmente, Adobe agregó esta funcionalidad :) –

+0

A partir del 3/31/2014, el método no está documentado. No se menciona 'getQualifiedDefinitionNames' en el enlace de documentación para ApplicationDomain. Sin embargo, el método funciona y devuelve un 'Vector. 'de las clases definidas en ese ApplicationDomain particular. También tenga en cuenta que no devuelve definiciones de dominios principales, aunque getDefinition/hasDefinition devolverá true para las clases definidas en los dominios principales. – Triynko

+1

Está documentado allí, pero necesita configurar la versión del reproductor a 11.3 o superior para poder verla. En la parte superior, debajo del título de la página. –

0

Debe colocar el SWF cargado en el ApplicationDomain actual.

Use ApplicationDomain.currentDomain para hacer eso, en la información de ContextLoader.

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

Debería funcionar.

+0

¿Y luego qué? ¿Tengo acceso a todas las clases, espacios de nombres y funciones del archivo SWF cargado? puedo ejecutar: 'var someSymbolSprite: Sprite = Sprite (new SomeSymbol())'? –

+0

Sí, puede acceder a todos los símbolos del archivo swf cargado, como si estuvieran declarados en la película actual. – blue112

10

EDIT: Esta es la solución más rápida a su problema: http://www.bytearray.org/?p=175

Hola, podría utilizar esta biblioteca: https://github.com/claus/as3swf/wiki/ no tienen el tiempo para hacer la prueba más profunda, pero aquí es lo que encontré:

1 - he creado un swf que contiene en la biblioteca 2 exportaron MC, Prueba y $ $ Prueba2 2 - una vez que el swf cargado por un cargador, corro este código:

var swf : SWF = new SWF(loader.contentLoaderInfo.bytes); 
trace(swf); 

3 - En la salida que usted notará tesis líneas:

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

creo que hay una manera de obtener esta información directamente a través de la biblioteca API

+0

Excelente, usaré SWFExplorer ¡Gracias! –

-1

Después de la respuesta que recibí de un anterior pregunta que hice aquí hace pocos días (se trata de SWC, pero en su caso, que en realidad no hace una diferencia)
Working with SWCs - getDefinitionByName issue

Si ambos FSI comparten el mismo ApplicationDomain, usted debería ser capaz de acceder a la carga Clases SWF directamente al hacer esto:

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

Por otra parte, usted no será capaz de hacer esto

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

a menos que cree una biblioteca de objetos desde el SWF cargado

var ssym:SomeSymbol; 

Compruebe el enlace anterior para más detalles.

+0

Pero eso es lo mismo del ejemplo, tengo que saber que existe el símbolo 'SomeSymbol'.Quiero una lista de todos los símbolos sin codificarlos a todos. –

Cuestiones relacionadas