尝试着用用 AIR NativeProcess
说实话,无论是以前的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)
-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;