[ 掲示板に戻る ]

過去ログ閲覧モード

毎行にsleepを挿入する / hiro
簡単に全ての行にsleepを挿入する事は出来るでしょうか?
UWSC DebuggerのTraceにチェックを入れると毎行辺りにsleepが入りますが、それと同じ事をUWSC単体でしたいと思っております。
もしくはUWSC Debuggerでスケジュール設定が出来れば、そちらでも大丈夫です。

よろしくお願い致します。

No.2634 2016/07/12(Tue) 22:23:40

Re: 毎行にsleepを挿入する / 森
面白そうなので作ってみました。

スリープを挿入して実行させたいUWSファイルと同じフォルダに、
以下を、auto_insert_sleep.uwsというファイル名で保存して実行してください。

auto_insert_sleep.uws
-------------------------------------------------------
// 同フォルダ内のUWSファイルをすべて取得
dim uws_n = getdir(GET_CUR_DIR, "*.uws")

dim files[uws_n]
dim i = 0; j = 0;
while i < uws_n
 if GETDIR_FILES[i] <> "auto_insert_sleep.uws"
  files[j] = GETDIR_FILES[i]
  j = j + 1
 endif
 i = i + 1
wend

if i = 0
msgbox("同フォルダ内に処理対象のUWSファイルがありません。")
exitexit
endif

// 実行するスクリプトファイルを選択する
dim file_name = slctbox(SLCT_BTN or SLCT_STR, 0, "実行するスクリプトファイルを選択", files)

// 挿入したいスリープの秒数
dim sleep_time = input("挿入したいスリープの秒数", 1)

// 仮ファイル名
dim temporary_script = "temporary_script.uws"

// 元のスクリプトを全行取得
dim f = fopen(file_name)
dim script = fget(f, f_alltext)
fclose(f)

// 先頭行と末尾行の空白行を一括削除
script = trim(script)

// 途中の空白行を削除
while pos("<#CR><#CR>", script) > 0
 script = replace(script, "<#CR><#CR>", "<#CR>")
wend

// 改行を改行+スリープに置換(=スリープの挿入)
script = replace(script, "<#CR>", "<#CR>sleep(" + sleep_time + ")<#CR>")

// スリープを挿入したスクリプトを仮ファイルに保存
f = fopen(temporary_script, f_write)
fput(f, script)
fclose(f)

// 仮ファイルを実行
doscmd(temporary_script)

// 仮ファイルを削除
deletefile(temporary_script)
-------------------------------------------------------

【特記事項】
・空白行は無視するように作りましたが、コメント行は考慮していないのでスリープが挿入されます。
・_(アンダーバー)を使って行結合している行にもスリープを挿入するのでエラーになります。
・TEXTBLOCK内も1行ごとにスリープを挿入てしまいます。

No.2636 2016/07/13(Wed) 15:37:35
UWSCの自作関数で本文の変数を使いたいです。 / るる
UWSCの自作関数で本文の変数を使いたいです。
a=1
abc(2,3)

FUNCTION abc(b,c)
RESULT=a+b+c
FEND

FUNCTION abc(b,c) こちらをいじるのは可ですが、
abc(2,3) こちらは変更しないでほしいです。
どうすればよいでしょうか。
よろしくお願いいたします。

No.2627 2016/07/12(Tue) 07:08:18

Re: UWSCの自作関数で本文の変数を使いたいです。 / sana
これでどうでしょう?

Public a = 1
abc(2,3)

Function abc(b,c)
result = a + b + c
Fend

No.2628 2016/07/12(Tue) 09:04:48

Re: UWSCの自作関数で本文の変数を使いたいです。 / るる
できました。
ありがとうございます。

No.2630 2016/07/12(Tue) 10:21:35
IE documentについての質問 / カフェオレ
HTMLソース1

<iframe src="http://〜" class="question_frame" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" height="1500px" width="728px"></iframe>
<form action="http://〜" method="post" id="adtech-form" accept-charset="utf-8">
<input id="choice_62386" name="question_13311" value="その他" required="" type="radio">

HTMLソース2

<input type="radio" class="selq" name="q1" value="5">


上記のソースでIE documentを用いて、クリックすることは可能でしょうか?

ご回答、よろしくお願いします。



P.S.
別の質問にて回答をいただいたのですが、返信期限がきていたので返信することが出来ませんでした。
そちらの質問内容については、ひとまず解決しましたので、この場を借りてお礼を申し上げます。
ありがとうございました。

No.2602 2016/07/06(Wed) 23:44:55

Re: IE documentについての質問 / stuncloud
> <input id="choice_62386" name="question_13311" value="その他" required="" type="radio">
ie.document.getElementById('choice_62386').click()

> <input type="radio" class="selq" name="q1" value="5">
ie.document.querySelector('input[type="radio"][name="q1"][value="5"]').click()

ラジオボタンならIESETDATAでも出来ると思いますよ

No.2603 2016/07/07(Thu) 09:41:23

Re: IE documentについての質問 / カフェオレ
ありがとうございます。

いただいた式を試しましたが…

ie.document.getElementById('choice_62386').click()
こちらの式ではCOMエラーが表示され。

ie.document.querySelector('input[type="radio"][name="q1"][value="5"]').click()
こちらの式では式がおかしい or 型が合っていないと表示され、両方とも実行することが出来ませんでした。


なにかやり方を間違えてしまったのでしょうか?

No.2619 2016/07/09(Sat) 00:56:12

Re: IE documentについての質問 / stuncloud
すいません、どっちもシングルクォーテーションになってました

ie.document.getElementById("choice_62386").click()
ie.document.querySelector("input[type=<#DBL>radio<#DBL>][name=<#DBL>q1<#DBL>][value=<#DBL>5<#DBL>]").click()

こうですね

No.2620 2016/07/11(Mon) 09:41:37

Re: IE documentについての質問 / カフェオレ
ありがとうございます。


いただいた二つのスクリプトで再度実行してみましたが…下記のエラーが出てしまいました。


COM Error:Could not convert variant of type (null) into type (Dispathc)

色々調べてみましたが、私では解決できませんでした…。

このエラーについてのご回答、または解決策が載っているホームページがあれば教えていただけたら幸いです。

よろしくお願いします。

No.2626 2016/07/11(Mon) 21:06:28

Re: IE documentについての質問 / stuncloud
> ie.document.getElementById("choice_62386")
> ie.document.querySelector("input[type=<#DBL>radio<#DBL>][name=<#DBL>q1<#DBL>][value=<#DBL>5<#DBL>]")

それぞれが見つけられなかった(nullになっている)のでclick()しようとしてもエラーになっています
考えられるのはそれぞれのラジオボタンがframeやiframeの下(別のdocument)にある場合です

frameやiframe以下にアクセスする方法は過去ログにあるはずなので、そちらを参照してください
掲示板の下の方にある
> 過去ログ(〜2016/02/26)・検索ツール
というリンクからダウンロードできます

あとは、最初の回答にも書きましたがIESETDATAも試してみてください
たしかframeやiframeにも対応していたような気がするんですが

No.2629 2016/07/12(Tue) 09:43:08
mmvの待ち時間 / ぽてと
32bitと64bitのwindows7上で同じコードを動かしたのですが
mmvの動作に明らかな速度の違いが見られました。

待ち時間を5ミリ秒に設定していたのですが64bitの方が明らかに遅いのです。
64bitの方の待ち時間を1ミリ秒にしてみてもほとんど変化はみられませんでした。

ただ64bitの待ち時間を0ミリ秒にした所、劇的に動作が速くなりましたが、早すぎて実用に耐えません。

64bit上での動作は待ち時間の処理等で遅延が発生する物なのでしょうか?

No.2617 2016/07/08(Fri) 20:10:36

Re: mmvの待ち時間 / routa
Windowsのタイマー精度は15ms程度なのでそれより短い時間は
環境によりあまり期待できないでしょうね。

No.2618 2016/07/08(Fri) 23:16:30
配列の中を並び替えしたいです / mike
※掲示板の管理者さまへ
 この投稿の下に、同じ投稿があるので、削除をお願いします。




よろしくお願いします。

以下のようなアンケート結果があります。

15499票 ルフィ
8990票 ロロノア・ゾロ
11301票 ナミ
501票 ウソップ
9528票 サンジ
7786票 トニートニー・チョッパー
5624票 ニコ・ロビン
4325票 フランキー
1317票 ブルック

これを、票の多い順に並び替えがしたいです。


自分では配列に入れるところまではできました。

dim rank[]="15499票 ルフィ","8990票 ロロノア・ゾロ","11301票 ナミ","501票 ウソップ","9528票 サンジ","7786票 トニートニー・チョッパー","5624票 ニコ・ロビン","4325票 フランキー","1317票 ブルック"


この配列を、先頭から票の多い順に並べ替えたいのですがどうすればよいでしょうか?

↓このようにしたいです。
dim rank[]="15499票 ルフィ","11301票 ナミ","9528票 サンジ","8990票 ロロノア・ゾロ","7786票 トニートニー・チョッパー","5624票 ニコ・ロビン","4325票 フランキー","1317票 ブルック","501票 ウソップ"


QSORTで並べ替えができるようなのですが、説明を見てもよくわかりません。
varについても調べたのですが、これも説明を見てもピンときません。

表計算ソフトでもできるのですが、やりたいことは並び替えだけではないので、UWSCでやりたいです。


実際は、これよりもずっとキャラの数が多くて、手作業だときついです。

お知恵をお貸しください。
よろしくお願いします。

No.2609 2016/07/08(Fri) 09:11:08

Re: 配列の中を並び替えしたいです / stuncloud
> QSORTで並べ替えができるようなのですが
msgbox("QSORT前<#CR>" + join(rank, "<#CR>"))
qsort(rank, QSRT_NATURALD) // 並べ替える
msgbox("QSORT後<#CR>" + join(rank, "<#CR>"))

> この投稿の下に、同じ投稿があるので、削除をお願いします
掲示板の一番下のフォームからご自分で記事削除できますよ

No.2610 2016/07/08(Fri) 09:39:08

Re: 配列の中を並び替えしたいです / mike
stuncloudさん、ありがとうございます。

教えていただいたものですが、どうしてこうなるのか、全く理解できないという知識レベルです。すみません。


そのままやってみました。

dim rank[]="15499票 ルフィ","8990票 ロロノア・ゾロ","11301票 ナミ","501票 ウソップ","9528票 サンジ","7786票 トニートニー・チョッパー","5624票 ニコ・ロビン","4325票 フランキー","1317票 ブルック"

msgbox("QSORT前<#CR>" + join(rank, "<#CR>"))
qsort(rank, QSRT_NATURALD) // 並べ替える
msgbox("QSORT後<#CR>" + join(rank, "<#CR>"))


そうすると、「変数: QSRT_NATURALD が定義されていません」と表示されてしまいます。

どのようにすれば、並べ替えた配列にすることができますか。
コード自体が理解できないため、教えていただいたものに手を加えることができません。。


> 掲示板の一番下のフォームからご自分で記事削除できますよ

一応パスワードを設定したのですが、投稿時に再読み込みを何回かしたためか、投稿の編集・削除ができなくなってしまいました。
ですので、管理者さまに削除をお願いしています。

No.2611 2016/07/08(Fri) 12:51:12

Re: 配列の中を並び替えしたいです / stuncloud
>「変数: QSRT_NATURALD が定義されていません」
UWSC 5.1.1 で追加された定数です
それより前のバージョンでは使えません
最新版をダウンロードして試してみてくだい

No.2612 2016/07/08(Fri) 14:32:31

Re: 配列の中を並び替えしたいです / mike
知人と相談して考えてみました。

その間に返信までいただいて申し訳ないです。


stuncloudさんは、今回の場合の配列の並び替えではなく、QSORTの一般的な使い方を教えてくださったのですね。

やっと理解できました。


やっぱり、今回の場合の配列だと、簡単にできるものではないのですね。

No.2613 2016/07/08(Fri) 15:16:32

Re: 配列の中を並び替えしたいです / mike
stuncloudさん、ありがとうございました。
No.2614 2016/07/08(Fri) 15:19:24

Re: 配列の中を並び替えしたいです / stuncloud
> やっぱり、今回の場合の配列だと、簡単にできるものではないのですね。
いえ、今回の場合の話ですけど…?
QSRT_NATURALDによっておそらくご希望の通り数値が大きなものから順に並べ替えられるのを確認していますが、うまくいきませんでしたか?

No.2615 2016/07/08(Fri) 16:26:13

Re: 配列の中を並び替えしたいです / mike
お手数をおかけして大変申し訳ありません!

できました! あれだけ手間がかかっていた作業が一瞬でした・・・(涙)


最初、早くに返信くださっていたのに、レベルが低くてすみません。

stuncloudさんの技術がすごくて、いまだに、どうしてこれでうまくいくのか理解できませんが、
こんなド素人に何回も返信くださって、ご親切に感謝です。


stuncloudさんと、UWSCに感動しました。いや、まじです。

No.2616 2016/07/08(Fri) 17:12:15
最大化ボタンを押すとニコニコトップに飛ばされる、どうして? / すすむ
これで最大化ボタンを押す設定をすると
なぜかニコニコにトップ(http://www.nicovideo.jp/?header )に
飛ばされます。なぜなんでしようか?
どのように修正すればいいのか教えて下さい

ddddd.uws
----- はじまり -----------

//最大化ボタン画像を設定する ---------------

fol1 = "D:\cap\"

saidai = "最大化ボタン画像"

bmp = ".bmp"

saidaiP = fol1 + saidai + bmp

// -----------------------------


// グーグルクロームの起動
EXEC("D:\GoogleChromePortable\GoogleChromePortable.exe" )
cid = GETID("Google Chrome","Chrome_WidgetWin_1",-1)

SLEEP(0.1)

ACW(cid,710,275,980,720,500) // ブラウザの位置サイズ固定


// ソリテアのURLを開く(※ニコニコには事前にログインしたままの状態にしておく)
// SCKEY(gid,VK_F6)
SENDSTR(cid,"http://app.nicovideo.jp/watch/ap349",1,True)
SCKEY(cid,VK_RETURN)

SLEEP(5)

MOUSEORG(cid,MORG_DIRECT,MORG_FORE) // ブラウザをターゲットして相対位置

CTRLWIN( cid, ACTIVATE ) // ブラウザをアクティブ

//最大化ボタンを押す
repeat
Sai = CHKIMG(saidaiP,,ST_X,ST_Y,,,1)
SLEEP(0.5)
until Sai
BTN(LEFT,CLICK,G_IMG_X+10,G_IMG_Y+10,25) // 最大化ボタンを押す

SLEEP(0.5)
sai = CHKIMG(saidaiP,,ST_X,ST_Y,,,1)
while sai
BTN(LEFT,CLICK,G_IMG_X+10,G_IMG_Y+10,25) // 最大化ボタンを押す
SLEEP(0.5)
CTRLWIN( cid, ACTIVATE ) // ブラウザをアクティブ
sai = CHKIMG(saidaiP,,ST_X,ST_Y,,,1)
wend

---------- end ---------

No.2592 2016/07/03(Sun) 11:19:46

Re: 最大化ボタンを押すとニコニコトップに飛ばされる、どうして? / すすむ
補足 最大化ボタンは、ニコニコアプリ内の最大化ボタンです
ソリテアのゲームサービスを開始すると、右上の方に出てきます。
(サービス開始しないと出てきません)

No.2593 2016/07/03(Sun) 11:50:14

Re: 最大化ボタンを押すとニコニコトップに飛ばされる、どうして? / ある
原因はCHKIMGで使用する画像に問題があるように思います。画像と画面を見てないので推測ですが。

最大化はCtrlwin(cid,max)ではダメなんでしょうか?
あとブラウザ操作系はIEでCOM操作の方が確実な事が多いと思います。
どうしてもクロームで!という拘りがあるのでなければ…

No.2595 2016/07/03(Sun) 17:56:12

Re: 最大化ボタンを押すとニコニコトップに飛ばされる、どうして? / すすむ
返信ありがとうございます
>最大化はCtrlwin(cid,max)ではダメなんでしょうか?
ブラウザ全体の最大化はしたくいないのです

>画像と画面を見てないので推測ですが。
ちゃんと見てから返信して下さい。
何も見ないで適当に語られても、こちらは困ります

>どうしてもクロームで
どうしてもクロームでやりたいのです

No.2596 2016/07/03(Sun) 18:06:42

バグ、不具合の報告として補足します。 / すすむ
とりあえず、不具合、バグの報告として追記します。


最大化ボタン画像.bmp
www.fastpic.jp/images.php?file=8634927115.bmp

ブラウザのソリテア画面のキャプ
i.imgur.com/fpKTQg8.png



ddddd.uws
----- はじまり -----------

//最大化ボタン画像を設定する ---------------

fol1 = "D:\cap\"

saidai = "最大化ボタン画像"

bmp = ".bmp"

saidaiP = fol1 + saidai + bmp

// -----------------------------


// グーグルクロームの起動
EXEC("D:\GoogleChromePortable\GoogleChromePortable.exe" )
cid = GETID("Google Chrome","Chrome_WidgetWin_1",-1)

SLEEP(0.1)

ACW(cid,710,275,980,720,500) // ブラウザの位置サイズ固定


// ソリテアのURLを開く(※ニコニコには事前にログインしたままの状態にしておく)

SENDSTR(cid,"http://app.nicovideo.jp/watch/ap349",1,True)
SCKEY(cid,VK_RETURN)

SLEEP(5)

MOUSEORG(cid,MORG_DIRECT,MORG_FORE) // ブラウザをターゲットして相対位置

CTRLWIN( cid, ACTIVATE ) // ブラウザをアクティブ

//最大化ボタンを押す
repeat
Sai = CHKIMG(saidaiP,,ST_X,ST_Y,,,1)
SLEEP(0.5)
until Sai
BTN(LEFT,CLICK,G_IMG_X+10,G_IMG_Y+10,25) // 最大化ボタンを押す

---------- 終わり ---------



MOUSEORG(cid,MORG_DIRECT,MORG_FORE) の所を

MOUSEORG(cid,MORG_CLIENT,MORG_FORE) にすると安定したりする。


MORG_DIRECTにすると、なぜかChromeブラウザの一番左上の四角い画像の方を

クリックしてしまって、ニコニコのトップURL

( www.nicovideo.jp/?header )に飛ばされます

飛ばされたり飛ばされなかったり、PCの負荷や環境によって不安定です。

マウスカーソルがブラウザのどこかの画面クリックの位置にあったりすると

100% ニコニコのトップに飛ばされます。

No.2597 2016/07/04(Mon) 00:25:03

Re: 最大化ボタンを押すとニコニコトップに飛ばされる、どうして? / miles
下記のようにすれば、最大化がクリックできるかと...
(一応確認はしましたよ)

repeat
// Sai = CHKIMG(saidaiP,,ST_X,ST_Y,,,1)
 Sai = CHKIMG(saidaiP)
 SLEEP(0.5)
until Sai
// BTN(LEFT,CLICK,G_IMG_X+10,G_IMG_Y+10,25) // 最大化ボタンを押す
MOUSEORG(0) // スクリーン座標に戻す
BTN(LEFT,CLICK,G_IMG_X+10+STATUS(cid,ST_X),G_IMG_Y+10+STATUS(cid,ST_Y),25)

No.2599 2016/07/04(Mon) 11:50:58

Re: 最大化ボタンを押すとニコニコトップに飛ばされる、どうして? / ある
いえいえ、chkimgに使った画像がどんなものか確認のしようがないということですよ。
貼られてない以上、こちらで確認をすることは出来ませんでしたよね。伝わると思ったのですが、、、

No.2601 2016/07/04(Mon) 21:00:40

Re: 最大化ボタンを押すとニコニコトップに飛ばされる、どうして? / すすむ


> 最大化ボタン画像.bmp
> www.fastpic.jp/images.php?file=8634927115.bmp


返信遅れましたが、
ここに貼ってありますよ。
ちゃんと見て下さいね

No.2604 2016/07/08(Fri) 01:13:49

Re: 最大化ボタンを押すとニコニコトップに飛ばされる、どうして? / すすむ
>下記のようにすれば、最大化がクリックできるかと...
>(一応確認はしましたよ)
>repeat
>// Sai = CHKIMG(saidaiP,,ST_X,ST_Y,,,1)
> Sai = CHKIMG(saidaiP)
> SLEEP(0.5)
>until Sai
>// BTN(LEFT,CLICK,G_IMG_X+10,G_IMG_Y+10,25) // 最大化ボタンを押す
>MOUSEORG(0) // スクリーン座標に戻す
>BTN(LEFT,CLICK,G_IMG_X+10+STATUS(cid,ST_X),G_IMG_Y+10+STATUS(cid,ST_Y),25)


スクリーン座標に戻すのにMOUSEORG(0)という表現は初めて見ました
ありがとうございます。
なるべくならスクリーン座標という広大な範囲は使いたくないのですが
画像サムネイルを表示しただけで、誤検知する恐れもありますので
G_IMG_X+10+STATUS(cid,ST_X)という書き方も、参考になりました。ありがとうございます。
他の機会で使ってみようかと思います。

No.2605 2016/07/08(Fri) 01:19:43
uwscの基本的な使い方がわかった後の次のステップについて / シスイ
UWSCに出会ってパソコンでできることの可能性がかなり拡がりました。
UWSCの基本は理解できた後の次のステップとして、どの分野を勉強すればいいのでしょうか?
私のしたいことが、サイト作成やスクレイピングの精度向上等です。
よく、PowerShell(コマンドプロンプトの進化版)やvbscriptという単語を見かけるのですが、こちらを勉強すればいいのでしょうか?
質問ばかりで申し訳ないですが、回答頂ければありがたいです。

No.2587 2016/07/02(Sat) 09:36:00

Re: uwscの基本的な使い方がわかった後の次のステップについて / ある
気持ちわかります。僕もUWSCに出会ってすぐは発見の連続でした。
サイト作成、スクレイピングをということですが、これはどの程度の代物を目指すのかによるかと。
例えばスクレイピングで言えば、僕もしょっちゅうやっているけれど、今までUWSCの基本機能
(COM操作含む)だけで困ったことがありません。強いて言うなら正規表現は相性良いと思います。
必須とは思いませんが。
コマンドプロンプトも状況によって知っていると便利だなというものはいくつもありますね。
あとPro版の機能ですが、createformは無限の可能性を持っていると感じます。

勉強の仕方としてお勧めなのは、
1.自分の欲しい機能をリストアップしてそれらを全部自作する
2.周囲の人が求めている機能を聞いて、それらを作っていく
僕は1に関して一段落したので、今はだいたい2です。人の要望を聞くと、案外こっちの想定と
違う要望が多くて、普段自分がやり慣れている領域から離れたところで頭が使えて、良い刺激に
なると思います。自動化は大概の場合、結構重宝されますよね。

No.2588 2016/07/02(Sat) 10:04:23

Re: uwscの基本的な使い方がわかった後の次のステップについて / シスイ
あるさん、サイト作成、スクレイピングですが、wp(ワードプレス)での100ページぐらいの中規模サイト作成を想定しています。正規表現はたしかに、ほしい情報検索、情報タグ加工の際に役にたちそうですね。
CREATEFORMですが、私の中では使いみちがイメージできません。どういう使い方がありますでしょうか?

戻値 = CREATEFORM( HTMLファイル, タイトル, [平行処理フラグ, オプション指定, 幅, 高さ, X, Y] )

No.2589 2016/07/02(Sat) 12:02:27

Re: uwscの基本的な使い方がわかった後の次のステップについて / ある
まずは「uwsc_createform」で検索してみると良いと思いますよ。
参考になるところはいくつかあるので。

No.2594 2016/07/03(Sun) 17:47:48

Re: uwscの基本的な使い方がわかった後の次のステップについて / stuncloud
>サイト作成やスクレイピング
スクレイピングしたいならDOMの勉強ですかねぇ、ついでにHTMLやJavaScriptも覚えられますよ!
UWSCでサイト作成はちょっとなんのこっちゃという気もしますが、そっち方面でも役に立つ知識だと思います

>CREATEFORMですが、私の中では使いみちがイメージできません
createformは作業を行う際に自前のUIが欲しい、という場合に重宝します
HTMLベースなので上で書いた技術がそのまま役に立ちますよ!
※ 古いIEの仕様に縛られるのがちょいと厄介ですが

No.2598 2016/07/04(Mon) 10:46:58
元データの整形について / シスイ
CHGMOJの置き換えですが下記の文字列のaaaaa、bbbbbを取得方法ないでしょうか?正規表現とか調べてみたのですが、UWSCで正規表現を使う方法がいまいち分かりません。

[元データ]
[ID1]
id=aaaaa
[ID2]
id=bbbbb

[最終的にしたい形]
aaaaa
bbbbb

No.2590 2016/07/02(Sat) 13:38:41

Re: 元データの整形について / シスイ
解決しました、おさがわせしました!
No.2591 2016/07/03(Sun) 01:10:28
CHGMOJで整形がうまくできない。 / シスイ
下記のメモ帳に入力してある文字列をCHGMOJで置き換えして、最終的にはメールアドレスとパスワードを除いた空行のなくしたものにしたいのですが下記のコードではできません。どこが間違っているのでしょうか?

[前]
メールアドレス:aaaaaaaaa.wp-x.jp
パスワード  :bbbbbbbbbb

メールアドレス:ddddddddddd.wp-x.jp
パスワード  :eeeeeeeeee


[最終的にしたい形]

aaaaaaaaa.wp-x.jp
bbbbbbbbbb
ddddddddddd.wp-x.jp
eeeeeeeeee


[コード]

id = GETID("無題 - メモ帳","Notepad")
SCKEY(id,VK_ctrl,VK_a)
SCKEY(id,VK_ctrl,VK_c)
mozi = GETSTR(0)
CHGMOJ( mozi, "メールアドレス", " " )
CHGMOJ( mozi, "パスワード", " " )

No.2580 2016/07/01(Fri) 21:10:46

Re: CHGMOJで整形がうまくできない。 / リキュール
以下ではどうですか。
mozi = CHGMOJ( mozi, "メールアドレス:", "" )
mozi = CHGMOJ( mozi, "パスワード  :", "" )
mozi = CHGMOJ( mozi,"<#CR><#CR>","<#CR>")

No.2581 2016/07/01(Fri) 21:35:45

Re: CHGMOJで整形がうまくできない。 / シスイ
リキュールさん、できません、CHGMOJの置き換えがまったく機能しなくて、全選択とコピーだけがなる状態です。
No.2583 2016/07/01(Fri) 23:40:31

Re: CHGMOJで整形がうまくできない。 / ある
リキュールさんのコードでいけるはずですよ。こちらでは問題なかったです。
シスイさんのコードはCHGMOJの前に「mozi=」が入っていないことが原因ではないでしょうか。
あとメモ帳からの文字取得はSCKEYよりGETSTRをお勧めします。
このままコピペしてみて下さい。

id=GETID("無題 - メモ帳","Notepad")
mozi=GETSTR(id)
mozi = CHGMOJ( mozi, "メールアドレス:", "" )
mozi = CHGMOJ( mozi, "パスワード  :", "" )
mozi = CHGMOJ( mozi,"<#CR><#CR>","<#CR>")
print mozi

No.2584 2016/07/02(Sat) 01:08:01

Re: CHGMOJで整形がうまくできない。 / シスイ
リキュールさん、できました、私が初歩的なミスをしてました、mozi = CHGMOJが原因でした。
ありがとうございました。

No.2585 2016/07/02(Sat) 07:05:58

Re: CHGMOJで整形がうまくできない。 / シスイ
あるさん、コードをコピペさして頂きできました。mozi=GETSTR(id)という使い方ができるんですね。
SCKEYでコピーをしてそれを、GETSTR(0)にしないとできないと思ってました。また、CHGMOJの前に「mozi=」が原因だったんですね。丁寧な解説ありがとうございました、助かりました。

No.2586 2016/07/02(Sat) 07:09:26
C#とuwscでの共有メモリとプロセス間通信 / skyhand
C#からuwscへ共有メモリを用いて数値(や文字列)を
送信するプロセス間通信についての質問です
(途中にC++の話も出てきますが、最終目標は上記の通りです)
以下において、送信側をサーバー、受信側をクライアントと表記します。

しろまささんのHPにある
「共有メモリを使用しプロセス間通信 (文字列のみ) ⇒ Class_SharedMemory.uws」
を参考にクライアントを作成し
C#でサーバー側を作成して
おそらく、共有メモリの作成・アクセスは成功しているのですが
文字化けが発生してしまい、正しく通信が出来ていません
言語間における型の取り扱いが原因だと推測していますが
サーバー・クライアントのどちらをどのように改良すれば
いいのか分からず困っています

・やってみたこと
【C# → uwsc】
MemoryMappedViewAccessorのwrite(引数1,引数2)で
引数2を色々なパターンで書き込みして
uwsc側はlstrcpyで受け取りましたが、文字化けが解消できず

・試しにやったこと
【C++ → uwsc】
reinterpret_cast<char*>で変換した文字列をstrncpyで
書き込み、lstrcpyで受け取りしたら、文字化けせず成功

【C# → C++】
C# → uwscと同じような文字化け発生

以上より、C++ → uwscで成功した手順と同じようなものを
C#側で作ればいいと思うのですが、分からず困っています
色々調べる中で、単純に同じ手順を踏む方法は存在せず
バイト列等に変換して受け渡す必要があるのかとも思っています

プログラミングやwinAPIについては初心者レベルで
わかりにくい質問文となってしまい申し訳ありませんが
急ぎませんので、どなたかアドバイスお願い致します
必要であれば、参考にしたサイトのURL等提示できます

No.2553 2016/06/28(Tue) 11:28:36

Re: C#とuwscでの共有メモリとプロセス間通信 / しろまさ
C#は全く触れたことありませんが^^

多分日本語がNGなので、文字列を直接Base64変換してやり取りすればいけるんじゃないですかね?
C#   http://www.atmarkit.co.jp/fdotnet/dotnettips/799base64/base64.html
UWSC http://siromasa.html.xdomain.jp/uwsc/u_term/32_SyorinoKousokuka.html


ps バイト配列にしてBase64で送ればファイルも転送できるんだろうなぁ・・(他力本願^^

No.2554 2016/06/28(Tue) 11:40:21

Re: C#とuwscでの共有メモリとプロセス間通信 / しゅん
確認するのが面倒なので、未確認ですみません。
以下のいずれかで大丈夫かと思います。
・lstrcpyはAを使ってますよね?Wでwstring定義でやってみてください
・もしくは、C#側でShift-JISコードで出力してください

ただ、C#使うならUWSCがPowerShell関数使って、.net remotingの方が良い気もします。

No.2555 2016/06/28(Tue) 19:33:35

Re: C#とuwscでの共有メモリとプロセス間通信 / skyhand
返信ありがとうございます

しろまささん
しろまささんは落し物部屋のご本人様でしょうか?
あのサイトにいつも助けられています

しゅんさん
代替案ありがとうございます。
ただ完全に初見の方法なのでまず調べてからでないと手が出せない状況です
もし、そちらの方針の方が良さそうであれば方向転換も検討します

お二人にアドバイスを頂いた上で以下の部分で詰まっています

C#側のサーバープログラムは
http://devlights.hatenablog.com/entry/20101123/p1
上記サイトを「まず書き込み側。」でページ内検索して直下に記載されているソースを
利用しています

Base64あるいはShift-JISコードに変換した後
MemoryMappedViewAccessor クラスのメソッド(下記URL参考)はどれを用いて書き込めば
よいのでしょうか?
https://msdn.microsoft.com/ja-jp/library/system.io.memorymappedfiles.memorymappedviewaccessor(v=vs.110).aspx


また、クライアント側のUWSCソースは以下を用いています
このソースでC++からは(半角英数、日本語とも)文字化け無く受信出来ています
C#からだと、(半角英数、日本語とも)文字化けを起こします

// 共有メモリ用
Const PAGE_READWRITE = 4
Const FILE_MAP_READ = 4 // 読取専用
Const FILE_MAP_WRITE = 2 // 読書両用
DEF_DLL CreateFileMappingA(Long, Long, Dword, Dword, Dword, String): Hwnd: Kernel32.dll
DEF_DLL MapViewOfFile(Hwnd, Dword, Dword, Dword, Long): Long: Kernel32.dll
DEF_DLL UnmapViewOfFile(String): Bool: Kernel32.dll
DEF_DLL CloseHandle(Hwnd): Bool: Kernel32.dll
DEF_DLL lstrcpyA(Long, String): String: Kernel32.dll
DEF_DLL lstrcpy(var String, Long): Long: Kernel32.dll

Dim Hnd_FileMap, read_FileMap
Dim MapName = "my_shared"//共有メモリ名

Hnd_FileMap = CreateFileMappingA(-1, 0, PAGE_READWRITE, 0, 64, MapName)
read_FileMap = MapViewOfFile(Hnd_FileMap, FILE_MAP_WRITE, 0, 0, 0)

Str = Format(Chr(0), 10)
lstrcpy(Str, read_FileMap)// 文字列読取
print "受信:" + str

UnmapViewOfFile(read_FileMap)
CloseHandle(read_FileMap)

No.2557 2016/06/28(Tue) 21:16:54

Re: C#とuwscでの共有メモリとプロセス間通信 / skyhand
追記
上で記載したC#のサイトとUWSCのソースで共有ファイル名が異なっていますが
その部分は同じ名前になるよう書き換えています

No.2558 2016/06/28(Tue) 21:23:16

Re: C#とuwscでの共有メモリとプロセス間通信 / しろまさ
C#側のサーバープログラム(http://devlights.hatenablog.com/entry/20101123/p1)の中ほどに、
> 文字列の場合は、バイト配列に変換してWriteArrayで書き込みます。
と書いてありまして、コードも記載されてます。

UWSC側は、DECODE の CODE_BYTEARRAY // バイト配列から戻す
で行けるかな? 未検証です^^

ps
 この掲示板で しろまさ と名乗るのは多分私一人です。
 長々やっておりますが、常に多くの方々から勉強させて頂いている日々です。
 私もまだまだ初心者ですので色々教えて下さいませ^^

No.2561 2016/06/29(Wed) 08:48:48

Re: C#とuwscでの共有メモリとプロセス間通信 / skyhand
受け取り側のUWSCでlstrcpyのAやWを使ってみたのですがうまくいきませんでした

その後、ネットを徘徊して下記ソースを見つけました
http://ameblo.jp/pink-green-onion/entry-10375278948.html
使用するAPIをC#用にマーシャリングする方法を取っており
実行してみたところ、
一応、文字化けはなくなりましたが新たな問題が発生しました
UWSC側のクライアントは3つ上のレス内ソースを利用しています
(見つけたのが今日の早朝で自分自身まだ十分に検証実験出来てませんが、
進展の助けになりそうなので、書き込んでいます)

【問題1】
半角英数の文字列を送信した場合、UWSC側で最初の1文字だけしか受信できない
例 「12345」や「abcde」を送信すると「1」「a」となる

【問題2】
日本語文字列を送信した場合、全文字数分受信はできているが
UWSC側でShift-JISコードが表示される
これに関しては、問題と言うより当然の動作で
今、UWSC側で受信後デコードする方法を探しています

なぜ、日本語文字列は全数受信出来るのに、半角英数だと1文字になってしまうのか・・・謎です
テキストファイルを媒介にしたやりとりから、共有メモリに変更しようとして
かれこれ10日間ぐらい足踏みしてます

PS
やはりご本人様でしたか!
ネット上の情報を頼りに独学で勉強しているので
丸々コピペで動くサンプルソースを沢山公開していただけるのはホントにありがたいです
目的の動作と多少違っても、大きな手がかりになります
あと、丁寧なコメントが付いているのも理解の助けになります
本当にありがとうございます

No.2562 2016/06/29(Wed) 10:16:54

Re: C#とuwscでの共有メモリとプロセス間通信 / skyhand
まだ完全に理解出来たわけではありませんが
とりあえず目的の動作は達成出来ました

>>UWSC側は、DECODE の CODE_BYTEARRAY // バイト配列から戻す
>>で行けるかな? 未検証です^^

というヒントを頼りに

・「UTF8」でバイト配列に変換後、accessor.WriteArrayで書き込み
・lstrcpy(var String, Long)で受信後、decode

という方法で、半角英数文字列・日本語文字列のやり取りを達成出来ました

それから、ここが一番よく分からないのですが
しろまささんHPにある「Class_SharedMemory.uws」でまず1回送受信を行い
「UWSC側」から共有メモリを作っておく?のもポイントの様です
(未検証ですが、要はUWSC側から一度共有メモリ作成をすればいいと思われます)
これがなぜ必要なのか不明ですが、色々試す中で分かったことであり
つまずいた最大の原因でもあります

最期にヒントになったサイトのURLを貼っておきます
http://devlights.hatenablog.com/entry/20101123/p1
http://stackoverflow.com/questions/10806518/write-string-data-to-memorymappedfile
http://siromasa.html.xdomain.jp/uwsc/u_sample/DLL/Class_SharedMemory.uws

返信していただいたお二方、また他にも考えて頂いた方がいらっしゃいましたら
本当にありがとうございました

No.2568 2016/06/29(Wed) 19:31:12

Re: C#とuwscでの共有メモリとプロセス間通信 / しゅん
おっと、解決済みでしたか。
では、参考まで。

http://d.hatena.ne.jp/junjun777/20160630/powershell_and_uwsc

No.2572 2016/06/30(Thu) 08:52:01

Re: C#とuwscでの共有メモリとプロセス間通信 / しろまさ
skyhandさん、目的動作達成おめでとうございます^^

私も後学のためにコードを読みたいです!(特にC#側)
見せられる範囲だけでも siromasa@ の gmail.com に送って頂けたら幸いです。


しゅんさん、PowerShell版ありがとうございます。
これも宝物として個人倉庫に保存しておきます。

> 他PCとの通信
やっぱsoketですよね。いまかなり嵌ってます^^

No.2573 2016/06/30(Thu) 09:15:05

Re: C#とuwscでの共有メモリとプロセス間通信 / skyhand
しゅんさん
しゅんさんはじゅんじゅんさんなんですか!
こちらのサイトもめちゃめちゃ参考にさせてもらってます
というより、
http://d.hatena.ne.jp/junjun777/20110808/uwsc_morse_code
このページの解決策の中で
メモリ共有、名前付きパイプ、DLL
RAMDISK?でもOS64bitになってから使ってないし・・・
(よりによってモールスやってるー泣)
あたりが自分の中で候補になって、
ブログコメントでおすすめを聞こうか迷ったのですが
なんとなく聞けず、適当に共有メモリを選択した経緯があります
人見知りせず方針だけでも聞けばよかった
PowerShellについては完全初見なので、ネット徘徊して調べてみます
わざわざ作って頂いてありがとうございます


しろまささん
色々試行錯誤したせいでコードがぐちゃぐちゃになってると思うので
ちょっと整理してから、近日中に遅らせていただきます
少々お待ちくださいませ


次は、どういうフォーマットで通信しようか
JSONなのか独自でなにか実装するのか
悩みは尽きませんが、おかげ様でなんとか前進出来ました

No.2574 2016/06/30(Thu) 10:27:21

Re: C#とuwscでの共有メモリとプロセス間通信 / skyhand
コードを整理している間に、冷静に考えて
しろまささん作のプログラムを最初に1回実行しなければいけないのは
絶対におかしいと思い、試しているうちに色々バグを見つけました

まず、自分が提示したUWSC側クライアントソースの
誤:CloseHandle(read_FileMap)は
正:CloseHandle(Hnd_FileMap)じゃなきゃダメですね
これで戻り値は成功の0以外の値(というかtrueの1?)が返るはずです
https://msdn.microsoft.com/ja-jp/library/cc429605.aspx
これは、おそらくしろまささんソースから引用する際に
私が間違えました

そして、UnmapViewOfFileもDLL定義の引数型が原因で
成功していなかったと思われます
以下の訂正で成功の0以外が返るはずです
https://msdn.microsoft.com/ja-jp/library/cc430200.aspx
こちらはしろまささんのプログラム中でも
バグの原因になっているっぽい?

誤:DEF_DLL UnmapViewOfFile(String): Bool: Kernel32.dll
正:DEF_DLL UnmapViewOfFile(Long): Bool: Kernel32.dll

さらに、開放した共有メモリが消えるタイミングについてずっと疑問だったのですが
http://d.hatena.ne.jp/junjun777/20160630/powershell_and_uwsc
>>入力待ちの間に実行しないと、誰も参照していないMemoryMappedFileはOSが解放するので、
>>なくなってしまいます。

とある通り、例えばしろまささん作のClass_SharedMemory.uwsを実行したとして
書き込みと読み込みを一通り終えて、プロセスが終了したら
共有メモリファイルは消えるはずだと思うのですが多分消えてません
再度読み込みのみ実行しても、前に書き込んだ値を取得出来てしまいます

これは、上記の間違い等によるものだと思いますが
プログラムを正しく使えているのか自信が無く
ソースも完全に理解しているわけではないので
確信は無いですが、読み込み終了後
UnmapViewOfFile、CloseHandleは0が返り失敗しているのでは?と思います
(もし私の勘違い・間違いだとしたらあらぬ疑いをかけてしまい申し訳ないです)

そして最初の疑問に戻るのですが
しろまささんのプログラムを1回実行しておくとうまくいくのは
作成した共有メモリが消えずに残っていて
それをC#側サーバーやUWSCクライアントが利用することで
偶然うまく通信ができていたのではないかと思いました

まとめると、しろまささんのプログラムには共有メモリ解放にバグがあり
私が作ったC#側やUWSCプログラムにはメモリ作成にバグがあり
その双方がたまたま良い方に働いて通信できていたのではという仮説です
(バグがあるのに、じゃあなぜ通信出来ているのかは依然疑問ですが・・・)

仮説が正しければ、とりあえず通信は出来たとしても
共有メモリが消去されずメモリリークの原因になると思われます

PS
しろまささんにお願いなのですが、急ぎませんのでお時間があるときに
Class_SharedMemory.uws
が正しく動作しているかチェックしていただけないでしょうか?
また、ちゃんとコードを整理してからお送りしようとしたのですが
もしかしたら解決の助けになるかもしれないので
(おそらくバグ持ちですが)私が作ったコードをできるだけ早めにメールさせていただきます

しゅうさん作PowerShell版への誘惑もありますが
もうちょい色々やってみるつもりです

No.2575 2016/06/30(Thu) 17:25:41

Re: C#とuwscでの共有メモリとプロセス間通信 / しゅん
はい、あのブログの管理者で、技術力の無駄遣いが好きな人間です。
(リンク先にもあるように、技術的に興味がないと答えない、ひどい人でもあります)

確かに、UWSCスクリプトに誤りがありましたね。
ブログ修正しました。(DEF_DLL UnmapViewOfFileとCloseHandleの引数)
修正前は、PowerShellスクリプトが終了しても、UWSCから読めてましたが、修正後はPowerShellスクリプトが終了すると、読めなくなりました。
ちなみに、PowerShellをC#に変更して使われる、と思ってたのですが、、、違うんですね。


なお、おすすめは、同PC内限定ならMemoryMappedFileです。
やはり早いし、比較的単純に組めます。
他PCも視野に入れUWSCが絡むなら、名前付きパイプかソケット(TCP/UDP)になります。

ソケットを使うなら、
http://d.hatena.ne.jp/junjun777/20131110/uwsc_winsock
が参考になるかと思います。

でも、同PC内では非表示の受け渡し用ウインドウに書く、というのもよく使う手です。
http://d.hatena.ne.jp/junjun777/20141114/uwsc_notifyIcon

No.2576 2016/06/30(Thu) 18:26:56

Re: C#とuwscでの共有メモリとプロセス間通信 / しろまさ
skyhandさん、ご指摘ありがとうございます。
重い腰を上げ、9年ぶりに見直しました^^(自分で使用してないのがバレバレ)

型違いもそうでしたが、関数引数の順番を間違えてることに気が付きました!
必要ないかもしれませんが、修正版を上げておきました。

お騒がせしました〜^^

No.2577 2016/06/30(Thu) 18:36:48

Re: C#とuwscでの共有メモリとプロセス間通信 / skyhand
しろまささんが一度メモリを作っておくとうまくいく謎を解明してくれました
感謝感謝です

直接的な原因は、私が作ったC#側のプログラムにおいて
メモリ解放を待つためにプロセスを待機させるタイミングにミスがありました
具体的には、書き込み後解放前に待機動作を入れなければいけないのに
解放後に待機させるという謎実装をしてました

そのため、自分の作ったサーバー・クライアントプログラムのみを実行すると
C#で書き込み直後にメモリ解放を行ってしまい
UWSCでは無くなったメモリを再度作成後、空の状態(正確には状態不明?)のメモリを読む
という動作になってました

だから、メモリ解放をしないプログラムを事前に実行しておくと
たまたまメモリが残ってくれて、読み取れてしまうと
そういうお話でした

しゅんさんの
>>入力待ちの間に実行しないと、誰も参照していないMemoryMappedFileはOSが解放するので、
>>なくなってしまいます。

大ヒントでした

以上とは別にUWSCが固まるときがあるようなので
要検証ですがとりあえずすっきりしました

開放するタイミングの実装についてちょっと考えたのですが
難しいですね
繰り返し通信する場合は毎回メモリ作りなおすのが普通なのでしょうか?
このあたりはプロセス間同期の領域になるんですかね

No.2582 2016/07/01(Fri) 22:14:26
全796件 [ ページ : << 1 ... 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ... 80 >> ]