0

インターフェイスを使用して、リモートSWFをロードし、そのメソッドとプロパティにアクセスしようとしています。(ここに同様の質問がありますが、「それは奇妙です!」までは解決しませんでした:swfをロードし、インターフェイスを介して使用します

私のリモートSWFは次のようになります。

package 
{   
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.system.Security;

    import IMultiplayer;

    [SWF(width="238", height="60", frameRate="60", backgroundColor="#FFFFFF")]
    public class Main extends Sprite implements IMultiplayer
    {
        public function init(e:Event):void
        {

        }

        public function TEST():void
        {
            trace("TEST()");
        }   
    }
}

次に、次のようなインターフェイスがあります。

package
{
    import flash.events.*;
    import flash.display.*;

    public interface IMultiplayer
    {
        function init(e:Event):void;
        function TEST():void;
    }
}

そして最後に、SWFをプルダウンし、リモートSWFが実装するのと同じインターフェイスとしてキャストしようとするローダークラスがあります。編集-長さについてお詫びし、完全なソースを投稿するように求められました:

package uk.co.MyDomain
{
    import flash.display.DisplayObject;
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.ErrorEvent;
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.IEventDispatcher;
    import flash.events.IOErrorEvent;
    import flash.events.TimerEvent;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;
    import flash.system.Security;
    import flash.system.SecurityDomain;
    import flash.utils.Timer;

    import uk.co.MyDomain.*;

    import utils.Console;

    public class MultiplayerLoader extends Sprite
    {
        private var ld:Loader;
        private var _environment:String;
        public var _mpInstance:IMultiplayer;

        private const SANDBOX_SWF:String = "http://static.sandbox.dev.MyDomain.co.uk/smartfoxtest/dev/swf/MP.swf";

        public function MultiplayerLoader(environment:String)
        {
            _environment = environment;
        }

        public function loadMultiplayer():void
        {
            ld = new Loader();

            var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);

            ld.contentLoaderInfo.addEventListener(Event.COMPLETE, multiplayerLoaded);
            ld.contentLoaderInfo.addEventListener(ErrorEvent.ERROR, onLoadError);
            ld.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIOLoadError);
            ld.contentLoaderInfo.addEventListener(IOErrorEvent.DISK_ERROR, onDiskError);
            ld.contentLoaderInfo.addEventListener(IOErrorEvent.NETWORK_ERROR, onNetworkError);
            ld.contentLoaderInfo.addEventListener(IOErrorEvent.VERIFY_ERROR, onVerifyError);

            if(Security.sandboxType == Security.REMOTE)
            {
                trace('[MP Loader] Loading with context');
                ld.load(new URLRequest(SANDBOX_SWF), context);      
            }
            else
            {
                trace('[MP Loader] Loading with NO context');
                ld.load(new URLRequest(SANDBOX_SWF));   
            }
        }

        private function onIOLoadError(e:IOErrorEvent):void
        {
            notifyFailure('IOLoadError');
        }

        private function onDiskError(e:IOErrorEvent):void
        {
            notifyFailure('IOLoadError');
        }

        private function onNetworkError(e:IOErrorEvent):void
        {
            notifyFailure('IOLoadError');
        }

        private function onVerifyError(e:IOErrorEvent):void
        {
            notifyFailure('IOLoadError');
        }

        private function onLoadError(e:ErrorEvent):void
        {
            notifyFailure('IOLoadError');
        }

        private function multiplayerLoaded(e:Event):void
        {   
            var tester:IMultiplayer = e.currentTarget.content as IMultiplayer;          
            Console.log('Loaded: ' + tester);

            dispatchEvent(new MultiplayerEvent(MultiplayerEvent.SWF_LOAD_SUCCESS)); 
        }

        private function notifyFailure(reason:String):void
        {
            var failEvent:MultiplayerEvent = new MultiplayerEvent(MultiplayerEvent.SWF_LOAD_FAILURE);
            failEvent.params = {'reason':reason}

            dispatchEvent(failEvent);
        }
    }
}

これで、インターフェイスを使用するためにキャストしない場合は、正常にトレースして関数を呼び出すことができます(したがって、e.target.content.TEST()が起動します)。ただし、インターフェイスにキャストするとすぐに失敗します。

何か案は?

編集

OK、両方のアプリケーション間で共有されるカスタムイベントクラスで同じ問題が発生します。Flashエラーは、あるクラスから別のクラスに変換できないことを示しています。同じクラスであっても、異なるプロジェクトにあるため、異なる名前空間を想像します。同じapplicationDomainにロードするとこれが修正されると思いましたが、修正されていません。一般的なライブラリ/SWCなどに頼らずにこれを回避できる他の方法はありますか?

4

1 に答える 1

1

これはアプリケーションドメインの問題かもしれないと思います。ロードされたSWFは独自のアプリケーションドメインに存在するため、まったく同じインターフェイスを共有しません。applicationDomainローダーのLoaderInfoオブジェクトのプロパティを使用して、swfを「現在のアプリケーションドメイン」にロードしてみてください。

ここを見てください

頑張って…</p>

編集::

ローダーロード方式で行う必要があります

var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
var loader:Loader = new Loader();
loader.load(new URLRequest("myButtons.swf"), context);

ここから

編集2::

さらに奇妙なエラーが発生した場合は、インターフェイスを作成し、「ファイルをロードする」と「ロードしたファイル」をコンパイルし、メソッドを追加してインターフェイスを変更し、「に」をコンパイルするのを忘れたことが原因でした。ファイルのロード«(たくさんありました)。おそらくこのようなことが起こったのでしょう…</p>

編集3::

ロードされたswfのイベントを待つ必要があるよりも正しいことを覚えている場合はEvent.INIT、最初にこのイベントの後に、ロードされたswfのコンストラクターが実行されました。

編集4::

これを見つけまし、おそらくあなたはする必要があります:

var YourInterfaceClass:Class = ApplicationDomain.currentDomain.getDefinition( "YourInterface" ) as Class; 
var myInstance:YourINterface = event.target.content as YourInterface; 
于 2012-11-12T16:41:55.023 に答える