Как выставить ролику stage до его полной загрузки?

22 views
Skip to first unread message

Павел Гольцев

unread,
Jun 23, 2010, 3:23:39 PM6/23/10
to ruf...@googlegroups.com
Всем привет!
Задача простая: один ролик должен подгружаться в другой.
Сам по себе ролик, который нужно подгрузить в другой ролик, работает
нормально. Проблемы начинаются, когда я собсно пытаюсь его подгрузить
в другой ролик. Вылетает ошибка что объект не может быть null. В
результате декомпиляции выяснилось, что в конструкторе главного класса
идет обращение к stage. В итоге делаем выводы: stage в конструкторе
уже есть, когда ролик запускается сам по себе, и его в конструкторе
пока нет, когда ролик подгружается в другой ролик. Так вот вопрос: как
сделать так, чтобы stage уже присутствовал в конструкторе главного
класса ролика, когда ролик загружается в другой ролик?

Valentin Simonov

unread,
Jun 23, 2010, 3:29:30 PM6/23/10
to ruf...@googlegroups.com
Никак.
Если что-то грузишь, то хорошо бы в его конструкторе подписаться на событие
ADDED_TO_STAGE, иначе он еще на stage не добавлен.


Павел Гольцев

unread,
Jun 23, 2010, 3:33:58 PM6/23/10
to ruf...@googlegroups.com
Дак я прекрасно это понимаю. Но ролик делал не я, и исходников к нему
у меня тоже нет. Собирается ролик какой-то сторонней программой самим
заказчиком и таких роликов будет много, и они могут меняться. То есть
на алгоритм сборки таких роликов и на их код я никак повлиять не могу.
Поэтому хотелось бы узреть альтернативные варианты решения этой
проблемы, если они есть.

Flop Serg

unread,
Jun 23, 2010, 3:51:24 PM6/23/10
to ruf...@googlegroups.com
Помнится что это проблемма давно поднималась на руфлеш
и на адобов очень сильно обиделись из за такого вот поведения Loader
и что нет никакой возможности и ивента чтобы это дело отловить и обработать

и что интересное, на сколько я помню, кто-то таки решил эту проблемму
причем очень хитрым способом:

-флешка грузилась URLLoader ом
-далее бинарник разбирался (флешка чуть чуть декомпилилась)
-анализировался байткод и находился конструктор
-весь код конструктора переносился в отдельную функцию init(e:Event=null):void
-конструктор заменялся на addEventListener(Event.ADDED_TO_STAGE,init)
-все это дело собиралось опять в биннарник swf
-этот бинарник скармливали в URLLoader.loadBytes()

поэтому советую тебе поискать эту тему в хистори группы

Олег Галабурда

unread,
Jun 23, 2010, 4:09:11 PM6/23/10
to ruf...@googlegroups.com
Можно декомпилятором достать документ класс, подправить его как
надо(добавить литенер на ADDED_TO_STAGE и отложить инициализацию) и
создать SWF-ку прослойку, которая будет грузить в свой аппликейшон
домаин проблемную флешку. А эта флешка может быть добавлена в основную
с помощью эмбеда, как бинарник. В таком случае при загрузке проблемной
флешки её документ класс будет замещён вашим.

> Дак я прекрасно это понимаю. Но ролик делал не я, и исходников к нему

--
Oleg Galaburda
http://blog.actualwave.com/
http://jsinterface.googlecode.com/
http://guibuilder.org/

Yuriy Kulkoff

unread,
Jun 23, 2010, 4:10:17 PM6/23/10
to ruf...@googlegroups.com
Забавно, на днях поднимал такую же тему
http://www.flasher.ru/forum/showthread.php?t=141350

Решения пока не нашлось, тоже есть мысль только в одну сторону, шаманить с форматом swf.
Но пока это реально темный лес и даже никто сказать толком не может возможно ли это.

--
отменить подписку: ruFlash-u...@googlegroups.com
сообщение в группу: ruF...@googlegroups.com
страница группы: http://groups.google.com/group/ruFlash
правила группы: http://groups.google.com/group/ruFlash/web/rules

Yuriy Kulkoff

unread,
Jun 23, 2010, 4:14:09 PM6/23/10
to ruf...@googlegroups.com

24 июня 2010 г. 0:09 пользователь Олег Галабурда <bur...@gmail.com> написал:
Можно декомпилятором достать документ класс, подправить его ...

 Хорошо если флешка одна, а если с несколько десятков?


Павел Гольцев

unread,
Jun 23, 2010, 4:35:44 PM6/23/10
to ruf...@googlegroups.com
>  Хорошо если флешка одна, а если с несколько десятков?
Вот вот, а потом и декомпилятор как-то странно разбирает, да и класс
сам по себе по размерам будь здоров. На вскидку после декомпиляции без
каких-либо изменений кода у меня ролик так и не собрался, полезло куча
ошибок. То есть после декомпиляции возможно придется еще и править
главный класс, чтобы доводить его до работоспособного состояния.
Есть одна одна особенность в ролике. В нем сначала в конструкторе
вешается на ENTER_FRAME функция, и при первом же возникновении события
обработчик удаляется и происходит обращение к stage. То есть по сути
не в самом конструкторе, а только в след. кадре. Может это как-то
натолкнет кого-то на другие мысли по решению проблемы? Мне ничего в
голову не приходит.

Yuriy Kulkoff

unread,
Jun 23, 2010, 4:43:04 PM6/23/10
to ruf...@googlegroups.com
Я знаю что тут есть люди знающие тайное кунг-фу. Но они тактично отмалчиваются :)

Знать бы хоть что такое возможно совершить, можно было бы начать рыть спецификации,
а так х.з сколько для этого нужно телодвижений совершить и сколько времени убить, может оно того и не стОит.

Alex Davydov

unread,
Jun 23, 2010, 4:54:02 PM6/23/10
to ruf...@googlegroups.com
> Я знаю что тут есть люди знающие тайное кунг-фу. Но они тактично отмалчиваются :)

тайное кунг-фу:
http://etcs.ru/blog/as3/classexplorer/

Павел Гольцев

unread,
Jun 23, 2010, 5:41:23 PM6/23/10
to ruf...@googlegroups.com
А кто-нибудь знает, как можно вызвать конструктор как обычную функцию
для уже созданного объекта повторно? И вообще возможно ли это?

Коробов Влад

unread,
Jun 24, 2010, 2:15:16 AM6/24/10
to ruFlash
> Но ролик делал не я, и исходников к нему
> у меня тоже нет. Собирается ролик какой-то сторонней программой самим
> заказчиком и таких роликов будет много, и они могут меняться. То есть
> на алгоритм сборки таких роликов и на их код я никак повлиять не могу.
Что за хрень. Попробуйте связаться с заказчиком, узнайте что за прога,
свяжитесь с создателями проги.
Снача ла же нужно напрямую все узнать, а потом альтернативы.

Павел Гольцев

unread,
Jun 24, 2010, 5:09:20 AM6/24/10
to ruf...@googlegroups.com
> тайное кунг-фу 2:
> http://github.com/claus/as3swf

Эта штука мало того, что находится в стадии альфа, так она еще
показывает только ресурсы в файле, никакой код вообще не отображает.

Павел Гольцев

unread,
Jun 24, 2010, 5:11:09 AM6/24/10
to ruf...@googlegroups.com
А вообще сама идея перегона в текст и после его изменения обратно
очень заманчива. Может кто-то знает еще библиотеки на эту тему? Вот
тут http://etcs.ru/blog/as3/classexplorer/ может разбирать, но
собирать обратно уже не может (

Vooparker

unread,
Jun 24, 2010, 5:24:49 AM6/24/10
to ruf...@googlegroups.com
2010/6/24 Павел Гольцев <p.go...@gmail.com>
В нем сначала в конструкторе
вешается на ENTER_FRAME функция, и при первом же возникновении события
обработчик удаляется и происходит обращение к stage. То есть по сути
не в самом конструкторе, а только в след. кадре. Может это как-то
натолкнет кого-то на другие мысли по решению проблемы? Мне ничего в
голову не приходит.

Добавить loader на сцену?

www0z0k

unread,
Jun 24, 2010, 5:44:42 AM6/24/10
to ruFlash
у меня более общие вопросы:
внешние флешки содержат только графику, или еще и логику? совпадает ли
версия AVM? не поможет ли избавиться от прослушивания ENTER_FRAME
вызов stop() при загрузке? вообще, хотелось бы посмотреть, что там за
звери такие, мне для опытов надо, пробую написать универсальный
загрузчик изображений

Yuriy Kulkoff

unread,
Jun 24, 2010, 5:48:17 AM6/24/10
to ruf...@googlegroups.com
http://www.libspark.org/wiki/yossy/swfassist вот это выглядит интересно.

Я пока решил вникнуть в анатомию swf.
По логике кажется что не все так сложно.
Найти документКласс, переименовать оригинальный конструктор.
Добавить свой конструктор с подпиской на added_to_stage.
В обработчике added_to_stage сделать вызов переименованного родного конструктора.

А вот как оно на деле поглядим...

Valentin Simonov

unread,
Jun 24, 2010, 6:24:19 AM6/24/10
to ruf...@googlegroups.com
Не совсем так.
Скорее добавить код вызова функции в конструктор и соответственно добавить эту функцию в экземпляр документкласса.
Рекомендую apparat от Joa Ebert (при некоторых знаниях Scala)
Ну и, на самом деле не все так тривиально. Нам еще нужно вставлять неймспейсы и используемые строки, нужно правильно вставить эту функцию с уникальным именем.


On 6/24/10 1:48 PM, "Yuriy Kulkoff" <mur...@gmail.com> wrote:

Олег Галабурда

unread,
Jun 24, 2010, 6:39:01 AM6/24/10
to ruf...@googlegroups.com
Сразу при создании объекта повесьте на него обработчик ENTER_FRAME с
повышеным приоритетом и подавляйте собятия с помощью
Event.stopImmediatePropagation(), пока не посчитаете его
проинициализированным.

> Есть одна одна особенность в ролике. В нем сначала в конструкторе
> вешается на ENTER_FRAME функция, и при первом же возникновении события

Flop Serg

unread,
Jun 24, 2010, 7:53:36 AM6/24/10
to ruf...@googlegroups.com
Мое конфу сильнее вашего!
говорю же отыщите тему старую там было решение
помоему Денис Коляко делал налету весь разбор и сбор свфки

А еще там было от меня тайное кун-фу 4

если флешка одна а не 100500 тыщ мильеноф
то можно декомпильнуть ее и посмотреть документ класс
сделать свой собственный документ класс в котором не будт обращения к стэйджу
и в котором будет тот-же кот что и в декомпильнутой swf
НО! без импортов а с использованием хитройстей вроде:
class:Class = ApplicationDomain.getDefinitionByName("class name")
instance = new class()
addChild(instance as DisplayObject)

потом этот ЕДИНСТВЕННЫЙ класс компиляется в swf
а после загружается в конктетный ApplicationDomain перед вашей нерабочей SWF

В итоге ваш ноый хорошый класс заменяет старый плохой и все работает на уряяя

Yuriy Kulkoff

unread,
Jun 24, 2010, 8:01:11 AM6/24/10
to ruf...@googlegroups.com
>Мое конфу сильнее вашего!
>говорю же отыщите тему старую там было решение
>помоему Денис Коляко делал налету весь разбор и сбор свфки
>
>А еще там было от меня тайное кун-фу 4
 
Поискал, не нашел.
И если б Денис это делал, он бы, наверное, тут что нибудь на эту тему сказал.
А в своем блоге он пишет что это занятие геморройное, но в теории возможно.

Flop Serg

unread,
Jun 24, 2010, 8:21:37 AM6/24/10
to ruf...@googlegroups.com
> Поискал, не нашел.

меня тоже что-то поиск в гмэйле и в группах стал настораживать
последнее время несколько раз было такое, 100% помню что тема была
и ключевые слова вроде ApplicationDomain Stage null были 100%, а вот
поиск не находит ниразу
поэтому поиск через гугль с ключевыми словами ApplicationDomain Stage
null ruFlash находит на Ура

вот смотри

http://groups.google.com/group/ruflash/browse_thread/thread/5b395b08549551b8

Yuriy Kulkoff

unread,
Jun 24, 2010, 8:51:51 AM6/24/10
to ruf...@googlegroups.com
>вот смотри
>http://groups.google.com/group/ruflash/browse_thread/thread/5b395b08549551b8

Спасибо, эту тему я видел, она не совсем закончена, т.к непонятно удалось ли найти рабочее решение.
И нет в ней ничего о реализации (так как Вы говорили). :)

Alex Davydov

unread,
Jun 24, 2010, 11:05:25 AM6/24/10
to ruf...@googlegroups.com
> Мое конфу сильнее вашего!
> говорю же отыщите тему старую там было решение
> помоему Денис Коляко делал налету весь разбор и сбор свфки

кунг-фу - 1 и есть разработка от Дэница.

Valentin Simonov

unread,
Jun 24, 2010, 8:00:20 PM6/24/10
to ruf...@googlegroups.com
Скажем, софтинка, которая меняет входной SWF так, что весь код инициализации
из конструктора перемещается в приватный метод, который зовется по
ADDED_TO_STAGE, решит вашу проблему? Прогнать по всем SWF, например.


Yuriy Kulkoff

unread,
Jun 24, 2010, 8:15:10 PM6/24/10
to ruf...@googlegroups.com
 >Скажем, софтинка, которая меняет входной SWF так, что весь код инициализации
 >из конструктора перемещается в приватный метод, который зовется по
 >ADDED_TO_STAGE, решит вашу проблему? Прогнать по всем SWF, например.

Решит.

Valentin Simonov

unread,
Jun 27, 2010, 4:41:19 PM6/27/10
to ruf...@googlegroups.com
Вот, попробуйте прогнать на своих SWF.
http://va.lent.in/projects/swf/initInjector/initInjector.0.1.zip
usage: java -jar initInjector.jar <filename.swf> <filename.swf> ... <filename.swf>

Решит.

Yuriy Kulkoff

unread,
Jun 27, 2010, 6:53:25 PM6/27/10
to ruf...@googlegroups.com
> Вот, попробуйте прогнать на своих SWF.
> http://va.lent.in/projects/swf/initInjector/initInjector.0.1.zip
> usage: java -jar initInjector.jar <filename.swf> <filename.swf> ... <filename.swf>

Почти.
Сначала требовало 7z - поставил, прописал в PATH.
Заработало. Но после патчинга ФП выдает такую вот мессагу VerifyError: Error #1107: Данные ABC повреждены, попытка чтения вне пределов.
При подсмотре декомпилятором в ДокументКлассе вроде все ОК. Но чего то не еще не хватает.

P.S. Был бы признателен за алгоритм (не код, а именно алгоритм). Сейчас пытаюсь наваять подобную тулзу.
Reply all
Reply to author
Forward
0 new messages