Как получить все определения в ApplicationDomain загруженного SWF? - PullRequest
13 голосов
/ 10 ноября 2010

Когда вы загружаете 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);
        }
    }
}

Как получить все определения в SWF, не указав каждое из них в явном виде?

Ответы [ 4 ]

14 голосов
/ 23 октября 2012

Начиная с Flash Player 11.3, вы можете использовать ApplicationDomain.getQualifiedDefinitionNames().

См. официальную документацию по методу и в этом блоге о релизе Flash Player .

10 голосов
/ 10 ноября 2010

РЕДАКТИРОВАТЬ: Это самое быстрое решение вашей проблемы: http://www.bytearray.org/?p=175

Привет, вы можете использовать эту библиотеку: https://github.com/claus/as3swf/wiki/ У меня нет времени для более глубокого тестирования, но вот что я нашел:

1 - я создал .swf, содержащий в библиотеке 2 экспортированные 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

0 голосов
/ 10 ноября 2010

Исходя из ответа, который я получил на предыдущий вопрос, который я задал здесь несколько дней назад (речь идет о SWC, но в вашем случае это не имеет значения)
Работа с SWC - проблема getDefinitionByName

Если оба SWF-файла используют один и тот же домен ApplicationDomain, вы сможете получить прямой доступ к загруженным классам SWF, выполнив следующее:

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

С другой стороны, вы не сможете сделать это

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

, если вы не создаете библиотеку объектов из загруженного SWF

var ssym:SomeSymbol;

Проверьте приведенную выше ссылку для получения более подробной информации.

0 голосов
/ 10 ноября 2010

Вы должны поместить загруженный SWF-файл в текущий домен приложения.

Для этого используйте ApplicationDomain.currentDomain в информации ContextLoader.

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

Это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...