2010-08-12 47 views
0

我創建簡單的SWF接口:加載SWF和使用它通過接口

public class Test extends MovieClip implements ITest 
{ 

    public function Test() 
    { 
     Security.allowDomain("*"); 
     Security.allowInsecureDomain("*"); 
    } 

    public function speak(str):String 
    { 
     trace(str); 
     return "yeah"; 
    } 
} 

ITEST:

public interface ITest { 

    // Interface methods: 
    function speak(str):String 
} 

然後我試圖加載:

public function SWFLoader() 
    { 
     var url='http://xxxxxxxx/test.swf'; 
     var loadURL:URLRequest=new URLRequest(url); 
     var loader:Loader = new Loader(); 
     loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); 
     var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain); 
     loader.load(loadURL, context); 
    } 

    private function completeHandler(event:Event):void 
    { 
     var test:ITest; 
     test = event.target.content as ITest; 
     test.speak("ggg"); 
    } 

因此,如果我有test.swf在相同的目錄(本地方式),它的工作很好。但是,如果我將它放在專用服務器上:(event.target.content as ITest)將返回null。但是,我可以在沒有界面的情況下訪問speak(),如event.target.content.speak(「a!」);

如何解決這個問題呢?

回答

0
+1

謝謝,但它不是類型的強制問題。這完全是關於安全。 我試過加載瑞士法郎到網絡服務器,它的工作很好。即使使用checkPolicyFile = false,它也會詢問crossdomain.xml並可以正常工作。 現在我意識到當我在本地機器上運行swf時,我無法從web服務器加載swf。 – Shens 2010-08-12 08:52:19

+1

我不明白安全問題如何導致「event.target.content as ITest」返回null,但「event.target.content.speak(」a!「);」上班。 – David 2010-08-12 09:46:07

+0

我同意David在這裏!對不起,我給你+1,但它是爲大衛:))))沒有問題! ;)你可能會遇到安全問題,但這不是你問題的上下文...... – PatrickS 2010-08-12 10:14:28

0

你如何共享您的兩個SWF之間ITest接口?

我想你有兩個項目,一個是test.swf(加載的),另一個是加載器(我會稱它爲loader.swf)。我認爲你不能只聲明兩次ITest接口(一個用於test.swf,一個用於loader.swf)。如果這樣做,將會有兩個接口,它們具有相同的接口名稱,相同的聲明方法,但它們仍然是2個不同的接口。將一個人投入另一個人將失敗。
我敢打賭,如果你做的(由帕特里克的建議)

var test:ITest = ITest(event.target.content); 

你會看到一個錯誤類型 - >這是這種形式鑄造的優勢。這將證實我的想法:兩個接口是不同的。

要真正共享2個項目之間的接口,應將其存儲到庫(.swc文件)中,並在2個項目中使用該庫。這應該可以解決問題。

+0

這聽起來很合理,但我的方式正常工作(如果我將swf上傳到服務器並從網上運行)。我不知道,但我相信那些以相同方式編譯的接口,爲什麼他們這麼叫。 – Shens 2010-08-12 09:21:35

+0

出於好奇,我很想知道它是否真的失敗了。你如何解釋下面的工作 event.target.content。說話( 「一!」); 此外ITest界面似乎並沒有在兩個項目之間共享。 ITest對象是實際的加載器內容。你在哪裏看到loader.swf實現ITest? ITest只是加載項目的一個孩子。 – PatrickS 2010-08-12 10:24:55

+0

好的,我想相信你,但是如何解釋它在線工作? event.target.content作爲ITest給我ITest對象,我可以使用它。 不幸的是我不知道這些東西是如何工作在閃存(在字節碼)。我想接口只是給我們一些對象的可用方法的描述。我們可以合法地給他們打電話。所以它編譯的地方並不重要。另外我懷疑,類型轉換操作需要更多的安全權限,而不僅僅是訪問對象的方法。只是假設。 – Shens 2010-08-12 10:33:12