Siv3Dと*.jarファイルでパイプ通信だ!
2017/11/14 追記
この方法でJar起動すると、Siv3Dの実行を止めてもJarが停止しません。ゾンビ化します。なので、パイプ通信で終了コマンドをJarファイルに作成して、Jarファイルが能動的に停止する必要があります。
お久しぶりです。このブログまだ記事が9個しかないんですねぇ、、、
はい!というわけで、どういうわけで(?)Siv3DとJavaでWindowsのパイプ通信を行います。Linuxのパイプとは少し状況が違って、標準入出力を実行中にくっつけてしまうイメージです。TCP通信みたいに使えるわけです。
が!そんな簡単にうまいこと行かないのがこの世界です。
Siv3DからJarファイルを起動しても、標準入出力がつながらないという問題が発生しました。
原因
Siv3DのPipeServerはダブルクリックで起動したときと同じ動作をしているようです(多分あってない)。Windowsの仕様で、Jarファイルをダブルクリックで起動しても、コマンドプロンプトで開かれる訳では無いようです。結果、Jarファイルを実行しても、標準入出力に接続されていません。
対策
ならば、コマンドプロンプトから開けるようにしてやればよいのです。ということで、おもむろに「execute_jar.bat」ファイルを作ります。ちなみに、WinPipe_Test.jarの中では、Siv3Dのサンプルと同じことをしています。
@echo off rem "excute_jar.bat" rem jarファイルを実行。echo offで実行時のコマンドを表示しない。 java -jar WinPipe_Test.jar
そして、Siv3Dからはこの「execute_jar.bat」ファイルを実行します。
# include <Siv3D.hpp> void Main() { // クライアントを起動 PipeServer server(L"execute_jar.bat"); if (!server) { return; } // /////////////////////////////////// while (System::Update()) { if (Input::KeyA.clicked) { Print(L"10*2="); server.write("10 2\n"); } if (Input::KeyB.clicked) { Print(L"3*4="); server.write("3 4\n"); } if (server.available()) { std::string str; server.read(str); Print(Widen(str)); } } server.write("quit\n"); }