HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0423
motermemcpyによる文字化け 対処法4未解決


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の意味の理解が曖昧なまま使ってました……。
今度からはちゃんと理解してから使うようにします!ありがとうございました!



ONION software Copyright 1997-2023(c) All rights reserved.