memcpyによる文字化け 対処法
moter 2013/4/23(Tue) 23:20:54|NO.53636
memcpyを使ってWM_COPYDATAで受信した文字列を取得しているのですが
時々文字化けして非常に困ります、
他の受信方法、または文字化けの対処法はないでしょうか?
KA 2013/4/23(Tue) 23:30:56|NO.53638
1:ユニコードなのでしょう。
→何回か質問されています、過去の質問を探してみましょう。
2:前のデータが残った状態でmemcpyしている。
→文字の最後にNULLを入れて下さい。
3:スクリプトミス
4:そのた
moter 2013/4/24(Wed) 16:42:52|NO.53639
回答ありがとうございます!
1~4まで全て確認したのですが思い当たる節がありません……。
1つわかったことがあるのですが、同じ文字列を2回連続でmemcpyしたときに
文字化けしていることがわかりました(必ず文字化けするわけではありません)
毎回memcpyの前にsdimで変数を初期化しているのですが
2回連続で行うと文字化けしてしまいます……。
分かる方がいればどうかご教授くださいm(_ _)m
暇人 2013/4/25(Thu) 01:20:51|NO.53644
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
moter 2013/4/25(Thu) 18:26:45|NO.53645
おお!できました!ありがとうございます!
memcpyは使う必要は無かったのですね…。
dupptrの意味の理解が曖昧なまま使ってました……。
今度からはちゃんと理解してから使うようにします!ありがとうございました!