说实话,无论是以前的flashglobal 中的api  还是airglobal中的api或者是一些其他关于as3的一些api,有很多都很少接触到,虽然有气存在的价值,但实际当中用到的还是屈指可数。今天偶然想到以前看别人写的打包ATF的工具的时候有一个NativeProcess的用处,当时也只是一眼而过,并未切实的去学习。今天一时无聊百度ANE消遣来着,看看是否有什么新的东西,进入百度词条,看到这个类和ANE也有着相似之处。同样能够作为扩展来使用。但仅仅是局限于桌面应用。

NativeProcess是啥?

api文档给出的解释是

flash.desktop.NativeProcess – 用于 Adobe® Flash® Professional CS5 的 ActionScript® 3.0 参考 (ActionScript 3.0)

NativeProcess 类提供命令行集成和常规启动功能。NativeProcess 类允许 AIR 应用程序在主机操作系统上执行本机进程。AIR 应用程序可以监视进程的标准输入 (stdin) 和标准输出 (stdout) 流以及进程的标准错误 (stderr) 流。NativeProcess 类及其功能只对使用本机安装程序安装的 AIR 应用程序(扩展桌面配置文件应用程序)可用。调试时,可将 -profile extendedDesktop 参数传递到 ADL 以启用 NativeProcess 功能。在运行时,您可以检查 NativeProcess.isSupported 属性以确定是否支持本机进程通信。

使用本机安装程序安装的 AIR 应用程序(扩展桌面配置文件应用程序)也可以使用 File.openWithDefaultApplication 打开应用程序。但是,NativeProcess 类可提供对标准输入、标准输出和标准错误管道的直接访问。

总的来说就是,他可以调用外部的可执行文件如.exe 之类的,然后可以传递参数给执行文件,并执行相应的操作。

这样的话就达到了和本机通信的目的。

例子:以调用cmd为例,并输入命令 “ipconfig” 查询IP


private var mNativeProgress:NativeProcess;
public function NativeProgressTest()
{
var fileExe:File = new File("c:/Windows/system32/cmd.exe");
var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
nativeProcessStartupInfo.executable = fileExe;
var processArr:Vector.<String> = new Vector.<String>();

//这里一定要加上/c 然后再加上 平时我们可以在cmd里面输入的命令 然后 回车 即\n

//这个会作为一个参数传递给 cmd 然后就可以在STANDARD_OUTPUT_DATA事件中获取到cmd输出的一些信息
processArr[0] ="/c ipconfig\n";
nativeProcessStartupInfo.arguments = processArr;

mNativeProgress = new NativeProcess( );
mNativeProgress.start( nativeProcessStartupInfo);
mNativeProgress.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA,onOutPutHandler );
}
private function onOutPutHandler( e:ProgressEvent ):void
{
var _output:IDataInput = mNativeProgress.standardOutput;
trace( _output.readMultiByte( _output.bytesAvailable,"gbk") );
}

另外一种传递参数的写法,同样以打开cmd为例


private var mNativeProgress:NativeProcess;
public function NativeProgressTest()
{
var fileExe:File = new File("c:/Windows/system32/cmd.exe");
var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
nativeProcessStartupInfo.executable = fileExe;

mNativeProgress = new NativeProcess( );
mNativeProgress.start( nativeProcessStartupInfo);
mNativeProgress.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA,onOutPutHandler );

//我们可以用写入字节的形式传递参数给可执行程序 得到的结果都是一样的
mNativeProgress.standardInput.writeUTFBytes("ipconfig\n");
}
private function onOutPutHandler( e:ProgressEvent ):void
{
var _output:IDataInput = mNativeProgress.standardOutput;
trace( _output.readMultiByte( _output.bytesAvailable,"gbk") );
}

对于写好的AIR,无论是最终的发布版本 还是调试版本 得在xxx-app.xml 配置里面 写上

<supportedProfiles>extendedDesktop</supportedProfiles>

这样的一行配置。并且发布版本必须发布为可执行程序,即.exe格式的 而不能发布为.air格式 不然的话 就没法运行。

————————————————————————————————————————————

对于这个类 还有一个注意事项是,没法直接打开.bat文件,即  File里面的路径不能有.bat字样,不然会报错。

但其实我们可以通过调用cmd.exe 然后 将.bat文件以参数的形式传递给cmd 同时达到调用的目的。

如 将第一个例子中参数组装的那部分改为即可


var processArr:Vector.<String> = new Vector.<String>();
processArr[0] ="/c";
processArr[1] = "C:/Users/Administrator/Desktop/batTest.bat";
nativeProcessStartupInfo.arguments = processArr;

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Free Web Hosting