HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0315
葡萄色実行中のjava.exeを外部から操作する15解決


葡萄色

リンク

2014/3/15(Sat) 02:05:59|NO.60650

現在Minecraftのサーバー用にランチャーを拵えています。
サーバーはJAR版を使用しており、以下のようにサーバー本体をEXEC命令で直接JAVAW.EXEに投げて実行させています。
exec "\"C:\\Program files\\Java\\jre7\\bin\\java.exe\" -Xms1024M -Xmx1024M -jar サーバー本体のファイル名.jar nogui"

なるべくスマートにしたいため、最後にnoguiを指定してサーバーの画面を出さないようにしているのですが、これではサーバーに対してコマンド入力が不可能なので困ります。 というわけでHSPからJAVAW.EXEに対してコマンド入力および実行操作をしたいのですが、方法をご教授お願いします。 そもそも、コマンド入力を(何かしらの形で)受け付けているのかさえ怪しいですが・・・。 できればログの取得等の方法もお願いします。 (参考URL)ttp://www26.atwiki.jp/minecraft/pages/1074.html (補足) ・サーバーの終了、ユーザーのキックなどはコマンド入力しなければできない。 ・JAVA.EXEに投げて操作するのも見栄えが悪いのでしません(あの黒い画面を非表示にできて、なおかつHSP側から操作できれば別ですが) ケチが多くて申し訳ありません。



この記事に返信する


YSR

リンク

2014/3/15(Sat) 03:25:44|NO.60654

よく分からん世界だが、別に自動操作でズルしたいとかそういった用途じゃないよね?
アプリケーションにコマンドを送るには、
・hspext.asをincludeして、aplselで捕獲したウィンドウをaplactでアクティブにしてaplkeyでキーコード送信
・aplactを使ったりWinAPIを叩いたりしてアクティブにしたウィンドウに、
 llmod3/llmod3.hspとllmod3/input.hspをincludeして使えるkeybd_eventでキーコードを送信

などの方法がある。試してみてちょ



葡萄色

リンク

2014/3/15(Sat) 12:18:41|NO.60664

投稿した内容が環境のせいか改行が無くなり、大変見づらくなってしまって申し訳ありません。

>>YSRさん
サーバーを起動する際、見栄え上noguiモードで実行しており、ウィンドウ自体が表示されないようにしています。
ですので、hspextやllmod3などのウィンドウの捕獲を用いた制御は不可能かと思われます。
それとウィンドウ捕獲の仕様には個人的に気に入らない点がありますし。



(’’

リンク

2014/3/15(Sat) 15:10:13|NO.60668

jarをHSPで操作するのは必要なんでしょうか?
参考リンクにバッチファイルの作り方があるのでランチャーはそれで構わないと思いますが…
コマンドプロントが出るようなのでコマンドを随時入力すればいいと思います



葡萄色

リンク

2014/3/15(Sat) 15:21:24|NO.60670

あの、別に悪用しようとかそういう企みがあるわけじゃないですよ。
Minecraftのサーバーは個人で建てるものですし、自分が建てたサーバーに自分で不正したって意味ないですし。

>>(’’さん
外部から見えていないコマンドを受け付けている状態であろうプロセスにコマンドを送る方法を聞いているのであって、根本的に必要性があるのかと聞かれると少々困ります。
見栄えと機能性を充実させたいだけなので。
申し訳ありません。



(’’

リンク

2014/3/15(Sat) 18:50:09|NO.60682

質問文でいろんな事を聞きまくっててよくわかりません
あとすいません、自分はminecraftのサーバーは使ったこと無いのでこれ以上答えられません



葡萄色

リンク

2014/3/15(Sat) 20:55:18|NO.60690

>>(’’さん
わかりました。
やはり、読みづらいようなので質問内容をまとめます。
・JARファイルを非表示(ウィンドウなし)で実行し、起動したjavaw.exeに対してコマンドを送り、ログも取得したい
・見栄え重視なのでウィンドウを表示した状態にはしたくない

で、JARファイルの実行方法ですが、以下のように実行しています。
exec "\"C:\\Program files\\Java\\jre7\\bin\\java.exe\" -Xms1024M -Xmx1024M -jar ファイル名.jar nogui"




amon

リンク

2014/3/15(Sat) 22:10:19|NO.60693

Minecraftというのは知らないですが、いわゆるコンソールアプリならパイプを使って入出力を制御できます。
HSPにも標準でpipeexecがありますし、APIを使ったサンプルも検索すれば出てくると思います。



葡萄色

リンク

2014/3/16(Sun) 20:14:49|NO.60720

>>amonさん
ありがとうございます。
パイプを使った方法には着目してはいたのですが、まさかhspextにそんな命令があったとは・・・。

それでpipeexecを使ってサーバーを起動させてみたのですが、ログはpipeexecの機能によって取得可能ですが、コマンドの送り方がわかりません。
パイプでデータを送る方法も検索したものの、上手く条件が絞れず、見つけることができませんでした。
ご教授お願いします。



YSR

リンク

2014/3/16(Sun) 21:52:29|NO.60722

> パイプでデータを送る方法
pipeput命令を使えば、1バイトづつコードを送ることができますよ。



葡萄色

リンク

2014/3/17(Mon) 12:33:00|NO.60728

>>YSRさん
pipeputのコードをキーコードという解釈で実験してみたところ、パイプで接続されてる先に特に変化はありませんでした。
(一応、notepad.exe、cmd.exeでも試しました)
pipeputが指すコードとは何ですか。



koya

リンク

2014/3/17(Mon) 20:10:23|NO.60740

前に質問した時のスクリプト(コピペ)

#module #uselib "kernel32.dll" #func __GetEnvironmentVariableA "GetEnvironmentVariableA" sptr,sptr,sptr #func __CreatePipe "CreatePipe" sptr,sptr,sptr,sptr #func __CreateProcessA "CreateProcessA" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr #func __WaitForSingleObject "WaitForSingleObject" sptr,sptr #func __PeekNamedPipe "PeekNamedPipe" sptr,sptr,sptr,sptr,sptr,sptr #func __CloseHandle "CloseHandle" sptr #func __ReadFile "ReadFile" sptr,sptr,sptr,sptr,sptr #defcfunc Misc_Pipe str p1,array p2,local ss,local ii,local jj,local hh,local nn,local rr : sdim ss,512 :ss = "COMSPEC" __GetEnvironmentVariableA varptr(ss),varptr(ss),512 : if (stat == 0) {return 0} : jj = 12,0,1 :ss += " /c "+p1 __CreatePipe varptr(hh),varptr(nn),varptr(jj),262144 : dim jj, 17 :ii = 68,0,0,0 : jj(11) = $101,0,0,nn,nn,nn __CreateProcessA 0,ss,0,0,1,0,0,0,varptr(jj),varptr(ii) : if (stat == 0) {return 0} :__CloseHandle ii(1) __WaitForSingleObject ii,-1 :__CloseHandle nn: sdim p2,262144 :await 20 __PeekNamedPipe hh,0,0,0,varptr(jj),0 :__ReadFile hh, varptr(p2),jj,varptr(rr),0 :__CloseHandle hh return rr #global iTxt = "ここにjar名?" ; mTxt = "" ; gTxt = "" ; :font msmincho,12 :objmode 3 :input iTxt,640-68,24 pos 640-66,0 :button gosub "じっこう",*label_1 pos 0,26 :mesbox mTxt,640,480-28,1 stop *label_1 if (Misc_Pipe(iTxt,gTxt)) {objprm 2,gTxt} ;refstrはある大きさを超えると再確保する必要があるので変数で受け取っています。 ;STDERRも同一視して取得しています(awk等のヘルプ) return



koya

リンク

2014/3/17(Mon) 20:37:42|NO.60741

bukkitをつかえばかんたんです。
本格的にやるならC#やC、VBがおすすめ

#module #uselib "kernel32.dll" #func __GetEnvironmentVariableA "GetEnvironmentVariableA" sptr,sptr,sptr #func __CreatePipe "CreatePipe" sptr,sptr,sptr,sptr #func __CreateProcessA "CreateProcessA" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr #func __WaitForSingleObject "WaitForSingleObject" sptr,sptr #func __PeekNamedPipe "PeekNamedPipe" sptr,sptr,sptr,sptr,sptr,sptr #func __CloseHandle "CloseHandle" sptr #func __ReadFile "ReadFile" sptr,sptr,sptr,sptr,sptr #defcfunc Misc_Pipe str p1,array p2,local ss,local ii,local jj,local hh,local nn,local rr : sdim ss,512 :ss = "COMSPEC" __GetEnvironmentVariableA varptr(ss),varptr(ss),512 : if (stat == 0) {return 0} : jj = 12,0,1 :ss += " /c "+p1 __CreatePipe varptr(hh),varptr(nn),varptr(jj),262144 : dim jj, 17 :ii = 68,0,0,0 : jj(11) = $101,0,0,nn,nn,nn __CreateProcessA 0,ss,0,0,1,0,0,0,varptr(jj),varptr(ii) : if (stat == 0) {return 0} :__CloseHandle ii(1) __WaitForSingleObject ii,-1 :__CloseHandle nn: sdim p2,262144 :await 20 __PeekNamedPipe hh,0,0,0,varptr(jj),0 :__ReadFile hh, varptr(p2),jj,varptr(rr),0 :__CloseHandle hh return rr #global iTxt = "java -jar -Xms1024M -Xmx1024M -jar craftbukkit-1.6.4-R2.0.jar" ; mTxt = "" ; gTxt = "" ; pos 640-66,0 :goto *label_1 pos 0,26 :mesbox mTxt,640,480-28,1 stop *label_1 if (Misc_Pipe(iTxt,gTxt)) {objprm 2,gTxt} return



葡萄色

リンク

2014/3/17(Mon) 23:55:10|NO.60756

>>koyaさん
わざわざソースまでありがとうございます。
しかし、ソースを見てもコマンドを送っているような記述が見当たりませんでした。
それと、何故bukkitを使用すると便利なのでしょうか。

ここで質問文、および後に整理した内容でも説明が不十分さを感じたので追記します。
・起動中のjava.exeにリアルタイムでコマンド入力/ログ読み出しすることを目指しています
・Minecraftのサーバーは恐らくコンソールアプリケーションです

なんかレス数がすっかり長くなってしまい申し訳ありません



amon

リンク

2014/3/18(Tue) 00:45:41|NO.60757

>pipeputのコードをキーコードという解釈で実験してみたところ、パイプで接続されてる先に特に変化はありませんでした。
あのですね回答者はエスパーじゃないので具体的にどうやってるかを書かないとわからないです。
cmd.exeの例を出しますので参考にしてください。

#include "hspext.as" sdim out,1000000 sdim in,1000 sdim buf,100000 pipeexec out,"cmd.exe",0 mes "↓コマンド入力してください。(例:dir) 終了はexitです。 input in,640,25 mesbox out,640,430,0 repeat pipeget buf if stat==0:break if buf!=""{ objprm 1,out sendmsg objinfo_hwnd(1),0x00B1,-2,-2 sendmsg objinfo_hwnd(1),0x00B7,0,0 buf="" } wait 5 stick k if k&32{ repeat strlen(in) pipeput peek(in,cnt) loop pipeput 10 objprm 0,"" } loop end



葡萄色

リンク

2014/3/18(Tue) 01:29:37|NO.60758

>>amosさん
確かに、最低限ソース程度は貼っておくべきでした。
申し訳ありません。
そして私の下手な説明を解釈して頂きありがとうございます。

私の説明力が低いために皆さんにご迷惑をおかけしました。
質問事項は無事解決できました。
ありがとうございます。



ONION software Copyright 1997-2021(c) All rights reserved.