【问题标题】:Load encrypted swf into swfLoader in flex builder将加密的 swf 加载到 flex builder 中的 swfLoader
【发布时间】:2013-09-22 22:20:33
【问题描述】:

我想将加密的 swf 加载到 flex builder 中的 SWFLoader 中。这是我尝试过的代码。 我收到一个错误 TypeError: Error #1006: value is not a function. 请给我解决方案。我要制作加密的 swf 加载器。

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
                    xmlns:ns1="*"
                    width="100%" height="100%" layout="absolute" name="Content"
                    showStatusBar="false" applicationComplete="decrypt()">

<mx:Script> 
    <![CDATA[
        import com.hurlant.crypto.symmetric.AESKey;
        import com.hurlant.crypto.symmetric.DESKey;
        import com.hurlant.util.Hex;

        import flash.net.FileFilter;
        import flash.net.FileReference;
        import flash.utils.ByteArray;

        import mx.controls.Alert;
        import mx.controls.SWFLoader;
        import mx.preloaders.Preloader;


        private static var stream:FileStream;
        private static var stream2:FileStream;
        private static var file:File;

        private var fileToEncrypt:ByteArray;

        private function decrypt():void
        {

            file = File.documentsDirectory.resolvePath("E:/Sampal.swf");

            fileToEncrypt = new ByteArray;

            stream = new FileStream();
            stream.open( file, FileMode.READ );
            stream.readBytes(fileToEncrypt);
            stream.close();

            var key:ByteArray = Hex.toArray("gayan123");
            var aes:AESKey = new AESKey(key);

            aes.decrypt(fileToEncrypt);


            loader.load(fileToEncrypt)

            //stream2 = new FileStream();
            //stream2.open( file, FileMode.READ);
            //stream2.writeBytes(fileToEncrypt);
            //stream2.close();
        }
    ]]>

</mx:Script>
<mx:SWFLoader id="loader" x="0" y="0" width="900" height="550" autoLoad="true"
              includeInLayout="true" scaleContent="true"/>

</mx:WindowedApplication>

【问题讨论】:

  • 错误出现在哪一行?

标签: actionscript-3 flash apache-flex encryption


【解决方案1】:

如果不考虑您正在做的事情的加密/解密方面,您需要在 Loader 类中使用的方法是 loadBytes(),它将异步地将 ByteArray 解析为图像或 SWF在你的情况下。

以下是您可以使用的方法:

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
                    xmlns:ns1="*"
                    width="100%" height="100%" layout="absolute" name="Content"
                    showStatusBar="false" applicationComplete="decrypt()">

<mx:Script> 
    <![CDATA[
        import com.hurlant.crypto.symmetric.AESKey;
        import com.hurlant.crypto.symmetric.DESKey;
        import com.hurlant.util.Hex;

        import flash.display.Loader;
        import flash.net.FileFilter;
        import flash.net.FileReference;
        import flash.utils.ByteArray;
        import flash.events.Event;
        import flash.system.LoaderContext;

        import mx.controls.Alert;
        import mx.controls.SWFLoader;
        import mx.preloaders.Preloader;

        private var decryptionLoader:Loader;
        private static var stream:FileStream;
        private static var stream2:FileStream;
        private static var file:File;

        private var fileToEncrypt:ByteArray;


        private function decrypt():void
        {

            file = File.documentsDirectory.resolvePath("E:/Sampal.swf");

            fileToEncrypt = new ByteArray;

            stream = new FileStream();
            stream.open( file, FileMode.READ );
            stream.readBytes(fileToEncrypt);
            stream.close();

            var key:ByteArray = Hex.toArray("gayan123");
            var aes:AESKey = new AESKey(key);

            aes.decrypt(fileToEncrypt);

            decryptionLoader = new Loader();
            decryptionLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, decryptionLoader_complete);
            var lc:LoaderContext = new LoaderContext();
            lc.allowLoadBytesCodeExecution = true; 
            decryptionLoader.loadBytes(fileToEncrypt, lc);

            //stream2 = new FileStream();
            //stream2.open( file, FileMode.READ);
            //stream2.writeBytes(fileToEncrypt);
            //stream2.close();
        }

        private function decryptionLoader_complete(evt:Event):void {
            decryptionLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loader_complete);
            //Your SWF has now been parsed and is ready to use e.g.:
            this.addChild(decryptionLoader.content);
        }
    ]]>

</mx:Script>
<mx:SWFLoader id="loader" x="0" y="0" width="900" height="550" autoLoad="true"
              includeInLayout="true" scaleContent="true"/>

</mx:WindowedApplication>

【讨论】:

  • 啊 - 我相信对于 AIR 部署,只有明确允许代码导入的额外要求。我已经通过添加编辑了我的答案。
  • 亲爱的 hanebro,如果我使用 "loader" 来 swfLoader id,我在 "private var loader:Loader;" 行中遇到错误。错误是 1151:与内部命名空间中的定义加载器存在冲突。
  • 对不起!我没有发现 MXML 部分已经使用了“加载器”。很高兴你让它工作了,我已经更新了示例以使用唯一的名称。
猜你喜欢
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
相关资源
最近更新 更多