私は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.exe
Flex 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内のクラスを表示させるにはどうすればよいですか?