4

我正在和我的朋友聊天,他相信你可以做到这一点并说他已经做到了,但我无法让它发挥作用。

我想知道这是否可能。我尝试在外部下载的 SWF 中键入一个 var 作为类,然后创建一个实例,但无法做到。

一些代码

private static function onCompleteHandler(e:Event) {
dashboardObject = e.target.content;
// registerClassAlias("Dashboard", ); doesnt work
var dash:Class = getDefinitionByName("Dashboard") as Class;
var myDash = new dash();
trace(myDash.show);
}

错误

ReferenceError: Error #1065: Variable Dashboard is not defined.
at global/flash.utils::getDefinitionByName()
at System$/onCompleteHandler()

因此,除非在项目 SWF 中编译,否则您似乎无法创建类的实例。如果是真的,这就是我想要它做的。我不希望人们仅仅通过下载我在这里构建的 SWF 文件来创建我的类的实例。

谢谢

4

5 回答 5

7

你需要做两件事:

  1. Dashboard一个包裹(package.to.Dashboard)。与有包的类相比,无包类以编译形式被赋予不同的属性(受保护的命名空间),从而使外部 SWF 无法访问它们。
  2. 确保加载的 SWF 加载到与父级相同的 ApplicationDomain

然后您应该能够使用getDefinitionByName从加载的 SWF 和new返回的Class.

于 2009-10-28T16:24:13.773 回答
3
var loader:Loader = new Loader();
var req:URLRequest = new URLRequest("foo.swf");
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, fooLoadComplete);
loader.load(req);


function fooLoadComplete(e:Event):void
{
    var ClassDefinition:Class = e.target.applicationDomain.getDefinition("Symbol1") as Class;
    var sym1:MovieClip = new ClassDefinition();

    this.addChild(sym1);
}
于 2010-08-17T05:55:53.853 回答
0

您可能想要这样做:

var dash:Class = Loader(e.target).contentLoaderInfo
    .applicationDomain.getDefinition("Dashboard")  as  Class;

getDefinitionByName()适用于当前 swf 而不是外部 swf 加载的类。对于外部 swf,您需要提供实际加载特定 swf 的加载器对象的引用。

此外,如果您在 FlashBuilder 中执行此操作,请确保您正在加载的 SWF 中的“主应用程序”是Sprite(或者可能是 MovieClip,尽管我没有测试过),而不是应用程序(因为您获取为新 SWF 项目创建的默认 MXML 文件)。否则,上面的代码将无法找到您要查找的类定义。

于 2009-10-31T15:16:07.327 回答
0

So it seems you cannot make an instance of a class unless it is complied within the project SWF.

Try ModuleLoader class. See this article on how to create modules.

于 2009-10-28T03:13:56.693 回答
0

我建议为此使用CASALib。我创建了一个完整的应用程序,直到运行时我才知道类名。我只是做了一些接口,以确保最重要的功能始终可用。名为LibraryManager的 CASALib 实用程序具有从外部 SWF 实例化类的功能。

于 2009-10-30T15:25:34.140 回答