VB6とVB.net間のSendMessageについて

解決


クロウ  2012-05-16 16:44:58  No: 103294  IP: 192.*.*.*

Vista/VB2008/VB6環境で開発しています。

VB.netからSendMessageで文字列を送り、VB6で受信させるのが目的です。

最初にネットでサンプルを見つけ、試験的にVB6同時で送信側、受信側のソフトを作り成功しました。
その後、送信側のみVB.net(2008)で別途作りました。
その結果受信側では何の反応も無く、受信できません。

問題点を教えていただけますか?


送信側VB.net
Public Class Form1
    Structure COPYDATASTRUCT
        Dim dwData As Integer
        Dim cbData As Integer
        Dim lpData As String 
    End Structure

    Public Const WM_COPYDATA As Int32 = &H4A

    Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
        (ByVal hwnd As Integer, ByVal msg As Integer, _
         ByVal wParam As Integer, ByVal lParam As COPYDATASTRUCT) As Integer

    Private Declare Function FindWindow Lib "user32.dll" Alias _
  "FindWindowA" (ByVal lpClassName As String, _
  ByVal lpWindowName As String) As IntPtr

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim sdtCOPYDATASTRUCT As COPYDATASTRUCT
        sdtCOPYDATASTRUCT.dwData = 0
        sdtCOPYDATASTRUCT.lpData = TextBox1.Text
        sdtCOPYDATASTRUCT.cbData = TextBox1.Text.Length + 1

        Dim hWndTo As Integer
        Dim l As Long
        hWndTo = FindWindow(vbNullString, "受信側フォーム名")
        If hWndTo <> 0 Then
            l = PostMessage(hWndTo, WM_COPYDATA, 0, sdtCOPYDATASTRUCT)
        End If
    End Sub
End Class


受信側VB6
'フォーム
Private Sub Form_Activate()
    Call Hook(Me.hwnd)
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Call UnHook(Me.hwnd)
End Sub

'モジュール
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = (-4)

Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Const WM_COPYDATA = &H4A

Public phWnd As Long

Public Declare Sub memcpy Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal iSize&)

Type COPYDATASTRUCT
        dwData As Long
        cbData As Long
        lpData As Long
End Type

'-------------------------------------------------------
'
'-------------------------------------------------------
Public Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Static bolWndProcCheck As Boolean
    Dim str As String
    Dim lngret As Long
    Dim sdtCOPYDATASTRUCT As COPYDATASTRUCT
    
    If Not bolWndProcCheck Then
        bolWndProcCheck = True
        Select Case uMsg
        Case WM_COPYDATA
            Call memcpy(ByVal VarPtr(sdtCOPYDATASTRUCT), ByVal lParam&, LenB(sdtCOPYDATASTRUCT))
            str = String$(sdtCOPYDATASTRUCT.cbData, vbNullChar)
            Call memcpy(ByVal str, ByVal sdtCOPYDATASTRUCT.lpData, sdtCOPYDATASTRUCT.cbData)
            Form1.Text1.Text = str
        End Select
        bolWndProcCheck = False
    End If
    WndProc = CallWindowProc(phWnd, hwnd, uMsg, wParam, lParam)
End Function

Public Sub Hook(hwnd As Long)
    phWnd = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WndProc)
End Sub

Public Sub UnHook(hwnd As Long)
    Dim lngret As Long
    If phWnd <> 0 Then
        lngret = SetWindowLong(hwnd, GWL_WNDPROC, phWnd)
    End If
End Sub

編集 削除
クロウ  2012-05-16 16:51:43  No: 103295  IP: 192.*.*.*

送信側VB.net
PostMessageはSendMessageの誤りです

編集 削除
魔界の仮面弁士  2012-05-16 20:21:26  No: 103296  IP: 192.*.*.*

> Vista/VB2008/VB6環境で開発しています。
ここは『VB2-VB6専用』の掲示板です。

混在環境でどちらの問題か判断がつかない場合は、
隣の『VB2-VB6と.NET兼用』掲示板をご利用ください。


> VB.netからSendMessageで文字列を送り、VB6で受信させるのが目的です。
> 問題点を教えていただけますか?
ここは VB6 の掲示板なので細かい指摘は控えておきますが、
最大の問題は、COPYDATASTRUCT が値渡しされている点かと。
http://www.vb-user.net/junk/replySamples/2012.05.16.20.16/WM_COPYDATA.txt


> Private Sub Button1_Click(……) Handles Button3.Click
紛らわしい名前付けは避けましょう。

編集 削除
クロウ  2012-05-17 09:03:27  No: 103297  IP: 192.*.*.*

>ここは『VB2-VB6専用』の掲示板です。
失礼しました。
検索してたまたま見つかったのでここに投稿してしまいました。
一旦閉め、再投稿させていただきます。

編集 削除