1

私は2つのSWFを持っており、それらをAとBと呼んでいます。これらはWebサイトに展開されることはなく、ツールに使用されています。BはAに依存します-BのクラスのいくつかはAのクラスを拡張します。

現在、3番目のSWFを作成しています。これをXと呼びます。Xは、aflash.display.Loaderとを使用してAとBをロードしようとしていますflash.net.URLRequest。AパスとBパスは配列にプッシュされ、次のloadLibraryような関数で呼び出されます。

public class LibraryLoader
{
    private static const CLASS_NAME:String = "LibraryLoader";
    private var _libraries:DisplayObjectContainer;

    ...

    public function loadLibrary(callback:Function, libName:String):void
    {
        trace("loadLibrary('" + libName + "')");

        var loader:Loader = new Loader();
        loader.name = libName;

        var listener:Function = function(e:Event):void
        {
            trace("finished loading '" + libName + "', event: " + e);
            loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, listener);
            _libraries.addChild(loader);
            callback();
        }

        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, listener);
        loader.load(new URLRequest(libName));
    }

問題は、Bをロードすると、エラーがスローされることです。出力は次のとおりです。

loadLibrary('C:\path\to\A.swf')
finished loading 'C:\path\to\A.swf', event: [Event type="complete" bubbles=false cancelable=false eventPhase=2]
loadLibrary('C:\path\to\B.swf')
[Fault] exception, information=VerifyError: Error #1014: Class a.class.in::A could not be found.

このクラスはAの内部にあり、Bはそれに依存しています。

グーグルで調べて、セキュリティ権限とサンドボックスに関する情報を見つけました。おそらく、これらのSWF間に信頼を設定する必要があります。それは問題ありませんが、正しく行う方法がわからないようです。

1つは、次のようにLoaderContextを設定してみました(両方のSWFをロードする場合)。

var context:LoaderContext = new LoaderContext();
context.applicationDomain=ApplicationDomain.currentDomain;
loader.load(new URLRequest(libName), context);

サイコロはありません。同じエラー。さらに、設定しようとすると、次のようになりcontext.securityDomainます。

[Fault] exception, information=SecurityError: Error #2142: Security sandbox violation: local SWF files cannot use the LoaderContext.securityDomain property. file:///C|/path/to/X.swf was attempting to load file:///C:/path/to/A.swf.

違いが生じる場合は、AとBはcompc.exeFlex SDK(3.6)を使用してコンパイルされています。compcを使用して、それぞれに対してSWFとSWCの両方を生成します(実行時のSWFとコンパイル用のSWC)。compcのコマンドラインは次のとおりです。

compc.exe  -output C:\temp\dir -source-path   -include-sources C:\path\to\A\source -directory=true -incremental=true -debug=true  -use-network=false 
compc.exe  -output C:\path\to\A.swc -source-path   -include-sources C:\path\to\A\source -incremental=true -debug=true  -use-network=false 
compc.exe  -output C:\temp\dir -source-path   -include-sources C:\path\to\B\source -directory=true -incremental=true -debug=true  -external-library-path+=C:\path\to\A.swc -use-network=false 

1回目と3回目のコンパイル後、「library.swf」ファイルがリストされた一時ディレクトリにドロップされます。それらのSWFを取り出し、名前をA.swfとB.swfに変更して、必要な場所にドロップします。

X用の私のプロジェクトは、FlashPlayer10.1用のFlashDevelop4.0.1に組み込まれています。

SWF Aに含まれていることはわかっていa.class.in::Aます。これらのSWFをScaleformランタイムに問題なくロードしているため、FlashPlayerの動作に何らかの問題があると確信しています。

XからAとBをロードするときに、BにA内のクラスを表示させるにはどうすればよいですか?

4

1 に答える 1