COPYDATAがやれない

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: COPYDATAがやれない

by MML » 2006年10月12日(木) 17:50

> 受信側をMainWndProcの中に書いていますか?
書いています。
> また,WM_COPYDATAを受け取った際,lParamには「COPYDATASTRUCTへのポインタ」が格納されているので,
> それ自体をStr$しても特に意味のあるものにはならないと思います。
ということは、そのままでも表示できるということでしょうか?

by イグトランス » 2006年10月11日(水) 23:51

受信側をMainWndProcの中に書いていますか?
また,WM_COPYDATAを受け取った際,lParamには「COPYDATASTRUCTへのポインタ」が格納されているので,
それ自体をStr$しても特に意味のあるものにはならないと思います。

by MML » 2006年10月11日(水) 19:28

> ああ,すみませんWM_COPYEDATAでしたね。
> これは専用の構造体を使って受け渡しする必要があります。
あ、なりました。
ありがとうございました。
それにしても専用の構造体があるとは思いもよらなかったです。
もっとGoogleとかで調べるべきでした。

lParamが取得できませんが、それはStr$でやればいいんですよね?

コード: 全て選択

SetDlgItemText(hMainWnd, Static1,Str$(lParam))
これで5はエラー(一時オブジェクトを使用しても)、4は未確認です。
BytePtrで作る必要があるのでしょうか?

by イグトランス » 2006年10月11日(水) 19:08

ああ,すみませんWM_COPYEDATAでしたね。
これは専用の構造体を使って受け渡しする必要があります。

コード: 全て選択

Type COPYDATASTRUCT
    dwData As ULONG_PTR
    cbData As DWord
    lpData As VoidPtr
End Type
こんな感じではないでしょうか。

送信側

コード: 全て選択

Dim cds As COPYDATASTRUCT
With cds
    .lpData = "Hello! I am ActiveBasicProgram!"
    .cbData = lstrlen(.lpData) + 1
End With
SendMessage(HWND_BROADCAST, WM_COPYDATA, 0, VarPtr(cds) As LPARAM)
受信側

コード: 全て選択

    'コピーデータの処理 
    If dwMsg = WM_COPYDATA Then
        Dim pcbs As *COPYDATASTRUCT
        Dim receiveText As *Byte 
        Msgbox hMainWnd,"届きました。データを表示します。" 
        pcbs = lParam As *COPYDATASTRUCT
        receiveText = pcbs->lpData
        SetDlgItemText(hMainWnd, Static1, receiveText) 
        SetDlgItemText(hMainWnd, Static2, receiveText)
        MainWndProc = TRUE
    Else 
        ' イベントプロシージャの呼び出しを行います。 
        MainWndProc=EventCall_MainWnd(hWnd, dwMsg, wParam,  lParam) 
    End If

by MML » 2006年10月11日(水) 18:30

Mario2さん、イグトランスさん、そうやって見ましたが、動きません。
というより、「届きました、、、」さえ表示されません。

なにか必要なインクルードファイルや、
メッセージの投げあいができる方法があるのでしょうか?

by イグトランス » 2006年10月10日(火) 22:38

文字列が絡む処理はABとVBの差が大きいので,VBのことはあまり参考になりません。

こうするとどうでしょうか?

送信側:

コード: 全て選択

SendMessage(HWND_BROADCAST,WM_COPYDATA,0,"Hello! I am ActiveBasicProgram!" As LPARAM) 
受信側:

コード: 全て選択


    'コピーデータの処理
    If dwMsg = WM_COPYDATA Then
        Dim hwndText As HWND, SentText As *Byte
        Msgbox hMainWnd,"届きました。データを表示します。"
        SentText = wParam As *Byte
        hwndText = GetDlgItem(hMainWnd, Static1)
        SetWindowText(htext, Send)
        hwndText = GetDlgItem(hMainWnd, Static2)
        SetWindowText(htext, Send)
    Else
        ' イベントプロシージャの呼び出しを行います。 
        MainWndProc=EventCall_MainWnd(hWnd, dwMsg, wParam,  lParam) 
    End If 

Re: COPYDATAがやれない

by Mario2 » 2006年10月10日(火) 22:17

試していないのでちゃんと動作するかわかりませんが・・・・
SendMessageStrのwParamのDWord型とlParamのBytePtr型をそれぞれWPARAM型とLPARAM型に宣言してみてはどうでしょう・・・?

改善しなさそうな気もしますが・・・・・

Re: COPYDATAがやれない

by MML » 2006年10月10日(火) 08:48

追記です。
SendMessageStrの資料のことはこちらの「WinAPIDataBase for VBProgrammer」で
調べました。
http://www.winapi-database.com/

検索で「SendMessage」で調べてください。

COPYDATAがやれない

by MML » 2006年10月10日(火) 08:38

最近COPYDATAを使って、データの投げ合いをしようと、思い以下のようなものを作ってみました。

プログラムA

コード: 全て選択

'送信側(N88BASICでもかまわない、、、と思う)
#N88BASIC
'「SendMessageA」関数はw,lParamをDWord以外で宣言してもよい、、、と
'どこかに書いてありました。
'それは、VBの資料だったんですが。。。
Declare Function SendMessageStr Lib "user32" Alias "SendMessageA" _
   (hWnd As HWND, _
    wMsg As DWord, _
    wParam As DWord, _
    lParam As BytePtr) As Long

'表示
Print "全部にw「0」l「Hello! I am ActiveBasicProgram!」送信します。"
'送信&結果表示
SendMessageStr(HWND_BROADCAST,WM_COPYDATA,0,"Hello! I am ActiveBasicProgram!")
Print "終了しました。受信側を見てください。"
プログラムB(受信側)

コード: 全て選択

'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数

Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT
	' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
	'使う変数宣言
	Dim htext As HWND
	Dim Send As String

	'コピーデータの処理
	if dwMsg=WM_COPYDATA Then
		Msgbox hMainWnd,"届きました。データを表示します。"
		htext = GetDlgItem(hMainWnd,Static1)
		Send = Str$(wParam)
		SetWindowText(htext,Send)
		htext = GetDlgItem(hMainWnd,Static2)
		Send = Str$(lParam)
		SetWindowText(htext,Send)
	End If
	' イベントプロシージャの呼び出しを行います。
	MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
あと、プログラムBは「プロジェクト」を使ってください
ウィンドウに「text」を2つ張ってください

これがうまくいきません。
どこか間違いがあればお教えください。

ページトップ