# Hook auf Form und WSAAsyncSelect - Anwendung friert ein



## Filone (19. März 2005)

Ich habe ein Socket erstellt und mittels WSAAsyncSelect die Events FD_ACCEPT, FD_CLOSE, FD_CONNECT, FD_READ und FD_WRITE abgefangen und mittels eines Hooks lasse ich dann Messages an meine Hauptform senden. Diese Hauptform untersucht die eingegangenen Nachrichten und wenn es eine WinSockMsg ist (Basiswert 10025) dann wird entsprechender Code angewendet.

Hier ist der Code :


```
Public Function ConnectToClient() 
	Dim lngRetConnect As Long
	Dim struct_sckAddr As sockaddr_in
	Dim lngRetSocketStart As Long
	
	With struct_sckAddr
		.sin_addr = lngLocalIP
		.sin_family = AF_INET
		.sin_port = htons(12350)
	End With
	
	lngRetSocketStart = Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
	
	lngRetConnect = connect(lngRetSocketStart, struct_sckAddr, LenB(struct_sckAddr))
	
	If lngRetConnect = SOCKET_ERROR Then
		MsgBox "No connection possible.", vbCritical, "An error occured"
	ElseIf lngRetConnect <> SOCKET_ERROR Then
		WSAAsyncSelect lngRetSocketStart, frmClient.hwnd, WINSOCKMSG, FD_ACCEPT Or FD_CLOSE Or FD_CONNECT Or FD_READ Or FD_WRITE
		lngConnectedSocket = lngRetSocketStart
		HookForm frmClient
	End If
End Function
Public Sub HookForm(F As Form)
	PrevProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnHookForm(F As Form)
	If PrevProc <> 0 Then
		SetWindowLong F.hwnd, GWL_WNDPROC, PrevProc
		PrevProc = 0
	End If
End Sub
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
	If uMsg = WINSOCKMSG Then
		ProcessMessage wParam, lParam
	Else
		WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
	End If
End Function
Public Function ProcessMessage(ByVal wParam As Long, ByVal lParam As Long)
	
	Select Case lParam
		Case FD_READ
			frmClient.lstSockMessages.AddItem "Socket has Data to read"
			GetSocketData
		Case FD_CONNECT
			frmClient.lstSockMessages.AddItem "Socket connected"
		Case FD_CLOSE
			UnHookForm frmClient
		Case FD_WRITE
			frmClient.lstSockMessages.AddItem "Socket has Data to write."
			SendDataToSocket
		Case Else
			frmClient.lstSockMessages.AddItem "Nr. " & wParam
			frmClient.lstSockMessages.AddItem lParam
		End Select
		
End Function
```

Leider friert mir meine Anwendung aber ein. Ich kann zwar noch Verbindungen eingehen und es werden auch Daten empfangen, aber ich kann die Anwendung nicht mehr beenden oder sonstwie steuern.

Weiß jemand Rat ?

Danke und liebe Grüße,

Pascal

P.S.: Ich fände es gut wenn man ein eigenes API-Forum einrichten könnte, denn dieses Thema hier passt nirgendwo so recht hin. Nur als kreativer Vorschlag...


----------

