2010-08-12 3 views
0

J'ai créé swf simple avec interface:swf Chargement et l'utiliser via l'interface

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 
} 

Et puis je suis en train de le charger:

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"); 
    } 

Donc, si j'ai test.swf dans le même répertoire (local), ça marche. Mais si je le place sur le serveur dédié: (event.target.content as ITest) renvoie null. Cependant, je peux accéder à speak() sans interface comme this event.target.content.speak ("a!");

Comment résoudre ce problème?

Répondre

0
+1

Merci, mais ce n'est pas un problème de coercition de type. Tout est une question de sécurité. J'ai essayé de charger swf sur le serveur web et ça marche. Il demande crossdomain.xml même avec checkPolicyFile = false et fonctionne. Maintenant, je me suis rendu compte que je ne pouvais tout simplement pas charger swf à partir du serveur web lorsque je cours un swf sur une machine locale. – Shens

+1

Je ne comprends pas comment un problème de sécurité peut provoquer "event.target.content as ITest" pour retourner null mais "event.target.content.speak (" a! ");" travailler. – David

+0

Je suis d'accord avec David ici! Désolé, je vous ai donné +1 mais c'était destiné à David :))) Pas de soucis! ;) Vous avez peut-être un problème de sécurité, mais ce n'est pas le contexte de votre question ... – PatrickS

0

Comment partagez-vous l'interface ITest entre vos deux swf?

J'imagine que vous avez deux projets un pour le test.swf (le chargé) et un pour le chargeur (je l'appellerai loader.swf). Je pense que vous ne pouvez pas déclarer deux fois l'interface ITest (une pour test.swf, une pour loader.swf). Si vous le faites, il y aura deux interfaces, avec le même nom d'interface, les mêmes méthodes déclarées, mais il y aura toujours deux interfaces différentes. Et jeter l'un dans l'autre échouera.
Je parie que si vous faites (comme suggéré par PatrickS)

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

Vous verrez une erreur de type -> qui est l'avantage de cette forme de coulée. Cela va confirmer ce que je pense: les deux interfaces sont différentes. Pour vraiment partager l'interface entre vos 2 projets, vous devez le stocker dans une bibliothèque (fichier .swc) et utiliser cette bibliothèque dans vos 2 projets. Cela devrait résoudre le problème.

+0

Cela semble raisonnable, mais ma façon fonctionne très bien (si je télécharge swf au serveur et l'exécuter à partir du Web). Je ne sais pas exactement, mais je crois que les interfaces compilées de la même manière, c'est pourquoi ils l'ont appelé. – Shens

+0

Par curiosité, je serais intéressé de savoir si cela échoue réellement. Comment expliquez-vous que ce qui suit fonctionne event.target.content.parler ("a!"); En outre, l'interface ITest ne semble pas être partagée entre les deux projets. l'objet ITest est le contenu réel du chargeur. Où voyez-vous que loader.swf implémente ITest? ITest est simplement un enfant du projet de chargement. – PatrickS

+0

Ok, je veux vous croire, mais comment expliquer que cela fonctionne en ligne? event.target.content car ITest me donne l'objet ITest et je peux travailler avec. Malheureusement, je ne sais pas comment tout cela fonctionne à l'intérieur du flash (en octet). Je suppose que cette interface nous donne juste une description des méthodes disponibles d'un objet. Et nous pouvons les appeler légalement. Ce n'est donc pas vraiment important là où il a été compilé. Aussi je soupçonne que l'opération de moulage de type a besoin de plus d'autorisations de sécurité que l'accès aux méthodes d'objet. Juste des hypothèses. – Shens

Questions connexes