PDA

Просмотр полной версии : Loader и внешний SWF


Limeflash
09.12.2009, 03:12
Задача на первый взгляд проста - создать прелоадер, который загружал бы произвольную флешку, в конкретном случае - простой видеоплеер.

Код в целом прост:


var context:LoaderContext = new LoaderContext();
context.checkPolicyFile = true;
var ldr:Loader= new Loader();
ldr.load( new URLRequest( "путь до swf-файла" ), context );


Обычные картинки, простые флешки, например баннеры, созданные в AS2, грузятся и работают прекрасно. Но как только доходит до загрузки AS3-флешки, дебаг-плеер начинает сыпать ошибками, что мол "Error #1009: Не удается вызвать свойство или метод со ссылкой на объект 'null'"

В чем грабля?

bicubic_bublic
09.12.2009, 03:13
В чем грабля?
код загружаемыой флешки с ошибкой написан..

Limeflash
09.12.2009, 03:17
код загружаемыой флешки с ошибкой написан..

Скорее нет, чем да, ведь сама по себе (отдельно от загрузчика) загружаемая флешка работает прекрасно.

bicubic_bublic
09.12.2009, 03:36
Скорее нет, чем да, ведь сама по себе (отдельно от загрузчика) загружаемая флешка работает прекрасно.
это ни о чем не говорит.
для начала проверьте ссылки на stage при инициализации загружаемой флешки. в конструкторе их быть не должно.

Limeflash
09.12.2009, 03:39
я флешка работает прекрасно.
это ни о чем не говорит.
для начала проверьте ссылки на stage при инициализации загружаемой флешки. в конструкторе их быть не должно.[/QUOTE]

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

bicubic_bublic
09.12.2009, 03:41
тогда попробуйте загружать таким образом:
var loader:Loader= new Loader();
addChild(loader);
loader.load( new URLRequest( "путь до swf-файла" ), context );

Limeflash
09.12.2009, 03:45
тогда попробуйте загружать таким образом:
var loader:Loader= new Loader();
addChild(loader);
loader.load( new URLRequest( "путь до swf-файла" ), context );


Пробовал так, пробовал this.stage.addChild(ldr), пробовал вообще убрать addChild, ошибка все равно возникает точно такая же во всех случаях.

bicubic_bublic
09.12.2009, 03:50
ну можно попробовать декомпилировать проблемные флешки и выяснить в чем проблема..

возможно где-то есть обращение к root которое считается внутреннее а получается не очень..

Limeflash
09.12.2009, 04:00
ну можно попробовать декомпилировать проблемные флешки и выяснить в чем проблема..

возможно где-то есть обращение к root которое считается внутреннее а получается не очень..

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

wvxvw
09.12.2009, 04:04
Пока не будет глобального обработчика ошибок - ничего вы с этим не сможете сделать... исправить чужую криворукость в уже скомпилированом коде - это Левшой надо быть...

bicubic_bublic
09.12.2009, 04:05
есть еще совет, вдруг поможет
Security.allowDomain('*');

Limeflash
09.12.2009, 04:09
Пока не будет глобального обработчика ошибок - ничего вы с этим не сможете сделать... исправить чужую криворукость в уже скомпилированом коде - это Левшой надо быть...

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

Неужели нет такого способа? Помнится, в втором AS был _lockroot, он в таких случаях помогал.

Добавлено через 50 секунд
есть еще совет, вдруг поможет
Security.allowDomain('*');

Да, это есть, не помогает :)

wvxvw
09.12.2009, 13:27
>> Неужели нет такого способа? Помнится, в втором AS был _lockroot, он в таких случаях помогал.
Тут проблема не в этом - если кто-то обратился к методам / свойствам стейджа (рута, или лоадерИнфо) до того, как он был доступен - то этому уже никак не помочь. Только на уровне байткода править. Я могу ошибаться в деталях, но смысл примерно такой: помещенные на таймлайн объекты (в том числе и документ класс) создаются как бы в 2 этапа - сначала создается символ, потом линкуется к стейджу а потом вызывается его конструктор, а когда мы загружаем флешку, то первый этап не происходит.
Т.е. в AS2 можно было сделать Object.registerClass() - ну, вот что-то, по всей видимости похожее происходит и там. В HaXe например есть штатная возможность создать объект не вызывая его конструктора - поэтому, я думаю, что такая возможность в принципе существует в AVMPlus - просто средствами AS3 мы никак до нее не доберемся.
И как бы с этим делать пока вобщем-то нечего, уже много об этом писали, вот в 10.1 пообещали сделать глобальный обработчик ошибок - но пока не работает :)

Limeflash
09.12.2009, 14:43
wvxvw, ну вот, вроде бы проясняться стало :) большое спасибо :)
значит и если флешка (в которой обращение к стейджу раньше положенного) заембеддена в мою флешку - она тоже работать не будет?

wvxvw
09.12.2009, 15:26
Неа, только если сделаете ее документ класс классом-фабрикой дополнительного кадра (я такое не пробовал, может сработает, а может и нет, но по идее может получится).