2012-01-11 3 views
1

Есть ли способ получить доступ ко всем экспортированным символам в * .swf-файле?Доступ ко всем символам в * .swf-файле

Я имею в виду все символы, которые помечены Экспорт в Actionscript в библиотеке Flash IDE. Таким образом, я мог бы использовать класс getDefinition(), не зная заранее имя символа.

Это для внутреннего инструмента, сделанного в AS3, который будет работать вдоль рамки, которая должна выполнять некоторые операции над каждым символом файла * .swf.
Таким образом, производительность не требуется, и допустимо хакерское решение (доступ к ByteArray из swf или что-то в этом роде).

Благодаря


Как Daniel предлагаемых, я закончил с использованием as3swf для разбора байт-код в * .swf файл и прочитать класс.

Вот простая функция, которую я сделал, которая возвращает массив, содержащий имена символов, готовые для использования с getDefinition(). Вы должны передать ByteArray файла * .swf.

private function getSymbolList(bytes:ByteArray):Array { 
     var swf:SWF = new SWF(bytes); 
     var ret:Array = []; 
     for each(var tag:ITag in swf.tags) { 
      if(tag is TagSymbolClass) { 
       var symbolClass:TagSymbolClass = tag as TagSymbolClass; 
       for (var i:int = 0; i < symbolClass.symbols.length; i++) { 
        ret.push(symbolClass.symbols[i].name); 
       } return ret; 
      } 
     } return ret; 
    } 

С новым 11.3 Flash API, эта функция встроена.

var definitions:Vector.<String> = 
    this.loaderInfo.applicationDomain.getQualifiedDefinitionNames(); 
+0

Считаете ли вы, что декомпилятор SWF удовлетворит ваши потребности? – ToddBFisher

+1

Если декомпилятор может быть вызван из моего инструмента (который является swf-файлом) и вернет список с именами символов из внешнего swf, тогда да. – Veehmot

ответ

3

Это возможно, прочитав байт-код swf, де-сериализуя его и прочитав имена классов.

Это сложная работа, поэтому лучше всего смотреть на библиотеки низкого уровня, которые уже делают это. класс as3commons bytecode делает это.

http://www.google.com/codesearch#Ueq88nAe-j0/trunk/as3-commons-bytecode/

as3swf также могут получить на эти данные. вы можете просмотреть классы и посмотреть, как они это делают, или просто использовать классы.

Я на самом деле не использовал их, поэтому у меня нет кода для обмена, но надеюсь, что это поможет.

+0

Кажется, что это то, что я искал, я сейчас изучаю его. – Veehmot

+0

Это было действительно просто. Я обновил вопрос с помощью функции, которую я сделал. Спасибо за вашу помощь. – Veehmot

+1

благодарит за обмен решения – Daniel