Flex加载外部swf文件遇到的问题

3 篇文章 0 订阅

在一次加载外部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中有获得系统安装目录的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值