一括表示

sendmessageで受信できず 投稿者:JP7CZE 川辺 

VB6で,WM_COPYDATA.txt をもとに,Hamlogのデータ入力ウィンドウとのやり取りを行なおうとしています.

アプリケーションからの送信の場合には,コールサインの入力や保存もできているのですが,
データの読み取りがうまくできていません.

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

Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long

Function GetFromHAMLOG(Command As Long) As String

Dim cmmd As Long

Dim Hwnd1, Hwnd2, myhwnd As Long

Dim cds As COPYDATASTRUCT

Dim cbuff As String * 512

Dim X As Long

Hwnd1 = FindWindow("TThwin", vbNullString)
If Hwnd1 < 1 Then ' ハムログが起動していない
Exit Function
End If

Call AppActivate("Turbo HAMLOG", 0)

cds.dwData = Command
cds.cbData = 0
cds.lpData = vbNullString

myhwnd = FormTempLog.hwnd '作成中のプログラムのハンドル

X = SendMessage(Hwnd1, WM_COPYDATA, myhwnd, cds)

GetFromHAMLOG = cds.lpData

End Function

 これを msg = GetFromHAMLOG(112) で実行すると,本来なら,QTHのデータが帰ってくるはずですが,うまくいきません.

 SendMessageの戻り値は,0以外の数字(たとえば 10749274)が帰ってきて問題ないようです.

戻り値は,
cds.cbData : 0
cds.dwData : 112
cds.lpData : ""

となっていて,dwData は,呼び出す前のままで,0または1になっていません.

dwDataが変わっていないということは,データを受け取っていないとも思いますが,myhwndがおかしいのか,どうすればいいのか,ちょっと困っています.

よろしくご教示願います.

2014/09/06(Sat) 01:01:40  [No.563]


Re: sendmessageで受信できず 投稿者:JA2BQX 太田  《URL》  

JP7CZE 川辺さん、こんにちは。

> VB6で,WM_COPYDATA.txt をもとに,Hamlogのデータ入力ウィンドウとのやり取りを行なおうとしています.

VB2008でのサンプルソースなら私のHPにおいてありますが。

これから出かけるので簡単ですみません。

2014/09/06(Sat) 08:15:16  [No.564]


Re: sendmessageで受信できず 投稿者:JP7CZE 川辺 

JA2BQX 太田さん

> VB2008でのサンプルソースなら私のHPにおいてありますが。

了解です.
参考にさせていただきます.

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

わからないことがありましたら,また質問させてもらいます.

2014/09/06(Sat) 09:34:39  [No.565]


Re: sendmessageで受信できず 投稿者:JP7CZE 川辺 

ちょっと忙しくて手を付けてませんが,太田さんのプログラムを参考にすると,

私のプログラムで,SendMessageの定義,
Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long

で,lParamの型が,Any になっているのが原因のようです.

送信の場合には問題無かったのですが,受信の場合には受け取りがうまくいっていないのではないかと思います.

あとで,型を COPYDATASTRUCT に修正してやってみます.

2014/09/10(Wed) 10:43:56  [No.566]


Re: sendmessageで受信できず 投稿者:JA9AOB 銅子 

> データの読み取りがうまくできていません.
VBは良くわからないのですが、myhwnd のメッセージ処理にWM_COPYDAで送られてきますの、これを横取りします。VC++では
OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
でメッセージを捕捉しますがVBにも同じようなものがあるはずですが、これをやっておられますか。
message がWM_COPYDATAの時の lParam が cds のアドレスになっています。
コマンドを送るとき
X = SendMessage(Hwnd1, WM_COPYDATA, myhwnd, cds)
となっていますが、
VC++では

Result = ::SendMessage(*pWndPrev, WM_COPYDATA, (WPARAM)this->GetSafeHwnd(), (LPARAM)&cds);
cdsはアドレスで送らないといけないのですが 単に cds になっていますが、これはアプリケーションからの送信がうまくいっているのでいいのかな?。

2014/09/19(Fri) 18:30:36  [No.568]


Re: sendmessageで受信できず 投稿者:JP7CZE 川辺 

SendMessage の戻り値が,大きい数が入っているので,Hamlog の方では,正しく送出しているということで,

最初は SendMessage の cdsに戻り値が入っているのかと思っていましたが,どうやらそうではななさそう,

ということで,
OnWndMsg(......,lParam as long)

のところの分岐で,Case WM_COPYDATA を書いてチェックしたところ,
SendMessage のコマンドの直後に,この分岐にちゃんと飛んできていることがわかりました.

で,問題は,lParam をとうやってcdsのアドレスとして入れ込んで,cdsのデータを取り込むか...
太田さんのVB2008のサンプルを見ても,今一理解出来ず.Declear の部分をちゃんと見てませんでした.

そんなことで,この間,ZAChkのプログラムに関して,浜田さんとやり取りしている中で,相談したところ,
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)

を教えてもらい,一発で解決できました.

Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long

の中で,
Select Case uMsg
Case WM_COPYDATA
Dim cds As COPYDATASTRUCT
Dim buf(1 To 255) As Byte
Call CopyMemory(cds, ByVal lParam, Len(cds))

で,cdsの中身(cds.lpData)を取り出すことが出来ました.

みなさんのおかげで無事解決でき,ありがとうございました.

2014/11/17(Mon) 23:13:00  [No.621]