|
|
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側から操作できれば別ですが)
ケチが多くて申し訳ありません。
|
|
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"
|
|
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の機能によって取得可能ですが、コマンドの送り方がわかりません。
パイプでデータを送る方法も検索したものの、上手く条件が絞れず、見つけることができませんでした。
ご教授お願いします。
|
|
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が指すコードとは何ですか。
|
|
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
| |
|
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のサーバーは恐らくコンソールアプリケーションです
なんかレス数がすっかり長くなってしまい申し訳ありません
|
|
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さん
確かに、最低限ソース程度は貼っておくべきでした。
申し訳ありません。
そして私の下手な説明を解釈して頂きありがとうございます。
私の説明力が低いために皆さんにご迷惑をおかけしました。
質問事項は無事解決できました。
ありがとうございます。
|
|