Приложение AIR, которое загружает и запускает существующий SWF AIR - PullRequest
3 голосов
/ 19 февраля 2010

У меня есть приложение AIR, основным содержимым которого является App.swf.Я хотел бы иметь другое приложение AIR, которое размещает и запускает App.swf.Когда я говорю «запустите его», я имею в виду, что он отображает приложение «WindowedApplication».

Вот код для двух проектов AIR (для краткости импорт исключен):

// App AIR Project -> App.mxml -> App.swf (it's just a window)
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
public function doSomething():void {
    trace("doSomething called");
}
]]>
</mx:Script>
</mx:WindowedApplication>

// AirAppHostApplication AIR Project -> AirAppHostApplication.mxml -> AirAppHostApplication.swf
<?xml version="1.0" encoding="utf-8"?>
<custom:AirAppHostApplication xmlns:custom="components.*" />

// components/AirAppHostApplication.as
public class AirAppHostApplication extends WindowedApplication
{   
    private var ldr:Loader;

    public function AirAppHostApplication()
    {
        addEventListener (FlexEvent.CREATION_COMPLETE, handleComplete);
    }

    private function handleComplete( event : FlexEvent ) : void
    {
        loadSwf("App.swf");
    }

    private function loadSwf(swf:String):void {
        ldr = new Loader();
        var req:URLRequest = new URLRequest(swf);
        var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
        ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
        ldr.load(req, ldrContext);
    }

    private function completeHandler(event:Event):void {
        var appSystemManagerCls:* = ApplicationDomain.currentDomain.getDefinition("_app_mx_managers_SystemManager") as Class;
        var appSystemManagerInstance:* = new appSystemManagerCls(Application.application);
        var appInstance:WindowedApplication = appSystemManagerInstance.create();
        appInstance.activate();
        appInstance.doSomething();
    }   
}

При приложении возникает следующая ошибкаЗагружается .swf:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at mx.managers::SystemManager/initHandler()[C:\autobuild\galaga\frameworks\projects\framework\src\mx\managers\SystemManager.as:3001]

Я полагаю, что проблема связана с SystemManager AirAppHostApplication, конфликтующим с SystemManager приложения, поскольку оба они живут в одном домене приложения.Можно ли написать приложение AIR, в котором класс WindowedApplication не определен статически, а загружен во время выполнения путем загрузки SWF-файла и создания экземпляра подкласса WindowedApplication, содержащегося в SWF.

Причина, по которой я хочу это сделать, заключается в том, чтосценарий автоматизации, где я должен предположить, что у меня нет исходного кода для приложения, которое я автоматизирую, но у меня есть доступ к именам открытых классов и их открытым методам, предоставляемым для автоматизации.У меня есть полный контроль над средой, и мне не нужно иметь с этим никаких ограничений, поэтому я могу поместить 2 приложения AIR в один каталог и т. Д.

Возможно ли это?

Ответы [ 2 ]

2 голосов
/ 19 февраля 2010

Да, это возможно. Взгляните на http://blog.everythingflex.com/2009/06/08/open-an-air-application-from-a-2nd-air-application/

Он называется «Открыть приложение AIR из второго приложения AIR».

Там написано:

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

и

Вы также должны знать идентификатор приложения и идентификатор издателя. Например, в моем LauncherSample идентификатор приложения, определенный в файле конфигурации AIR:

plus рассказывает, как это сделать.

Вот описание ошибки Adobe.

Ошибка 1009 Невозможно получить доступ к свойству или методу пустой ссылки на объект.

Объект с нулевым значением не может иметь свойств. Эта ошибка может возникнуть в некоторых неожиданных (хотя и допустимых) ситуациях. Например, рассмотрим следующий код, который создает объект Sprite. Поскольку этот объект Sprite никогда не добавляется в список отображения (через метод addChild () объекта DisplayObjectContainer), его свойство stage имеет значение null. Таким образом, пример генерирует эту ошибку, потому что свойство stage объекта Sprite не может иметь никаких свойств:

import flash.display.Sprite;
var sprite1:Sprite = new Sprite();
var q:String = sprite1.stage.quality;
0 голосов
/ 04 января 2012

Нет, это невозможно.Каждое приложение AIR имеет один уникальный каталог приложений и один уникальный каталог хранения.Из-за модели изолированной программной среды безопасности приложение не может получить доступ к контенту вне своего собственного каталога хранения.

...