すごい質問を見つけた(と、UWSC用モールス・スクリプト)
UWSC公式掲示板ですごい質問を見つけた。
質問者さんには悪いと思うけど、あまりにあまりなので、私の受けた衝撃を書きたいと思う。
あと、おまけで最後に、UWSCでモールス信号を解釈するジョーク・スクリプトをつけた。
モールス信号の練習をしたい方はどうぞ!(笑)
問題の質問
VB.NETからuwscのexeを呼び出して、パラメータ2つintegerを受け取りたいのですが、ファイルの書き出しとかしないで受け取る方法。 VB.NET側も良くわからず調査してませんが、まずuwsc側はどうかと思い、お聞きします。 プログラム上でのパラメータ受け渡しが出来れば一番良いのですが、難しそうなので(少し調べたが良くわからないので)クリップボード等の様にどんなアプリでも使用出来そうなメモリはないものかと思いお聞きします。(クリップボードは他に使用するので、今回は使用出来ません。)
ま、普通の人にはよく判らないと思うので、少し改変します。
トライアスロンに参加して、完走したいのですが、競技用自転車を買う方法。 泳ぎ方も良くわからず調査してませんが、まず自転車はどうかと思い、お聞きします。 Web通販で買えれば一番良いのですが、難しそうなので(少し調べたが良くわからないので)百貨店の様にどんな自転車でも売ってそうな店はないものかと思いお聞きします。(近くの百貨店は自転車を扱ってないので、今回は使用出来ません。)
、、、どうですか。私の受けた衝撃、判ってもらえました?
泳ぎ方もわからないのに、トライアスロン、、、。
そして聞くのは、自転車の買い方。
確かに、街の自転車屋さんでは売ってないかもしれないけど、専門店やWeb通販で買えるよっ。
どこをどう調べたんだよ。
ってか、自転車買えても解決しないでしょ、、、泳げないじゃん、、、。
いや、センスが良くて問題にならないのかもしれなけいど、、、。
答える気力がなくなりまする。
ところでなぜ質問に答えるか?
一文の得にもならないのにね。
いや、得になるからです。私の場合ですが
- 素晴らしいソフトを作成されたumiumiさんの力になれる(ような気がする)
- 自分も興味ある(技術的に調べてみたい)
- 質問者さんに喜んでもらえるのが嬉しい(回答後、お礼がないと寂しい、、、)
この辺ですね。
今回のケースをあてはめると
- umiumiさんの力にはなりたい!(+1)
- 技術的に興味を持つことはない(答えは簡単)(0)
- 質問者さんのゴールは遠い(-1)
、、、答える気力は0になってしまいました、、、。
小言
体言止めかよ!
投げやりな感じをあたえるから、質問では避けましょう。
「お聞きします」って、、、
なんか微妙なんですよね、、、。
しかも二回連続。
もうちょっと、うっと思う人が出ない聞き方が良いと思います。
「教えてください」とか丁寧にしたいなら「お教え願います」とか。
夢は大きくても質問は小さく
ピンポイントで聞いた方が、答えはつきやすいですよ。
ということで今回の質問は
こうだったら、答えがつきやすかったかも。
VB.NETからuwscのexeを呼び出して、パラメータ2つintegerを受け取る方法を教えてください。 ファイル経由やクリップボード経由でない方法を探しているのですが、ちょっとわかりませんでした。 よろしくお願いします。
まあこれでも、調査が足らんだろ、という気はしますが。
また、受け取るのがUWSCのスクリプト側なのか、VB.NETのアプリなのか不明です、、、。
ちなみに回答
禁止事項は、ファイルとクリップボードだよね。
一杯あるねぇ。
簡単に思いつく系
コマンドライン引数で渡す(起動側(VB.NET)->起動された側(UWSC))
リターンコードに詰め込む(起動された側(UWSC)->起動側(VB.NET))
受け渡し用ウインドウに書く
メモリ領域系
メモリマップドファイル、RAM DISK(AWE APIとか)
最早何したいの系
MSGBOXを出しておき、押された秒数を利用する。
MSGBOXを出しておき、モールス信号として解釈する。
MSGBOXをYES/NOで出しておき、固定長2進数として解釈する。
HTTPサーバーを立て、そこが受け渡し値を管理し、UWSCはIEオブジェクトでアクセスする。
大量ですよ!選り取り見取り。
検証は一切してないけど、DLL作っちゃだめ、という制約はないからどれでも可能なはず。
(多分、ほとんど作らなくてもいけるはずだけど)
最後のなんか、ロマンすら感じますね。
しかも受け渡し先の端末の物理位置にも縛られない。
案外素晴らしいかもしれない(インターネット接続必須になるけど)
GAEを使えば、無料でできるし。
他に何かあったかなぁ?
おまけ、UWSCでモールス信号スクリプト
モールスI/F用スクリプトです(笑)
Sendはその場でLeftClickしてしまうので、注意が必要。
Receiveは、MSGBOXをOKするまで受信するので、LeftClickはOKボタン以外でどうぞ。
(画面のどこをクリックしても、反応しちゃいます)
慣れないとなかなか上手く打てないですね。
懐かしいなぁ。
morse.uws
OPTION EXPLICIT IFB GET_UWSC_NAME = "morse.uws" THEN DIM s = MSGBOX("Receive(YES) Send(NO) End(CANCEL)", BTN_YES OR BTN_NO OR BTN_CANCEL) DIM b = "" SELECT s CASE BTN_YES THREAD Morse.ReceiveThread(TRUE) MSGBOX("Morse") Morse.StopReceiveThread() CASE BTN_NO WHILE b <> EMPTY IF LENGTH(b) THEN Morse.Send(b) b = INPUT("Send data") WEND DEFAULT // nop SELEND ENDIF MODULE Morse // モールス受信スレッド用 DIM _loop = TRUE // モールス受信内容 DIM _receive = "" // 単語区切り DIM _separator = " " // 短点長さ(msec)、長点は短点*3、文字間隔は短点*3、語間隔は短点*7 DIM _term = 100 // 人間用には100msecがおすすめ。40msecが限界かも DIM _s = _term * 0.001 DIM _l = _term * 0.003 DIM _w = _term * 0.004 // 設定変更用 DIM _change = FALSE DIM _timeOut = 500 // 使用ボタン DIM _receiveBtn = VK_LBUTTON DIM _sendBtn = LEFT // モールス符号テーブル HASHTBL _table // 逆変換用テーブル HASHTBL _tableSend PROCEDURE Morse // モールス符号テーブルの登録。短点は「.」長点は「-」 // 数字の略体テーブル _table[".-"] = 1 _table["..-"] = 2 _table["...-"] = 3 _table["....-"] = 4 _table["....."] = 5 _table["-...."] = 6 _table["-..."] = 7 _table["-.."] = 8 _table["-."] = 9 _table["-"] = 0 // 逆変換用テーブルの作成 DIM i, m = LENGTH(_table) - 1 FOR i = 0 TO m _tableSend[_table[i, HASH_VAL]] = _table[i, HASH_KEY] NEXT FEND PROCEDURE Send(msg) DIM i, m = LENGTH(msg) FOR i = 1 TO m DIM b = COPY(msg, i, 1) IFB _tableSend[b, HASH_EXISTS] THEN PrivateSend(_tableSend[b]) ELSEIF b = _separator THEN SLEEP(_w) ELSE PRINT "Send unknown: " + b ENDIF NEXT FEND PROCEDURE PrivateSend(msg) DIM i, m = LENGTH(msg) FOR i = 1 TO m DIM b = COPY(msg, i, 1) SELECT b CASE "." BTN(_sendBtn, DOWN) SLEEP(_s) BTN(_sendBtn, UP) CASE "-" BTN(_sendBtn, DOWN) SLEEP(_l) BTN(_sendBtn, UP) DEFAULT PRINT "PrivateSend unknown: " + b SELEND SLEEP(_s) NEXT SLEEP(_s) SLEEP(_s) FEND PROCEDURE StopReceiveThread() _loop = FALSE FEND PROCEDURE ReceiveThread(bPrint) DIM s = (GETTIME() * 1000 + G_TIME_ZZ) / 1000 DIM b = FALSE, input = "", t = FALSE, word = "", n = 0.1 _loop = TRUE WHILE _loop n = (GETTIME() * 1000 + G_TIME_ZZ) / 1000 IFB GETKEYSTATE(_receiveBtn) THEN IFB !b THEN b = TRUE t = TRUE s = n ENDIF ELSE IFB b THEN IFB n - s < _l THEN input = input + "." ELSE input = input + "-" ENDIF b = FALSE s = n ELSEIF t THEN IFB n - s > _w THEN IFB LENGTH(word) THEN IFB bPrint THEN PRINT "ReceiveThread: " + word ELSE Wait(FALSE, TRUE) IF LENGTH(_receive) THEN _receive = _receive + _separator _receive = _receive + word Wait(TRUE, TRUE) ENDIF ENDIF word = "" t = FALSE ELSEIF n - s > _l THEN IFB _table[input, HASH_EXISTS] THEN word = word + _table[input] s = n ELSEIF LENGTH(input) THEN PRINT "ReceiveThread unknown: " + input s = n ENDIF input = "" ENDIF ENDIF ENDIF SLEEP(0.001) WEND FEND // マルチスレッド・同時アクセスを厳密にするなら、改良が必要 PROCEDURE Wait(chg, up) DIM w = _timeOut WHILE _change <> chg AND w > 0 SLEEP(0.001) w = w - 1 WEND IFB w > 0 THEN IF up THEN _change = !chg ELSE PRINT "!!! PrivateWait Timeout Error !!!" ENDIF FEND ENDMODULE