在一次加载外部swf文件时发现因为这个swf文件本身有异常从而引发程序卡掉,通过浏览器打开也一样。 后来用swfinfo查看了下这个文件的信息,发现它是用flex3制作的,可能是因为编译时未选择代码合并造成的。 但我的目的是遇到这类文件直接提示并且不进行加载,但我发现无论如何都没有办法捕获这些异常,也就没有办法阻止它加载了。 异常如下:
VerifyError: Error #1053: Illegal override of activate in mx.managers.SystemManagerProxy.
ReferenceError: Error #1065: Variable _PublishPanel_mx_managers_SystemManager is not defined.
还好我发现swfinfo可以执行它并打印异常信息,于是我试图通过swfinfo来处理这个异常文件, 但是flex不像java可以直接像调用命令行一样调用外部程序,它必须先new一个File,但这个swfinfo很奇怪,如果执行时带上后缀名它是不能执行swf文件的,只是提取它的文件描述信息,如果不带后缀名就可以执行它并且可以打印异常。 这与flex的调用外部文件的方式不兼容。 后来采取借用cmd命令的方式来实现了。
var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
var cmdExe:File = new File("C:\\Windows\\System32\\cmd.exe");
var args:Vector.<String> = new Vector.<String>();
if (cmdExe && cmdExe.exists)
{
var nativePath:String = new File(url).nativePath;
var swfinfoFolder:String = File.applicationDirectory.resolvePath("bin").nativePath;
args.push("/C", swfinfoFolder + "/swfinfo", nativePath);
nativeProcessStartupInfo.executable = cmdExe;
nativeProcessStartupInfo.arguments = args;
process = new NativeProcess();
process.start(nativeProcessStartupInfo);
process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);
process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onErrorData);
process.addEventListener(NativeProcessExitEvent.EXIT, onExit);
process.addEventListener(IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, onIOError);
process.addEventListener(IOErrorEvent.STANDARD_ERROR_IO_ERROR, onIOError);
}
public function onOutputData(event:ProgressEvent):void
{
trace("Got: ", process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable));
}
public function onErrorData(event:ProgressEvent):void
{
trace("ERROR -", process.standardError.readUTFBytes(process.standardError.bytesAvailable));
}
public function onIOError(event:IOErrorEvent):void
{
trace("ioerror: ", event.toString());
}
public function onExit(event:NativeProcessExitEvent):void
{
if ( event.exitCode == 0 )
{
loadSWF();
}
else
{
Alert.show("Code: " + event.exitCode + "\n文件\"" + source + "\"有异常,请检查后重新加载");
}
}
也许这个方法并不优雅,但是它暂时解决了我的问题。 尤其是cmd命令只是固定读取位置,一旦它不在那儿就失效了。 我尝试了将这个命令文件拷贝到我的应用目录中并通过相对路径读取并运行它,目前没发现问题。 但不能保证它能在所有的windows平台通用。
如果哪位朋友有更好的办法还请指教,我没有发现flex中有获得系统安装目录的方法。
分享到:
相关推荐
Flex中加载SWF方法,介绍了flex 对 swf 加载和处理
flex加载swf的N种方法.zip
一个简单的flex加载外部swf文件并对其进行操作的源码程序
NULL 博文链接:https://412599526-qq-com.iteye.com/blog/1267664
该案例中TestLocalConnection为主SWF文件加载了TestLocalConnectionReceiver.SWF,两者之间是在同一个域下的通信,工程代码编译路径需要下载者手动修改下。其他技术细节参见Flex_API中的LocalConnection章节。本机...
Flex中加载其他SWF动画时,需要控制引入的SWF的播放进度
一个简单Flex控制SWF播放的范例。 内含一个Flash源码。 Import到Flex Builder就可以了
jsp中嵌套 flex 生成的 swf html 自己开发系统拓扑图的例子
flex读取xml文件的数据的三种方式及其比较
flex加载as2写的swf,内容是一个很雷的网页游戏AD
flex 动态加载css文件方法总结,增加flex的界面美化效果。简单易懂,易操作。
flexBulider页面加载动态图片的显示
这里讲述的是在Flex Application中嵌套一个SWF,然后实现Flex与SWF相互间的通讯。我们需要引入SystemManager接口实现。 环境:Eclipse + Flex Builder
利用flex开发web时,需要加载html,附件中时采用flex3做的示例。
用于在flex中缓存加载swf文件。 可用于组件模块化加载。加载完成的组件,下次加载可直接从SWFCache中根据url获取相应内容,避免重复加载 单个加载方式 var item:SWFItem = new SWFItem(); item.url = "module/...
Flex加载GIF动画处理类 ,Flex加载GIF动画处理类 ,Flex加载GIF动画处理类
实现文件上传下载到数据中,有上传精度条显示,可以上传MP3,MP4,txt等各种文件,可以再线浏览txt,word,excel等文件。
资源文件是Flex开发的5个辅助工具,全部是SWF格式文件
在页面里加载SWF文件并使之运动起来。加入状态控制。最后使SWF文件在mxml页面里360度的随机运动