【问题标题】:AS3 Error 1014 when loading multiple local SWFs加载多个本地 SWF 时出现 AS3 错误 1014
【发布时间】:2013-02-13 21:33:16
【问题描述】:

我有两个 SWF,分别称为 A 和 B。它们永远不会部署到网站上,而是用于工具。 B 依赖于 A - B 中的某些类扩展了 A 中的类。

我现在正在创建第三个 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依赖它。

我在 Google 上四处搜索并找到了有关安全权限和沙箱的信息 - 也许我需要在这些 SWF 之间建立一些信任。这很好,但我似乎无法弄清楚如何正确地做到这一点。

首先,我尝试像这样设置 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 正在使用来自 Flex SDK (3.6) 的compc.exe 进行编译。我为每个生成一个 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 中。我在 Scaleform 运行时中加载这些 SWF 时没有任何问题,因此我确信 FlashPlayer 的处理方式存在某种问题。

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

【问题讨论】:

  • 在尝试加载 loaderB 之前,您是否确保 loaderA 已完全加载?
  • @Marcela 很确定,是的。更新了代码 sn-p 以显示我如何等待完整的事件。

标签: actionscript-3


【解决方案1】:

共有三个cmets:

  1. 您是对的,当您将 applicationDomain 指定为 ApplicationDomain.currentDomain; 时,没有此加载器会将 swf 加载到具有共同父级的单独子域,因此它们看不到彼此的类。
  2. 对于通用应用程序域,必须可以从 B 访问 A 中的类,所以我只看到错误的一种可能性:A 确实没有类 some.class.in.A。尝试检查这个类是否包含在 A 中(例如由 Sothink SWF Decompiler)或简单地检查这个类是否在 A 中的代码中显式使用。如果没有使用它不被包含,你可以强制包含通过在代码中添加这个类:只需在没有new 语句的A 中的某个位置添加some.class.in.A
  3. context.securityDomain 用于其他用途,仅在http加载swf文件时使用,不适用于本地。

【讨论】:

  • 对于#2,我相当确信该类实际上是在 A 中。原因是因为我正在以相同的顺序在 Scaleform 应用程序中加载这些相同的 SWF,并且所有内容都是工作得很好。有问题的类是一个非常常见的类,几乎无处不在。
  • 如果是这样,您必须提供这些 swf 文件,我会在演示中检查它们。顺便说一句,你的意思是 mxmlc.exe 而不是 compc.exe 因为最后一个编译 swc 库。
  • 我会尝试在某个时候得到一个更小的测试用例。不过,我确实是指 compc - 我在有关管道如何工作的问题中添加了更多细节。
猜你喜欢
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 2011-11-22
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多