[ 掲示板に戻る ]

過去ログ閲覧モード

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
IFBでfukidasiを個々の画面に応じて切替。 / ぽんきち
fukidasiテロップを個々の画面に応じて切り替えるにはどのようにしたらいいでしょうか?GETIDから画面情報を取得しそれを判別するのでしょうか?UWSC初心者なので詳しく教えて下さい。
No.2559 2016/06/28(Tue) 23:35:43

Re: IFBでfukidasiを個々の画面に応じて切替。 / ある
状況が想定しにくいのでもう少し具体的に書かれた方が答えやすいかもです。
例えばyahooからgoogleに切り替わった時にfukidasi文字を「yahooです」を「googleだよ」としたいのであればgetidとstatus、あるいはgetactiveoleobjなど使えばいけます。画面を監視し続ける場合はwhile trueが一般的です。

No.2560 2016/06/29(Wed) 07:21:58

Re: IFBでfukidasiを個々の画面に応じて切替。 / ぽんきち
済みません、例えば携帯などのデータ移行ツール(アプリ)の操作をを自動化。
UWSC起動 → アプリ起動 → xxキーを押して下さい(仮想キー) →  次の画面へ → 自動作業 MMV(座標)BTN(left、click、xx)等々・・・ → 次の携帯に取り換えますか?→ 接続 → 繰り返し/スペース選択 → 繰り返し/終了処理。
などの操作補助的な説明を個々の画面と同時に切り替えたいと思っております。因みに通電(USB)しているかの判断、判別などUWSCではできませんよね?
サンプルコードもあるのですが、中を確認するにダイアログボックスの値で判断しているのではないかなっと思うのですが。それとwhile文とIFB文はかなり使用しているコードです。分かりにくい説明で本当に失礼なのですが、ご教示頂きたく思います。><;

No.2567 2016/06/29(Wed) 19:28:29

Re: IFBでfukidasiを個々の画面に応じて切替。 / ある
コードもアプリもわからない以上何とも言えないですが、
ウインドウタイトルやウインドウ中の文字取得はできると思いますよ(サンプル#N30とか)。
どこで困っているかもイメージがつかず、お力になれず申し訳ないです。

No.2569 2016/06/29(Wed) 21:02:50

Re: IFBでfukidasiを個々の画面に応じて切替。 / ぽんきち
因みに、SENSOR関数に詳しいでしょうか?電流を感知したら起動するということはできるでしょうか?
一部コードを記載します。現在は下記の様にmsgboxにて起動判断をしEXECでリンク先から立ち上げて操作を開始するような形になっています。私もすべて把握しているわけではないので、下記のコードを見てここから先がどうなってるか分からないとどうしようもない、っという箇所があれば言ってください、記載します。宜しくお願いします。

PUBLIC msgx = 100
PUBLIC msgy = 100

m_px=200
m_py=200
f_at=0
f_size=30
f_kind=20
ok_f_color=0
ok_b_color=$00FF00
n_b_color=0

err_m_px=200
err_m_py=200
f_color=0
ng_f_color=$0000FF

// アプリ起動

ifb MsgBox("起動しますか?", BTN_YES or BTN_NO) = BTN_YES


s="電源をONし設定できる状態にして下さい。"+"<#cr>"
// Fukidasi(s, 100, 100, 0, 20)
Fukidasi(s, m_px, m_py, f_at, f_size, f_kind, ok_f_color, n_b_color)
endif
  while true

  ifb GETKEYSTATE(VK_SPACE) then
break
endif

wend

s="起動中。しばらくお待ちください。"+"<#cr>"
// Fukidasi(s, 100, 100, 0, 20)
Fukidasi(s, m_px, m_py, f_at, f_size, f_kind, ok_f_color, n_b_color)

//endif // test

// アプリ 起動
ICE_ID = GETID("xxxxxxxxxxxxxxxxxxxxxxxxxx")
ifb ICE_ID < 0 // 存在してなければ起動
ICE_ID = EXEC("xxxxxxxxxxxxxxxxxxxxxxxxx")

// 検知
ACW(GETID("xxxxxxxxxxxxxxxxxxxxxxxx"),-4,-4,1374,746,0)

No.2570 2016/06/29(Wed) 22:46:54

Re: IFBでfukidasiを個々の画面に応じて切替。 / ある
残念ながらSENSORは一度も触ったことがなく、また試せる環境もないです。
No.2571 2016/06/30(Thu) 06:04:30
再生(またはストリーミング放送)していないVLCを消す方法を教えて下さい / すすむ
VLCメディアプレイヤーで、再生していないまたは、ストリーミング放送してない
終了しているVLCメディアプレイヤー全部を消す方法を教えて下さい

自分である程度、知恵をしぼってクラス名取得などをしたんですが
うまく組み合わせができませんでした。

再生時のクラス名 : VLC video output 0195FA28
停止時のクラス名 : QWidget

FOR SSS=1 TO 50
VID = GETID("VLCメディアプレイヤー","QWidget",0.1)
IF VID < 0 THEN Break
CTRLWIN( VID , CLOSE)
NEXT

これで、QWidgetを終了させると再生している物まで消去していしまいます
QWidgetは再生していてもしてなくても、窓枠のタイトルのクラス名がQWidgetであるために
判別ができずに一緒に消去されてしまうのです。

どうやって分別つけて振り分けて消せば良いのか、良いお知恵を下さい。m(__)m

No.2565 2016/06/29(Wed) 16:31:01

Re: 再生(またはストリーミング放送)していないVLCを消す方法を教えて下さい / すすむ
すいません。自己解決しました
GETALLWIN関数を見つけて試行錯誤したらいけました。

n = GETALLWIN()
IFB n > 0
FOR i = 0 TO (n - 1)
AL2= STATUS(ALL_WIN_ID[i], ST_TITLE)
IF AL2="VLCメディアプレイヤー" Then CTRLWIN(ALL_WIN_ID[i],CLOSE)

NEXT
ENDIF

No.2566 2016/06/29(Wed) 18:09:37
IEで確認ダイアログを表示せずに画面を閉じる / rin
初心者です。

スクリプトの終了時に「ウィンドウは、表示中のWebページにより閉じられようとしています。
このウィンドウを閉じますか?」と表示されます。

この確認ダイアログを表示させずに終了する方法はありますか。

宜しくお願い致します。

No.2552 2016/06/27(Mon) 10:30:20

Re: IEで確認ダイアログを表示せずに画面を閉じる / しゅん
再現する最小のスクリプトを提示すれば、アドバイスがつくかもしれませんよ!
ただ単にUWSCからIE開いて閉じても、ダイアログは出ませんからね。
(どういう条件で出るか忘れました)

No.2556 2016/06/28(Tue) 19:35:14

Re: IEで確認ダイアログを表示せずに画面を閉じる / stuncloud
window.close() が呼ばれた場合に
>「ウィンドウは、表示中のWebページにより閉じられようとしています。
>このウィンドウを閉じますか?」

のプロンプトが表示されます

ただ、それをUWSCでやるとしたら例えば
ie.document.parentWindow.close()
なんてことをしなければならないのですが、わざわざこんな書き方しないですよね…?

あるとすれば window.close() を呼ぶボタンやリンクをクリックした場合?
そうであれば、それらのボタンまたはリンクを押さずに ie.Quit() すれば良いと思います

No.2563 2016/06/29(Wed) 10:25:18

Re: IEで確認ダイアログを表示せずに画面を閉じる / rin
しゅん様、stuncloud様ご返信ありがとうございます。

stuncloud様に教えて頂いた方法でダイアログを表示せずに
画面を閉じることが出来ました。

ありがとうございました。

No.2564 2016/06/29(Wed) 14:05:03
8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / シスイ
8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット)を作成したいのですが、下記のスクリプトでは先頭が数字になる場合があります。

先頭はアルファベットで数字とアルファベットの組み合わせの文字列の作成する方法ないでしょうか?
宜しくお願いします。

IDPASS = “” //文字列10個出力 FOR A = 1 TO 10 //文字数は8文字 FOR B = 1 TO 8 IDPASS = IDPASS + RETURNCHAR() NEXT IDPASS = IDPASS + “” NEXT SENDSTR(EXEC(“NOTEPAD”),IDPASS) FUNCTION RETURNCHAR() LETTER = CHR(97 + RANDOM(26)) //アルファベットの小文字、大文字、数字を出す SELECT RANDOM(3) CASE 0 //小文字はそのまま RESULT = LETTER CASE 1 //大文字を出す場合は変換 RESULT = STRCONV(LETTER,SC_UPPERCASE) CASE 2 //数字の場合は0〜9をランダムに出す RESULT = RANDOM(10) DEFAULT RESULT = LETTER SELEND FEND

No.2538 2016/06/24(Fri) 03:56:33

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / stuncloud
// RETURNCHAR()をちょっと手直しして引数でTRUEを渡すと数値を返さないようにする

IDPASS = RETURNCHAR(TRUE) // 1文字目は数値なしを受ける
for i = 2 to 8
 IDPASS = IDPASS + RETURNCHAR() // 2〜8文字目は数値も含む
next
msgbox(IDPASS)

FUNCTION RETURNCHAR(exludeNumber = FALSE)
 LETTER = CHR(97 + RANDOM(26)) //アルファベットの小文字、大文字、数字を出す
 if exludeNumber then n = 2 else n = 3 // exludeNumberがTRUEの場合はcase 2に行かないようにする
 SELECT RANDOM(n)
  CASE 0 //小文字はそのまま
   RESULT = LETTER
  CASE 1 //大文字を出す場合は変換
   RESULT = STRCONV(LETTER,SC_UPPERCASE)
  CASE 2 //数字の場合は0〜9をランダムに出す
   RESULT = RANDOM(10)
  DEFAULT
   RESULT = LETTER
 SELEND
FEND

No.2539 2016/06/24(Fri) 09:54:33

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / シスイ
stuncloudさん  返信ありがとうございます。さっそく試してみたのですが、確かに8桁のランダムなアルファベットを1つ作成できました。これを10個、1つのメモ帳に入力したいのですが、色々やってみてみメモ帳が10個開き、メモ帳1つ1つに1つの8桁が入力になってしまいます。
何か、良い方法はありませんでしょうか?


// RETURNCHAR()をちょっと手直しして引数でTRUEを渡すと数値を返さないようにする

IDPASS = ""
//文字列10個出力
FOR A = 1 TO 10
IDPASS = RETURNCHAR(TRUE) // 1文字目は数値なしを受ける
for i = 2 to 8
 IDPASS = IDPASS + RETURNCHAR() // 2〜8文字目は数値も含む
next


 IDPASS = IDPASS + RETURNCHAR() // 2〜8文字目は数値も含む

SENDSTR(EXEC("NOTEPAD"),IDPASS)
next
FUNCTION RETURNCHAR(exludeNumber = FALSE)
 LETTER = CHR(97 + RANDOM(26)) //アルファベットの小文字、大文字、数字を出す
 if exludeNumber then n = 2 else n = 3 // exludeNumberがTRUEの場合はcase 2に行かないようにする
 SELECT RANDOM(n)
  CASE 0 //小文字はそのまま
   RESULT = LETTER
  CASE 1 //大文字を出す場合は変換
   RESULT = STRCONV(LETTER,SC_UPPERCASE)
  CASE 2 //数字の場合は0〜9をランダムに出す
   RESULT = RANDOM(10)
  DEFAULT
   RESULT = LETTER
 SELEND
FEND

No.2542 2016/06/24(Fri) 12:22:50

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / stuncloud
exec("notepad") を10回やっているからです
メモ帳を開くのは一回だけにすればいいです

id = exec("notepad") // 予め開いとく
for A = 1 to 10
 // 省略
 SENDSTR(id, IDPASS + "<#CR>") // 書き込むときに改行を付け加えると10個それぞれ別の行になる
next

単純にテキストファイルに書き出したいだけならメモ帳に書くのではなくfopen, fput, fcloseを使ったほうが良いです

No.2543 2016/06/24(Fri) 13:41:47

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / リキュール
これではどうでしょうか。

// RETURNCHAR()をちょっと手直しして引数でTRUEを渡すと数値を返さないように

する
IDPASS = ""
//文字列10個出力
FOR A = 1 TO 10
IDPASS = IDPASS + RETURNCHAR(TRUE) // 1文字目は数値なしを受ける
for i = 2 to 8
  IDPASS = IDPASS + RETURNCHAR() // 2〜8文字目は数値も含む
next
 IDPASS = IDPASS + "<#CR>" // 連続したい場合はこの行を削除
next
SENDSTR(EXEC("NOTEPAD"),IDPASS)
//以下同じ

No.2544 2016/06/24(Fri) 14:39:03

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / シスイ
stuncloudさん ありがとうございます、できました。

最終的にしたいことがエクセルのA1からA10にランダムに作成した数字文字列を入力したいのですが、色々試してみた所、A1からA10に同じランダムな数字文字列が入力になってしまいます。
何か、良い方法ありませんでしょうか?


Excel = XLOPEN("hoge.xlsx")

id = exec("notepad") // 予め開いとく
IDPASS = ""
//文字列10個出力
FOR A = 1 TO 10
IDPASS = RETURNCHAR(TRUE) // 1文字目は数値なしを受ける
for i = 2 to 8
 IDPASS = IDPASS + RETURNCHAR() // 2〜8文字目は数値も含む
next


 IDPASS = IDPASS + RETURNCHAR() // 2〜8文字目は数値も含む
XLSETDATA( Excel, IDPASS + "<#CR>", "a1:a10")

next
FUNCTION RETURNCHAR(exludeNumber = FALSE)
 LETTER = CHR(97 + RANDOM(26)) //アルファベットの小文字、大文字、数字を出す
 if exludeNumber then n = 2 else n = 3 // exludeNumberがTRUEの場合はcase 2に行かないようにする
 SELECT RANDOM(n)
  CASE 0 //小文字はそのまま
   RESULT = LETTER
  CASE 1 //大文字を出す場合は変換
   RESULT = STRCONV(LETTER,SC_UPPERCASE)
  CASE 2 //数字の場合は0〜9をランダムに出す
   RESULT = RANDOM(10)
  DEFAULT
   RESULT = LETTER
 SELEND
FEND

No.2545 2016/06/24(Fri) 18:44:52

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / シスイ
リキュールさんの方法でできました、ありがとうございます。

最終的にしたいことがエクセルのA1からA10にランダムに作成した数字文字列を入力したいのですが、色々試してみた所、A1からA10に同じランダムな数字文字列が入力になってしまいます。
何か、良い方法ありませんでしょうか?


Excel = XLOPEN("hoge.xlsx")

id = exec("notepad") // 予め開いとく
IDPASS = ""
//文字列10個出力
FOR A = 1 TO 10
IDPASS = RETURNCHAR(TRUE) // 1文字目は数値なしを受ける
for i = 2 to 8
 IDPASS = IDPASS + RETURNCHAR() // 2〜8文字目は数値も含む
next


 IDPASS = IDPASS + RETURNCHAR() // 2〜8文字目は数値も含む
XLSETDATA( Excel, IDPASS + "<#CR>", "a1:a10")

next
FUNCTION RETURNCHAR(exludeNumber = FALSE)
 LETTER = CHR(97 + RANDOM(26)) //アルファベットの小文字、大文字、数字を出す
 if exludeNumber then n = 2 else n = 3 // exludeNumberがTRUEの場合はcase 2に行かないようにする
 SELECT RANDOM(n)
  CASE 0 //小文字はそのまま
   RESULT = LETTER
  CASE 1 //大文字を出す場合は変換
   RESULT = STRCONV(LETTER,SC_UPPERCASE)
  CASE 2 //数字の場合は0〜9をランダムに出す
   RESULT = RANDOM(10)
  DEFAULT
   RESULT = LETTER
 SELEND
FEND

No.2546 2016/06/24(Fri) 18:46:41

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / リキュール
id = exec("notepad") // この行は不要
XLSETDATA( Excel, IDPASS + "<#CR>", "a1:a10")
これを
Excel.sheets("Sheet1").cells(A,1).Value = IDPASS //"Sheet1"は実際の名前を使用
に変更ではどうですか。

No.2547 2016/06/24(Fri) 19:25:14

Re:別の方法(参考までに) / Liners
Excel = GETACTIVEOLEOBJ("Excel.Application") // 起動中のExcel

For i = 1 to 10
  Excel.Cells(i, 1).Value = IDPASS()
Next

Function IDPASS()
  Result = ""
  For i = 1 to 8
    Result = Result + Copy("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890", random(62) + 1 -(i = 1)*10, 1)
  Next
Fend

No.2549 2016/06/25(Sat) 11:15:38

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / シスイ
リキュールさん、できました、ありがとうございます。
No.2550 2016/06/25(Sat) 22:05:15

Re: 8桁のランダムなアルファベット数字の文字列を作成したい(先頭はアルファベット) / シスイ
Linersさん、できました、この簡潔なソースでしたい処理を考えれるなんて素晴らしいです。
No.2551 2016/06/25(Sat) 22:07:08
Rec-IEについて / カフェオレ
Rec-IEについて質問です。

Javascript:void(0)と表示されてるボタンが押せず、記録することが出来ません。


これをクリアするには、どうすればよいのでしょうか?

よろしくお願いします。

No.2536 2016/06/24(Fri) 00:42:22

Re: Rec-IEについて / routa
右クリックからの「クリック処理」は試されましたか。
No.2548 2016/06/24(Fri) 22:57:23
エクセルの特定のセルにあるメルアドをiniファイルに書込する方法 / シスイ
エクセルの特定のセル、例えばA1にあるメルアドの文字列を、iniファイルに下記のように書込する方法ないでしょうか?

[メルアド1]
メールアドレス=A1にあるメルアドの文字列

No.2537 2016/06/24(Fri) 03:55:37

Re: エクセルの特定のセルにあるメルアドをiniファイルに書込する方法 / stuncloud
Excel = XLOPEN("hoge.xlsx")
A1 = XLGETDATA(Excel, "A1")
WRITEINI("メルアド1", "メールアドレス", A1, "hoge.ini") // hoge.iniに書き込み
XLCLOSE(Excel)

No.2540 2016/06/24(Fri) 10:01:44

Re: エクセルの特定のセルにあるメルアドをiniファイルに書込する方法 / シスイ
stuncloudさん   ありがとうございました。作業の効率化を図ることができました。
No.2541 2016/06/24(Fri) 11:54:28
HYPER SBI / みっつ
HYPER SBIという株ソフトに関してですが
座標が認識されず、自動操作を記録できません。
何か良い方法はありませんでしょうか。

No.2530 2016/06/22(Wed) 02:44:32

Re: HYPER SBI / FAQ
これ
http://www.uwsc.info/faq.html#N29

No.2535 2016/06/23(Thu) 03:26:52
CREATEFORMでこのページは表示できませんと表示される / よし
CREATEFORMでEXEで実行すると『このページは表示できません』と表示される。

ソースで実行すると画面は正常に表示されます。

宜しくお願いいます。

No.2509 2016/06/17(Fri) 13:45:20

Re: CREATEFORMでこのページは表示できませんと表示される / routa
変数でファイル名を指定していませんか。
変数ではなく直に書きましょう。

No.2510 2016/06/17(Fri) 20:59:13

Re: CREATEFORMでこのページは表示できませんと表示される / しろまさ
昔の記憶で・・

Exe化するとCREATEFORM時はHTMLを外部ファイルから読み込むのがNGだったような。
スクリプト内にTextBlockで書けばOKだったような。。

No.2523 2016/06/21(Tue) 08:27:18

Re: CREATEFORMでこのページは表示できませんと表示される / stuncloud
exe化すると指定したHTMLファイルも一緒に取り込まれます
フォームを表示する際にHTMLファイルが%TEMP%に展開されてそこから読み出されているようです
なのでHTMLファイルが%TEMP%にうまく書き出せない、読み取れない等のトラブルがあった場合はこうなるかもしれません
試しに展開されたファイルのアクセスコントロールで読み取りを拒否してみたら予想通り「このページは表示できません」になりました

No.2526 2016/06/21(Tue) 12:13:43

Re: CREATEFORMでこのページは表示できませんと表示される / しろまさ
stuncloudさんへ
あ、そういう意味ではなく、例えば可変パスでExe化時に取り込めず、
Exe実行後に外部ファイルを読み込んで表示しようとした場合です。
複数のHTMLを条件で切り替えて表示など。

よしさんへ
エラーを再現できる最低限のコードを提示して下さい。
予想で話しても時間の無駄かと。Exe化はこちらで行いますので。

No.2531 2016/06/22(Wed) 10:52:53

Re: CREATEFORMでこのページは表示できませんと表示される / stuncloud
>Exe実行後に外部ファイルを読み込んで表示しようとした場合です。
ああ、なるほど…そういうことでしたか

その場合はそれらのファイルを%TEMP%に置けば動くかな?と以下で試してみました

html = slctbox(SLCT_BTN or SLCT_STR, 0, "えらぶ", "a.html", "b.html")
if html = -1 then exit
createform(html, html, FALSE)

結果、exeファイルと同じディレクトリに a.html と b.html が置いてあれば正常動作しました
今はHTMLファイルを外に置いておいても大丈夫みたいですね

select slctbox(SLCT_BTN, 0, "えらぶ", "a.html", "b.html")
case SLCT_1
createform("a.html", "a", FALSE)
case SLCT_2
createform("b.html", "b", FALSE)
selend

ファイル名をリテラルで書いた場合はそれぞれが取り込まれて%TEMP%に展開されていました

No.2533 2016/06/22(Wed) 12:11:24

Re: CREATEFORMでこのページは表示できませんと表示される / しろまさ
ほー。ちょっと面白くなってきたw
カレントならOKと。では階層下げてみると・・・?

ダメでした><

相対指定もGET_CUR_DIRも無効。不思議なものだ。
普段COMしか使わないから新しい発見でした。ありがとうございます^^

No.2534 2016/06/22(Wed) 15:08:35
busywaitが通用しません / 初級
Windows7のIE11上のスクリプトで、どんなにひどい回線遅延でも止まらずに処理を繰り返せるようにするために、
Web上で重いと評判のサイトでbusywait試験をしているのですが、どうにもフリーズしてしまいます。
http://tricotrico.seesaa.net/
というブログですが、何度か試行しているとIEが無応答状態に陥り、UWSCのマクロも固まります。
IE.busyやIE.readystate絡みの判定ループ処理も一度くらいしか通用しないようです。
こういうサイトでもクラッシュしないスクリプトを作りたいのですが、何か良い処理はないでしょうか?

No.2532 2016/06/22(Wed) 11:02:29
全727件 [ ページ : << 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 73 >> ]