2013-02-13 62 views
1

我有两个SWF,称它们为A和B.它们将永远不会部署到网站,并且正在用于工具。 B依赖于A - B中的某些类扩展A中的类。加载多个本地SWF时AS3错误1014

我正在创建第3个SWF,称其为X.X正试图使用​​flash.display.Loaderflash.net.URLRequest加载A和B. 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之间建立一些信任关系。这很好,但我似乎无法弄清楚如何正确地做到这一点。

首先,我试图建立一个LoaderContext像这样(装在两个主权财富基金):

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)编译。我为每个SWF生成一个SWF和一个SWC,用于运行时SWF和用于编译的SWC - 使用compc。下面是通过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 

第一和第三汇编后,“library.swf的”文件被投进列出的临时目录。我将这些SWF取出并将它们重命名为A.swf和B.swf,并将它们放在我想要的地方。

我的X项目是为Flash Player 10.1构建的FlashDevelop 4.0.1。

我知道a.class.in::A包含在SWF A中。我在没有问题的情况下将这些SWF加载到Scaleform运行时中,因此我确信在FlashPlayer的工作方式上存在某种问题。

当我从X载入A和B时,如何让B看到A中的类?

+0

在加载loaderB之前,您是否确保loa​​derA完全加载? – Marcela 2013-02-13 21:48:23

+0

@Marcela很确定,是的。更新了代码片段,以显示我如何等待完整事件。 – 2013-02-14 14:08:56

回答

1

有三种意见:

  1. 你是对的,当你指定的applicationDomainApplicationDomain.currentDomain;没有这个加载器加载的SWF子域与公共父分开,所以他们不看对方的类。
  2. 对于常见的应用程序域,来自A的类必须可以从B访问,所以我看到只有一种可能性出现错误:真的没有类some.class.in.A。试着检查这个类是否包含在A中(例如通过Sothink SWF Decompiler)或者只是检查这个类是否明确地用在了A中的代码中。如果它没有被使用,那么它不包括在内,你可以强制包含这个类通过在代码中加入它:只需在new声明中添加some.class.in.A一些在哪里。
  3. context.securityDomain仅用于通过http加载swf文件并且不适用于本地时的其他用途。
+0

对于#2,我相当确信这个类实际上是在A中。原因是因为我在Scaleform应用程序中以相同顺序加载这些相同的SWF,并且一切正常。有问题的班级几乎到处都是非常普遍的班级。 – 2013-02-14 14:28:59

+0

如果是这样,你必须提供这些swf文件,我会在演示中检查它们。顺便说一句,你的意思是_mxmlc.exe_而不是_compc.exe_作为最后一个编译swc库。 – fsbmain 2013-02-14 14:46:58

+0

我会尝试在某个时候获得更小的测试用例。尽管如此,我确实意味着compc - 我在关于管道如何工作的问题中增加了更多细节。 – 2013-02-14 15:23:55