2010-02-19 85 views
3

我有一個現有的AIR應用程序,其主要內容爲App.swf。我想要另一個託管和運行App.swf的AIR應用程序。當我說運行它時,我的意思是顯示它是WindowedApplication。裝載並運行現有AIR的AIR應用程序swf

下面是2個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(); 
    } 
} 

我碰到下面的錯誤在加載App.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] 

我相信問題與AirAppHostApplication的SystemManager與應用程序的SystemManager衝突,因爲它們都生活在同一個應用程序域中。可以編寫AIR應用程序,其中WindowedApplication類不是靜態定義的,而是在運行時通過加載swf並實例化swf中包含的WindowedApplication子類來加載的。

我想這樣做的原因是自動化場景,我必須假設我沒有自動化應用程序的源代碼,但我可以訪問公共類的名稱和他們的公開方法暴露於自動化。我完全控制了環境,不必處理任何約束,所以我可以將2個AIR應用程序放在同一個目錄中,等等。

這可能嗎?

回答

2

是的,這是可能的。看看http://blog.everythingflex.com/2009/06/08/open-an-air-application-from-a-2nd-air-application/

它被稱爲從第二個AIR應用程序打開AIR應用程序。

它說:這是要求兩者

一件事是,你正試圖啓動應用程序設置爲true,AIR配置文件,並在系統上安裝應用程序中的財產中將allowBrowserInvocation。

您還必須知道應用程序的ID和發行者ID。例如,在我的LauncherSample中,AIR配置文件中定義的應用程序ID是:

plus說明了如何執行此操作。

這裏是Adobe的錯誤描述。

錯誤1009無法訪問空對象引用的屬性或方法。

評估爲null的對象可能沒有任何屬性。這個錯誤可能發生在一些意想不到的情況下(儘管有效)。例如,考慮下面的代碼,它創建一個Sprite對象。由於此Sprite對象從不添加到顯示列表(通過DisplayObjectContainer對象的addChild()方法),因此其stage屬性設置爲null。因此,該示例會生成此錯誤,因爲Sprite對象的舞臺屬性不能具有任何屬性:

import flash.display.Sprite; 
var sprite1:Sprite = new Sprite(); 
var q:String = sprite1.stage.quality; 
+0

感謝您的回覆,但我不想簡單地從AIR應用啓動另一個AIR應用。我想在另一個AIR應用程序中託管現有的AIR應用程序。這意味着託管應用程序和託管應用程序所駐留的代碼只有一個過程。我更新了代碼以使其更清晰。 – pfeilbr 2010-02-19 12:46:31

0

不,這是不可能的。每個AIR應用程序都有一個唯一的應用程序目錄和一個唯一的存儲目錄。由於安全沙箱模型,應用程序無法訪問其自己的存儲目錄之外的內容。