WM_COPYDATAのジャンプ先でデータ移さずに
アドレスからdupptrでクローン変数にしたのを
return後に表示させたら文字化けした事あったけど・・・
WM_COPYDATAテスト(少なくても自分の環境では文字化けは起きてない)
使い方
二つ以上起動してから送受信準備ボタンを押す
ボタンを押したウィンドウが送信用(受信もするが)ウィンドウになる
#include "user32.as"
#define WM_APP 0x8000
#const MYWM_RECEIVE WM_APP
#define WM_COPYDATA 0x004A
oncmd gosub *OnReceive, MYWM_RECEIVE
RegisterWindowMessage "HSP_Broadcast_Test"
if stat=0 {dialog "ウィンドウメッセージを定義できませんでした":end}
msgcode = stat
oncmd gosub *OnReceiveBroadcast, msgcode
button gosub "送受信準備", *Send
//送受信両方で使用(メンループ)
repeat
await 16
if CopyDataOK>0{//受信成功
msg_data+tmp_msg_data+"\n"
objprm mesboxid,msg_data
if CopyDataOK=2 {//受信側が受信したので送信側に送信する
if "終了"=tmp_msg_data {msg="受信側を終了します":gosub *btn_send:end}else{gosub *btn_send}
}else{//受信側から応答があった
if "受信側を終了します"=tmp_msg_data {oncmd 0:msg_data+"送信側を終了します":objprm mesboxid,msg_data:wait 100:end}
}
CopyDataOK=0
}
loop
//送信側
*Send
title "送信側 : hwnd="+hwnd
cls 4:color 255
; ブロードキャスト送信
mes "ブロードキャストメッセージを送信"
sendmsg 0xFFFF, msgcode, 0, hwnd
mes "ブロードキャストメッセージを送信終了"
if tcnt=0 {dialog "受信側ウィンドウがありません":end}
msg ="文字列送信テスト 終了 とだけ送ると両方終了する"
mesbox msg,400,32 ,1,1024
hTcom=""
repeat tcnt
hTcom+=str(hTarget(cnt))+"\n"
loop
hTindx=0
objsize 86,20
combox hTindx,(tcnt+1)*16,hTcom
button gosub "文字列送信", *btn_send
mes "↓↓受信文字列↓↓"
msg_data=""
mesbox msg_data,600,300
mesboxid=stat
CopyDataOK_F=1
oncmd gosub *OnCopyData,WM_COPYDATA
return
//送信側(受信ウィンドウハンドル取得)
*OnReceive
if wParam=1 {
hTarget(tcnt) = lParam //受信側ウィンドウハンドル
mes ""+(tcnt+1)+":受信側からMYWM_RECEIVEを受け取りました : 受信側 hwnd = "+hTarget(tcnt)
tcnt+
}
return
//受信側
*OnReceiveBroadcast
if hwnd = lParam {return}//自分からのメッセージなら無視
hTarget = lParam
cls
mes "送信側からBroadcastメッセージを受け取りました : 送信側 hwnd = "+hTarget
mes "送信側にMYWM_RECEIVEを送ります"
sendmsg hTarget, MYWM_RECEIVE, 1, hwnd
title "受信側 : hwnd="+hwnd
msg = "文字列応答テスト"
input msg,400
mes "↓↓受信文字列↓↓"
msg_data=""
mesbox msg_data,600,300
mesboxid=stat
CopyDataOK_F=2
oncmd gosub *OnCopyData, WM_COPYDATA
return
//送受信両方で使用
*OnCopyData
; COPYDATASTRUCT 構造体.
dupptr cds, lParam, 12
dupptr data_ref, cds(2), cds(1),cds(0)
sdim tmp_msg_data,cds(1)
if cds(0)=vartype("str") {//文字列
tmp_msg_data=data_ref //return後はアドレスが有効か分からないのでデータを移しとく
}else{//整数
repeat cds(1)/4
tmp_msg_data+str(data_ref(cnt))
if (cds(1)/4) > (cnt+1) {tmp_msg_data+","}
loop
}
CopyDataOK=CopyDataOK_F //受信成功フラグ
return 0
//送受信両方で使用
*btn_send
; COPYDATASTRUCT 構造体
dim cds, 3
cds(0) = vartype(msg) ; データ識別値(今回は変数の型を入れる)
if cds(0)=vartype("str") {//文字列型と整数型のみ対応
cds(1) = strlen(msg)+1 ; 送信データサイズ(バイト単位、今回は文字列だから+1)
}else{//整数型
cds(1) = length(msg)*4 ; 送信データサイズ(バイト単位)
}
cds(2) = varptr(msg) ; データのアドレス
sendmsg hTarget(hTindx), WM_COPYDATA, hwnd, varptr(cds)
return