在一次加载外部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和Flash生成SWF文件时所遇到的加载(体积)问题。SWF是Adobe Flash Player用于播放多媒体内容的文件格式,它包含了动画、交互式图形以及声音等多种元素。 首先,我们需要理解Flex和...
在Flex中,我们可以使用Loader类来加载外部SWF文件。Loader不仅仅能加载简单的SWF内容,还能将其内容转换为特定的ActionScript类,这样就可以更灵活地进行交互和操作。关键在于使用LoaderContext并指定Application...
8. **编译与发布**:`bin-release`目录是编译后生成的release版本的文件存放位置,这通常包括编译后的SWF文件和相关的资源。 9. **HTML模板**:`html-template`可能包含了将Flex应用嵌入到HTML页面的模板文件,这...
这一步可以显著减少最终发布的SWF文件大小,因为调试信息通常占用了不小的空间。 2. **利用Runtime Shared Library (RSL)**: RSL是一种运行时组件共享库,允许同域内的项目共享资源,从而减小项目文件大小。通过...
在开发Flex应用程序时,可能会遇到一个问题,即默认情况下,Flex使用的是英文字体,这在显示中文内容时可能会出现不匹配或显示不全的情况。这篇博文将深入探讨如何解决Flex中使用中文设备字体的问题,以确保正确显示...
尽管Flex默认使用MXML和CSS来定义样式,但也可以通过ExternalInterface或使用ActionScript来应用CSS样式到SWF文件中的元素。这涉及到将SWF嵌入到支持CSS的环境中,并使用JavaScript或AS来桥接样式应用。 ### 31. AS...
这个标题暗示了开发者可能遇到的一个常见问题,即ItemRenderer(项渲染器)在实际需要之前就被加载,这可能导致性能下降或者不必要的资源消耗。 ItemRenderer是Flex和ActionScript中的关键组件,用于自定义列表或...
为了减小Flex生成的SWF文件大小,可以采取以下几种策略: 1. **RSL**:将公共库设置为RSL,这样只有在首次使用时才需要下载。 2. **模块化设计**:将应用程序分解成多个模块,按需加载,避免一次性加载所有资源。 3...
在这个阶段,Flex Compiler会将MXML和ActionScript代码编译成SWF文件。同时,系统也会创建`Application`类的一个实例,这通常被认为是Flex应用程序的起点。 **Flex应用程序的初始化阶段** 初始化阶段主要负责配置...
4. **错误处理**:在使用ExternalInterface时,可能会遇到如未加载FLASH对象、浏览器不支持ExternalInterface等问题,因此需要添加错误处理代码,以确保程序的健壮性。 5. **优化性能**:频繁的交互可能会对性能...
3. **加载air.swf文件**:air.swf文件是AIR在浏览器中的运行时,用于加载和执行AIR应用程序。 综上所述,Adobe AIR提供了一套完整的工具和API,使得开发者能够跨平台地创建和部署高质量的桌面、移动和电视应用程序...
4. **动作脚本链接(ASLinking)**:对于SWF文件,FD支持动作脚本链接,这意味着SWF中的资源可以在运行时按需加载,而不是在编译时合并到主SWF中,从而减小最终文件大小。 5. **预览和调试**:FD内置了Flash Player...
- **加载外部 SWF 文件**:指导如何加载外部的 SWF 文件。 以上内容涵盖了 ActionScript 学习文档的主要知识点,这些知识点不仅对于初学者非常有用,对于想要深入了解 ActionScript 的开发者来说也是非常宝贵的资源...