AS→(コマンドライン引数)→C++/C#のアプリ→(標準出力)→ASの連携を作ってみた。
FlashはWebアニメーションツールからスタートして、「一回作れば、いろんな環境でも同じように見れる」ことを大きな売りとして、ブラウザ内を主戦場に発展してきた。近年、AIRという仕組みでデスクトップアプリケーションも作れるようになったが、「いろんな環境でも同じように見れる」というコンセプトが足を引っ張ってか、OS/ハードウェア環境に依存するような部分に関してはどうしても心もとない部分がある。
そこで、Flash部分に関してはOS/ハードウェア環境に依存しないままにして、その代わりFlash以外のアプリ/言語との連携をスムーズにしようってのが、ここで使っているNativeProcessや近々正式リリースされる予定のNative Extension。
弊社でもデジタルサイネージとして特定のハードウェアに特化した連携を作ったり、実験的にKinectを使ったコンテンツを作ってみたりしているので、使っている。
ここでは、AIRから、C++/C#によるアプリケーションをコマンドライン引数つきで呼び出し、アプリケーション側からAIRに対して標準出力で値を渡す、という連携の基本を紹介する。
C++とC#の例二つがあるが、ほぼ同じ処理を二つの言語で書いた。
ファイル
110915ascscpp.zip
開発環境は、Windows7 64bit、Microsoft Visual C++ 2010 Express、C# 2010 Express、FlashDevelop 4.0.0 beta2
(たぶん、Visual Studio 2010 / Expressとかがインストールされてないと、動きません。)
ActionScript
まずは慣れているAIR側。C++またはC#のアプリをコマンドライン引数(arguments)つきで、NativeProcessを使って、起動する。NativeProcessには、標準出力を受け取るイベントを仕込んでおいてある。
こちらのコードでは、C#のアプリを呼び出すようになっているが、private var _fileName:String = ‘ConsoleApplication1.exe’;をコメントアウトにして、private var _fileName:String = ‘20110812c800.exe’;のコメントアウトを外せば、C++のアプリが動く。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
package { import flash.desktop.NativeProcess; import flash.desktop.NativeProcessStartupInfo; import flash.display.Sprite; import flash.events.ProgressEvent; import flash.filesystem.File; import flash.text.TextField; /** * ... * @author umhr */ public class Main extends Sprite { /** * C#アプリケーションを呼び出すときに使う */ private var _fileName:String = 'ConsoleApplication1.exe';// C#アプリケーション /** * C++アプリケーションを呼び出すときに使う */ //private var _fileName:String = '20110812c800.exe';// C++アプリケーション private var _file:File = File.applicationDirectory.resolvePath(_fileName); private var _nativeProcess:NativeProcess; private var _textFeild:TextField = new TextField(); public function Main () { init(); } private function init():void { var text:String = ""; var arguments:Vector.<String>; var nativeProcessStartupInfo:NativeProcessStartupInfo; if (NativeProcess.isSupported && _file.exists) { // 引数(不要なら付けなくても良い) arguments = new Vector.<String>(); arguments[0] = 'from Adobe AIR'; arguments[1] = 'Boo'; nativeProcessStartupInfo = new NativeProcessStartupInfo(); nativeProcessStartupInfo.arguments = arguments; nativeProcessStartupInfo.executable = _file; _nativeProcess = new NativeProcess(); _nativeProcess.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData); _nativeProcess.start(nativeProcessStartupInfo); text += "NativeProcess.isSupported : " + NativeProcess.isSupported + "\n"; text += "file.exists : " + _file.exists + "\n"; text += "nativeProcess.running : " + _nativeProcess.running; } _textFeild.text = text; _textFeild.width = stage.stageWidth; _textFeild.height = stage.stageHeight; _textFeild.selectable = false; _textFeild.multiline = true; _textFeild.wordWrap = true; this.addChild(_textFeild); } /** * 標準出力から読む * @param event */ private function onOutputData (event:ProgressEvent):void { _textFeild.text = _nativeProcess.standardOutput.readUTFBytes(_nativeProcess.standardOutput.bytesAvailable); } } } |
C#
引数を受け取ったら、標準出力に出す。ASに近い書き方なので、ちょっと嬉しい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System; class text01 { public static void Main(string[] args) { // argsの長さだけ出力。 // argsの長さはargs.Lengthで取得する。 for (int i = 0; i < args.Length; i++) { Console.WriteLine(args[i]); } //改行が入る。 Console.WriteLine(DateTime.Now.ToString()); //改行が入らない。 Console.Write("This is C# application."); //キー操作を待つ。 Console.ReadKey(); //これによって、デバッグ時、 //コンソールウィンドウがすぐに閉じない。 } } |
C++
引数を受け取ったら、標準出力に出す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include "stdafx.h" using namespace System; int main(array<System::String ^> ^args) { // argsの長さだけ出力。 // argsの長さはargs->Lengthで取得する。 for(int i=0; i<args->Length; i++){ Console::WriteLine(args[i]); } //改行が入る。 Console::WriteLine(L"Hello World"); //改行が入らない。 Console::Write("This is C++ application."); //キー操作を待つ。 Console::ReadKey(); //これによって、デバッグ時、 //コンソールウィンドウがすぐに閉じない。 return 0; } |
Native Extensionについて
Native Extensionについて詳しく知りたい場合は次が参考になる。
- Adobe AIR と ActionScript Native Extensions (ANE) – akihiro kamijo
- AIR 3 Native Extension Series « AKABANA
http://cuaoar.jp/2011/09/adobe-air-actionscript-n.html