开发者

AS3 Instantiate Class From External SWF

I was chatting with my buddy about this, he is convinced you can do this and says he has done it, but I cannot get this to work.

I am wondering if it is even possible at all. I tried typing a var as a Class that is within the externally downloaded SWF and then making an instance but no can do.

some code

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);

}

Error

Reference开发者_JAVA技巧Error: Error #1065: Variable Dashboard is not defined.

at global/flash.utils::getDefinitionByName()

at System$/onCompleteHandler()

So it seems you cannot make an instance of a class unless it is complied within the project SWF. Which if true is what I want it to do. I do not want people trying to make instances of my classes just from downloading the SWF file for what I am building here.

thanks


You need to do two things:

  1. Give Dashboard a package (package.to.Dashboard). Package-less classes are given different attributes (a protected namespace) in compiled form than those with packages, making them inaccessible to external SWFs.
  2. Ensure that your loaded SWF is loaded into the same ApplicationDomain as the parent

You should then be able to use getDefinitionByName from the loaded SWF and new the return Class.


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);
}


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.


I recommend using CASALib for this. I've created an entire app where I didn't know the class names until runtime. I just made some interfaces to ensure that the most important functions were always available. The CASALib util called LibraryManager has a function for instantiating a class from an external SWF.


You might want to do this:

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

getDefinitionByName() works for the classes loaded by the current swf not the external swfs. For external swf you need to give the reference of the loader object which actually loaded the particular swf.

Also, if you're doing this in FlashBuilder, make sure that the "main application" in the SWF you're loading is a Sprite (or possibly a MovieClip, though I didn't test that), not an Application (as you get in the default MXML file created for a new SWF project). Otherwise, the code above won't be able to find the class definition you're looking for.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜