HAMLOG プログラム開発室


新着表示
タイトル
記事No
投稿日
投稿者
参照先
Re: WM_COPYDATAについて
646
2014/12/17(Wed) 11:30:06
JA2BQX 太田

こんにちは。
最近はVB6は殆ど使わなくなっていますが
状況を再現出来るソースを送っていただければこちらでもテストして見ますが....。
メルアドは私のHPのTopにあります。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: WM_COPYDATAについて
645
2014/12/17(Wed) 11:12:07
JP7CZE 川辺
> cds.dwData = 1;
> lstrcpy(buffs, "JG1MOU"); // コールサイン文字列
> cds.cbData = strlen(buffs) + 1; // ※文字列の長さ+1※
> cds.lpData = &buffs[0]; // 文字列のポインタ
> Hwnd2 = SendMessage(Hwnd1, WM_COPYDATA, (WPARAM)Form1->Handle, (LPARAM)&cds);

VB6です.戻り値の取得ですが,ちょっと困っています.

Type COPYDATASTRUCT
dwData As Long
cbData As Long
lpData As String * 3927 ' void * のつもり
End Type

(lpData の3927は,やけくその値です...)

Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As
Long, ByVal lParam As Long) As Long
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any,
hpvSource As Any, ByVal cbCopy As Long)

で,

WindowProc 関数の中で,WM_COPYDATAの時に,
  Dim cds As COPYDATASTRUCT
  Dim buf(1 To 255) As Byte
  Call CopyMemory(cds, ByVal lParam, Len(cds))

で受けているのですが,
  cds.dwData と cds.cbData の値は,正しいのですが,なぜか
  cds.lpDataの中身に,先頭に14byteほどのゴミが付いてきます.

なので,cds.cbData の値で cds.lpData の値を取り出しても,
正しい文字列が取れません.
仕方がないので,とりあえず,先頭の14byteを切り取って,
その後で,1byteずつゴミかどうかをチェックしながら,
正しい文字列の次のnull文字までの文字列の切り出しをしているのですが.

CopyMemory の使い方が間違っているのか,
MoveMemory に変えても同じで...ご教示いただければ幸いです.
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: WM_COPYDATAについて
644
2014/12/16(Tue) 22:08:07
JG1MOU浜田
「取得」ではなく「送る」でした。
http://hamlog.no.coocan.jp/mou/index.html
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: WM_COPYDATAについて
643
2014/12/16(Tue) 10:31:50
JA2BQX 太田
こんにちは。

> 別件ですけど、ちょっと修正しました。
> http://hamlog.no.coocan.jp/mou/index.html

> ・WM_COPYDATA コマンド15で、チェックボックスの状況をRemarks2の次の行で取得。

上記の件、テストし確認しました。
ただ 15 は 115 の単なるタイプミスですね。(済みません、あげあしとりのつもりではありません)

送る時に桁数+1をしてみましたが特に変化は無いようですが今後は桁数+1にします。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: WM_COPYDATAについて
642
2014/12/15(Mon) 21:58:39
JG1MOU浜田
> はい、VB6もVB2010の時も単に文字列の長さを指定しています。 勿論全角は半角換算の2ですが。

やはり文字列の長さ+1が正解なのかもしれません。
文字列の長さ+1=バッファの長さ ですから。

構造体の内容を送る場合を考えると、納得です。
cds.cbData = sizeof(STRUCT);

別件ですけど、ちょっと修正しました。
http://hamlog.no.coocan.jp/mou/index.html
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: WM_COPYDATAについて
641
2014/12/15(Mon) 21:17:15
JA2BQX 太田
こんばんは。
コマンド30の追加ありがとうございました。順調に動作しています。

> 文字列を送る場合、C言語では最後の0x00が必要なので、文字列の長さ
> +1が正解みたいです。
> たぶん、PASCALやBASICでは大丈夫なのでしょう。

はい、VB6もVB2010の時も単に文字列の長さを指定しています。 勿論全角は半角換算の2ですが。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

WM_COPYDATAについて
640
2014/12/15(Mon) 19:01:14
JG1MOU浜田
ドキュメントに間違いがあったみたいです。
文字列を送る場合、C言語では最後の0x00が必要なので、文字列の長さ
+1が正解みたいです。
HAMLOG本体では+1してましたが、道の駅Get'sでは+1してませんでした。
たぶん、PASCALやBASICでは大丈夫なのでしょう。
C++でも+1しなくても動くのかもしれませんが、ネット上のコードを
見ていると、strlen("文字列") + 1が多いみたいです。参考まで。

cds.dwData = 1;
lstrcpy(buffs, "JG1MOU"); // コールサイン文字列
cds.cbData = strlen(buffs) + 1; // ※文字列の長さ+1※
cds.lpData = &buffs[0]; // 文字列のポインタ
Hwnd2 = SendMessage(Hwnd1, WM_COPYDATA, (WPARAM)Form1->Handle, (LPARAM)&cds);
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: [ DXエンティテー選択 ] ウインドウ
639
2014/12/12(Fri) 07:16:21
JA2BQX 太田
こんにちは。

3 HAMLOGを最小化する。
4 最小化を元に戻す。

> CloseWindow(), ShowWindow()を呼び出すようにしてみました。

ありがとうございました。
こちらでも上記の2点の動作確認出来ました。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: [ DXエンティテー選択 ] ウインドウ
638
2014/12/11(Thu) 22:18:43
JG1MOU浜田
> > 3 HAMLOGを最小化する。
> > 4 最小化を元に戻す。
>
> 上記の2点は動作確認出来ませんでした。
> あらかじめ最小化しておいてから 4 を送っても元に戻らないです。

CloseWindow(), ShowWindow()を呼び出すようにしてみました。
http://hamlog.no.coocan.jp/mou/soft/Hamlogw.zip
こちらでは問題なく動作しています。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: [ DXエンティテー選択 ] ウインドウ
637
2014/12/11(Thu) 11:21:27
JA2BQX 太田
こんにちは。 色々とありがとうございます。

> 1 以後、DXエンティティが自動入力されなくなる。
> 2 DXエンティティ自動入力機能を元に戻す。

上記の2点は動作確認出来ました。
特に 1  は入力ウインドウのコールサインを取得してから cty.dat を使ってのエンティティ解析、 
Code、QTHの転送処理において
表示される事がある [ DXエンティテー選択 ] ウインドウを消す為に
Enterキーを押す手間もなくなりスムースに転送が出来るようになりました。



> 3 HAMLOGを最小化する。
> 4 最小化を元に戻す。

上記の2点は動作確認出来ませんでした。
あらかじめ最小化しておいてから 4 を送っても元に戻らないです。

こちらのテストの問題なのかも知れませんが、まあ当分3と4の使用予定はありません。

毎度のわがままなお願いをお聞き届けていただきありがとうございました。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop