Ich schreibe gerade zwei Anwendungen, einen Server und einen Client, die mit Hilfe von Sendmessage Daten austauschen sollen. Primär soll der Client Daten an den Server senden. Die Ermittlung der Handle des Server-Forms über den Formnamen funktioniert auch einwandfrei, aber offensichtlich werden die Messages nicht richtig gesendet. Ich sitze schon einen Tag/Nacht dran und bin hier echt verzweifelt.
Der Client soll den ersten Buchstaben aus einem Textfeld auf Knopfdruck senden. Der Server soll den Empfang anzeigen und die Daten des empfangenen "Paketes" ausgeben.
Das steht im Form des Clients:
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long
Dim DesthWnd As Long ' Holds the Process Handle
Const WM_USER As Long = &H400
Sub FindHandle()
DesthWnd = FindWindow(vbNullString, "BISERV")
If (DesthWnd = 0) Then
Call MsgBox("Window not found!", vbOKOnly + vbExclamation)
Exit Sub
End If
Call MsgBox("Handle: " & DesthWnd, vbOKOnly + vbExclamation)
End Sub
Private Sub Command1_Click()
Call FindHandle
End Sub
Private Sub Command2_Click()
Call SendText(Form1.Text1.Text)
End Sub
Private Sub SendText(t As String)
Call SendMessage(DesthWnd, WM_USER + &H101, 25555, CLng(Asc(Mid(t, 1, 1))))
End Sub Im Form des Servers steht:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long
Option Explicit
Private Sub Form_Load()
Call Init(Form1.hWnd)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call Terminate(Me.hWnd)
End Sub Im einzigen Modul des Servers befindet sich folgender Quellcode:
Private 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
Private Declare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As _
Long, ByVal dwNewLong As Long) As Long
Const GWL_WNDPROC As Long = -4&
Const WM_COPYDATA As Long = &H4A
Dim PrevWndProc As Long
Public Sub Init(hWnd As Long)
PrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, _
AddressOf WindowProc)
End Sub
Public Sub Terminate(hWnd As Long)
Call SetWindowLong(hWnd, GWL_WNDPROC, PrevWndProc)
End Sub
Private Function WindowProc(ByVal hWnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg > WM_USER + &H100 Then
Form1.Text1.Text = hWnd
Form1.Text2.Text = Msg
Form1.Text3.Text = wParam
Form1.Text4.Text = lParam
End If
WindowProc = CallWindowProc(PrevWndProc, hWnd, Msg, wParam, lParam)
End Function Es kommen viele Meldungen an, aber nicht die Meldungen mit der hohen 'Messagekennung', die vom Client stammen.
Ich hoffe, mir kann jemand sagen, wo der Fehler liegt. |