{ Joachim Deckers Anlage zur 2. Staatsexamensarbeit / 28.5.96 Include-Datei für Winsock-Meldungen an das Standardfenster In der Hauptdatei muß 1. die Prozedur VerarbeiteEreignis(EreignisCode, FehlerCode, SocketNr: Word); definiert werden, die nach dem Auftreten von Ereignissen am Socket aufgerufen wird! 2. die Prozedur InitialisiereWinsockFenster vor der ersten Ausgabe mit Read(ln) oder Write(ln) aufgerufen werden! 3. sowohl die Unit WinTypes als auch die Unit WinProcs eingebunden werden! } { Kennungen für (asynchrone) Winsock-Meldungen an das Fenster } { Kennungen, deren Einsatz ich bei WSAAsyncSelect() empfehle } const USER_READ = WM_USER + 101; { Socket hält Daten zum Lesen bereit } USER_WRITE = WM_USER + 102; { Socket ist bereit zum Schreiben von Daten } USER_OOB = WM_USER + 103; { Socket hält Out-of-Band Daten bereit zum Lesen } USER_ACCEPT = WM_USER + 104; { Socket ist bereit zum Akzeptieren einer neu beantragten Verbindung } USER_CONNECT = WM_USER + 105; { Verbindung am Socket ist erfolgt } USER_CLOSE = WM_USER + 106; { Verbindung am Socket wurde beendet } { Kennungen für die Asynchronen Varianten der gethostby...(), getprotoby...() und getservby...() - Prozeduren } USER_HOST = WM_USER + 107; USER_PROTO = WM_USER + 108; USER_SERV = WM_USER + 109; { Diese Konstante wird nur für SetzeEreignisVerarbeitung benutzt, wenn eine Prozedur zur Bearbeitung aller eingehenden Winsock-Meldungen verwendet werden soll } USER_ANY = 0; { Diese Konstanten dienen zur Festlegung der Größe des Feldes mit den Zeigern auf die Verarbeitungsprozeduren. Sie müssen angepaßt werden, wenn mehr verschiedene Meldungen zugelassen sein sollen. } USER_FIRST = USER_READ; USER_LAST = USER_SERV; var hCRTWnd : HWND; { Handle des Hauptfensters } OldWndProc : TFarProc; Procedure VerarbeiteEreignis(EreignisCode, FehlerCode, SocketNr: Word); forward; { Muß im eigenen Programm definiert werden! } procedure StandardEreignisVerarbeitung(EreignisCode, FehlerCode, SocketNr: Word); { ... wie der Name sagt. Wird aus WindowProc (s. u.) aufgerufen, wenn keine eigene Ereignisverarbeitung definiert wurde. } begin Write('- Ereignis an Socket ',SocketNr,' ('); case EreignisCode of FD_READ : Write('FD_READ'); FD_WRITE : Write('FD_WRITE'); FD_OOB : Write('FD_OOB'); FD_ACCEPT : Write('FD_ACCEPT'); FD_CONNECT: Write('FD_CONNECT'); FD_CLOSE : Write('FD_CLOSE') else Write('Typ unbekannt') end; if FehlerCode<>0 then Write('- F E H L E R'); Writeln(') wird ignoriert.'); end; function WindowProc(Window:HWnd; Message,wParam:Word; lParam:LongInt) : LongInt; export; { Diese Prozedur behandelt die Ereignisse, die aufgrund von asynchronen Datenübermittlungen über die Socket-Schnittstelle eintreten } begin if (Message>=USER_FIRST) and (Message<=USER_LAST) then begin VerarbeiteEreignis(WSAGetSelectEvent(lparam),WSAGetSelectError(lparam),wParam); end; WindowProc := CallWindowProc(OldWndProc, Window, Message, wParam, lParam); end; procedure InitialisiereWinsockFenster; var hInstance: THandle; WindowClass : TWndClass; begin { Initialisiere Fensterprozedur für das Standardfenster } { Notwendig, damit die eigene Ereignisbehandlung aktiviert wird } GetClassInfo(hInstance, 'TPWinCrt' ,WindowClass); { Klasse des Fensters besorgen } UnregisterClass('TPWinCRT', hInstance); { Löschen der Fensterklasse aus der Tabelle } OldWndProc := tFarProc(WindowClass.lpfnWndProc); { Ursprüngliche Fensterbehandlung merken } WindowClass.lpfnWndProc := @WindowProc; { Eigene Fensterbehandlung einbinden } RegisterClass(WindowClass); { Fensterklasse in die Tabelle eintragen } InitWinCrt; hCRTWnd := GetActiveWindow; end;